LIS2DH - Adding support for the new accelerometer (#216)
+ Creates a new driver for the LIS2DH accelerometer + Fixes timing issues since we're already touching a chunk of code The LIS2DH driver should output similar numbers to the old MMA accelerometer. Fixes #202 Fixes #189
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -43,3 +43,4 @@ Logo GUI/TS100 Logo Editor/TS100 Logo Editor/bin/
|
|||||||
workspace/ts100/ts100.xml
|
workspace/ts100/ts100.xml
|
||||||
workspace/ts100_old/*
|
workspace/ts100_old/*
|
||||||
*.cache
|
*.cache
|
||||||
|
workspace/TS100/.settings/language.settings.xml
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
|
||||||
<provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="-1512662983927490956" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="-1709715799185984995" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
|
||||||
<provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="-1512662983927490956" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="-1709715799185984995" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
|||||||
27
workspace/TS100/inc/LIS2DH12.hpp
Normal file
27
workspace/TS100/inc/LIS2DH12.hpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* LIS2DH12.hpp
|
||||||
|
*
|
||||||
|
* Created on: 27Feb.,2018
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIS2DH12_HPP_
|
||||||
|
#define LIS2DH12_HPP_
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "LIS2DH12_defines.hpp"
|
||||||
|
class LIS2DH12 {
|
||||||
|
public:
|
||||||
|
LIS2DH12(I2C_HandleTypeDef* i2cHandle);
|
||||||
|
void initalize();
|
||||||
|
uint8_t getOrientation();
|
||||||
|
void getAxisReadings(int16_t *x, int16_t *y, int16_t *z);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setSensitivity(uint8_t threshold, uint8_t filterTime); // Sets the sensitivity of the unit
|
||||||
|
|
||||||
|
void I2C_RegisterWrite(uint8_t reg, uint8_t data);
|
||||||
|
uint8_t I2C_RegisterRead(uint8_t reg);
|
||||||
|
I2C_HandleTypeDef* i2c;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* LIS2DH12_HPP_ */
|
||||||
28
workspace/TS100/inc/LIS2DH12_defines.hpp
Normal file
28
workspace/TS100/inc/LIS2DH12_defines.hpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* LIS2DH12_defines.hpp
|
||||||
|
*
|
||||||
|
* Created on: 27Feb.,2018
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIS2DH12_DEFINES_HPP_
|
||||||
|
#define LIS2DH12_DEFINES_HPP_
|
||||||
|
|
||||||
|
|
||||||
|
#define LIS2DH_I2C_ADDRESS (25<<1)
|
||||||
|
|
||||||
|
#define LIS_CTRL_REG1 0x20|0x80
|
||||||
|
#define LIS_CTRL_REG2 0x21|0x80
|
||||||
|
#define LIS_CTRL_REG3 0x22|0x80
|
||||||
|
#define LIS_CTRL_REG4 0x23|0x80
|
||||||
|
#define LIS_CTRL_REG5 0x24|0x80
|
||||||
|
#define LIS_CTRL_REG6 0x25|0x80
|
||||||
|
#define LIS_INT1_CFG 0xB0|0x80
|
||||||
|
#define LIS_INT2_CFG 0xB4|0x80
|
||||||
|
#define LIS_INT1_DURATION 0x33|0x80
|
||||||
|
#define LIS_INT1_THS 0x32|0x80
|
||||||
|
#define LIS_INT1_SRC 0x31|0x80
|
||||||
|
#define LIS_INT2_DURATION 0x37|0x80
|
||||||
|
#define LIS_INT2_THS 0x36|0x80
|
||||||
|
#define LIS_INT2_SRC 0x35|0x80
|
||||||
|
#endif /* LIS2DH12_DEFINES_HPP_ */
|
||||||
@@ -15,7 +15,7 @@ public:
|
|||||||
|
|
||||||
MMA8652FC(I2C_HandleTypeDef* i2cHandle);
|
MMA8652FC(I2C_HandleTypeDef* i2cHandle);
|
||||||
void initalize(); // Initalize the system
|
void initalize(); // Initalize the system
|
||||||
bool getOrientation();// Reads the I2C register and returns the orientation (true == left)
|
uint8_t getOrientation();// Reads the I2C register and returns the orientation (true == left)
|
||||||
void getAxisReadings(int16_t *x, int16_t *y, int16_t *z);
|
void getAxisReadings(int16_t *x, int16_t *y, int16_t *z);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
73
workspace/TS100/src/LIS2DH12.cpp
Normal file
73
workspace/TS100/src/LIS2DH12.cpp
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* LIS2DH12.cpp
|
||||||
|
*
|
||||||
|
* Created on: 27Feb.,2018
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LIS2DH12.hpp>
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
LIS2DH12::LIS2DH12(I2C_HandleTypeDef* i2cHandle) {
|
||||||
|
i2c = i2cHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LIS2DH12::initalize() {
|
||||||
|
I2C_RegisterWrite(LIS_CTRL_REG1, 0x17); //25Hz
|
||||||
|
I2C_RegisterWrite(LIS_CTRL_REG2, 0b00001000); //Highpass filter off
|
||||||
|
I2C_RegisterWrite(LIS_CTRL_REG3, 0b01100000); //Setup interrupt pins
|
||||||
|
I2C_RegisterWrite(LIS_CTRL_REG4, 0b00001000); //Block update mode off,HR on
|
||||||
|
I2C_RegisterWrite(LIS_CTRL_REG5, 0b00000010);
|
||||||
|
I2C_RegisterWrite(LIS_CTRL_REG6, 0b01100010);
|
||||||
|
|
||||||
|
//Basically setup the unit to run, and enable 4D orientation detection
|
||||||
|
I2C_RegisterWrite(LIS_INT2_CFG, 0b01111110); //setup for movement detection
|
||||||
|
I2C_RegisterWrite(LIS_INT2_THS, 0x28);
|
||||||
|
I2C_RegisterWrite(LIS_INT2_DURATION, 64);
|
||||||
|
I2C_RegisterWrite(LIS_INT1_CFG, 0b01111110); //setup for movement detection
|
||||||
|
I2C_RegisterWrite(LIS_INT1_THS, 0x28);
|
||||||
|
I2C_RegisterWrite(LIS_INT1_DURATION, 64);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//0=no change, 1= right handed, 2= left handed
|
||||||
|
uint8_t LIS2DH12::getOrientation() {
|
||||||
|
// 8=right handed,4=left,16=flat
|
||||||
|
//So we ignore if not 8/4
|
||||||
|
uint8_t pos = I2C_RegisterRead(LIS_INT2_SRC);
|
||||||
|
if (pos == 8)
|
||||||
|
return 1;
|
||||||
|
else if (pos == 4)
|
||||||
|
return 2;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LIS2DH12::getAxisReadings(int16_t* x, int16_t* y, int16_t* z) {
|
||||||
|
uint8_t tempArr[6];
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
while (HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, 0xA8,
|
||||||
|
I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6, 5000) != HAL_OK) {
|
||||||
|
HAL_Delay(5);
|
||||||
|
}
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
(*x) = ((uint16_t) (tempArr[1] << 8 | tempArr[0]));
|
||||||
|
(*y) = ((uint16_t) (tempArr[3] << 8 | tempArr[2]));
|
||||||
|
(*z) = ((uint16_t) (tempArr[5] << 8 | tempArr[4]));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LIS2DH12::setSensitivity(uint8_t threshold, uint8_t filterTime) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void LIS2DH12::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
|
||||||
|
|
||||||
|
HAL_I2C_Mem_Write(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data,
|
||||||
|
1, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t LIS2DH12::I2C_RegisterRead(uint8_t reg) {
|
||||||
|
uint8_t tx_data[1];
|
||||||
|
HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT,
|
||||||
|
tx_data, 1, 500);
|
||||||
|
|
||||||
|
return tx_data[0];
|
||||||
|
}
|
||||||
@@ -58,17 +58,20 @@ void MMA8652FC::setSensitivity(uint8_t threshold, uint8_t filterTime) {
|
|||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MMA8652FC::getOrientation() {
|
uint8_t MMA8652FC::getOrientation() {
|
||||||
//First read the PL_STATUS registertaskENTER_CRITICAL();
|
//First read the PL_STATUS register
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG);
|
uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG);
|
||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
plStatus >>= 1; //We don't need the up/down bit
|
if ((plStatus & 0b10000000) == 0b10000000) {
|
||||||
plStatus &= 0x03; //mask to the two lower bits
|
plStatus >>= 1; //We don't need the up/down bit
|
||||||
//0 == left handed
|
plStatus &= 0x03; //mask to the two lower bits
|
||||||
//1 == right handed
|
//0 == left handed
|
||||||
|
//1 == right handed
|
||||||
|
|
||||||
return !plStatus;
|
return plStatus==0?2:1;
|
||||||
|
} else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
void MMA8652FC::getAxisReadings(int16_t *x, int16_t *y, int16_t *z) {
|
void MMA8652FC::getAxisReadings(int16_t *x, int16_t *y, int16_t *z) {
|
||||||
uint8_t tempArr[6];
|
uint8_t tempArr[6];
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ static void MX_IWDG_Init(void) {
|
|||||||
|
|
||||||
hiwdg.Instance = IWDG;
|
hiwdg.Instance = IWDG;
|
||||||
hiwdg.Init.Prescaler = IWDG_PRESCALER_256;
|
hiwdg.Init.Prescaler = IWDG_PRESCALER_256;
|
||||||
hiwdg.Init.Reload = 4095;
|
hiwdg.Init.Reload = 50;
|
||||||
HAL_IWDG_Init(&hiwdg);
|
HAL_IWDG_Init(&hiwdg);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,13 +103,13 @@ static void printShortDescription(uint32_t shortDescIndex,
|
|||||||
|
|
||||||
static int userConfirmation(const char* message) {
|
static int userConfirmation(const char* message) {
|
||||||
uint8_t maxOffset = strlen(message) + 7;
|
uint8_t maxOffset = strlen(message) + 7;
|
||||||
uint32_t messageStart = HAL_GetTick();
|
uint32_t messageStart = xTaskGetTickCount();
|
||||||
|
|
||||||
lcd.setFont(0);
|
lcd.setFont(0);
|
||||||
lcd.setCursor(0, 0);
|
lcd.setCursor(0, 0);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int16_t messageOffset = (((HAL_GetTick() - messageStart) / 150) % maxOffset);
|
int16_t messageOffset = (((xTaskGetTickCount() - messageStart) / 15) % maxOffset);
|
||||||
|
|
||||||
lcd.clearScreen();
|
lcd.clearScreen();
|
||||||
lcd.setCursor(12 * (7 - messageOffset), 0);
|
lcd.setCursor(12 * (7 - messageOffset), 0);
|
||||||
@@ -329,7 +329,7 @@ static void settings_setResetSettings(void) {
|
|||||||
lcd.print("RESET OK");
|
lcd.print("RESET OK");
|
||||||
lcd.refresh();
|
lcd.refresh();
|
||||||
|
|
||||||
waitForButtonPressOrTimeout(2000);
|
waitForButtonPressOrTimeout(200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,12 +9,13 @@
|
|||||||
#include "stdlib.h"
|
#include "stdlib.h"
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
#include "LIS2DH12.hpp"
|
||||||
|
|
||||||
//#define I2CTest
|
|
||||||
#define ACCELDEBUG 0
|
#define ACCELDEBUG 0
|
||||||
// C++ objects
|
// C++ objects
|
||||||
OLED lcd(&hi2c1);
|
OLED lcd(&hi2c1);
|
||||||
MMA8652FC accel(&hi2c1);
|
MMA8652FC accel(&hi2c1);
|
||||||
|
LIS2DH12 accel2(&hi2c1);
|
||||||
uint8_t PCBVersion = 0;
|
uint8_t PCBVersion = 0;
|
||||||
// File local variables
|
// File local variables
|
||||||
uint16_t currentlyActiveTemperatureTarget = 0;
|
uint16_t currentlyActiveTemperatureTarget = 0;
|
||||||
@@ -46,38 +47,21 @@ int main(void) {
|
|||||||
lcd.setFont(0); // default to bigger font
|
lcd.setFont(0); // default to bigger font
|
||||||
//Testing for new weird board version
|
//Testing for new weird board version
|
||||||
uint8_t buffer[1];
|
uint8_t buffer[1];
|
||||||
if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0, 0, buffer, 1, 1000) == HAL_OK) {
|
if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1,
|
||||||
|
1000) == HAL_OK) {
|
||||||
PCBVersion = 1;
|
PCBVersion = 1;
|
||||||
accel.initalize(); // this sets up the I2C registers and loads up the default
|
accel.initalize(); // this sets up the I2C registers and loads up the default
|
||||||
// settings
|
// settings
|
||||||
} else
|
} else {
|
||||||
PCBVersion = 2;
|
PCBVersion = 2;
|
||||||
|
//Setup the ST Accelerometer
|
||||||
|
accel2.initalize(); //startup the accelerometer
|
||||||
|
}
|
||||||
HAL_IWDG_Refresh(&hiwdg);
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
restoreSettings(); // load the settings from flash
|
restoreSettings(); // load the settings from flash
|
||||||
setCalibrationOffset(systemSettings.CalibrationOffset);
|
setCalibrationOffset(systemSettings.CalibrationOffset);
|
||||||
HAL_IWDG_Refresh(&hiwdg);
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
|
|
||||||
#ifdef I2CTest
|
|
||||||
for (;;) {
|
|
||||||
//We dont load the RTOS here, and test stuff instead
|
|
||||||
//Scan all of the I2C address space and see who answers
|
|
||||||
lcd.setFont(1);
|
|
||||||
lcd.clearScreen();
|
|
||||||
if (HAL_I2C_Mem_Read(&hi2c1, 25 << 1, 0x00, 0, buffer, 1, 1000)
|
|
||||||
== HAL_OK) {
|
|
||||||
//this ID was okay
|
|
||||||
lcd.printNumber(buffer[0], 3);
|
|
||||||
lcd.print(".");
|
|
||||||
lcd.refresh();
|
|
||||||
}
|
|
||||||
for (;;) {
|
|
||||||
//hang out here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Create the thread(s) */
|
/* Create the thread(s) */
|
||||||
/* definition and creation of GUITask */
|
/* definition and creation of GUITask */
|
||||||
osThreadDef(GUITask, startGUITask, osPriorityBelowNormal, 0, 512);
|
osThreadDef(GUITask, startGUITask, osPriorityBelowNormal, 0, 512);
|
||||||
@@ -137,7 +121,7 @@ ButtonState getButtonState() {
|
|||||||
*/
|
*/
|
||||||
static uint8_t previousState = 0;
|
static uint8_t previousState = 0;
|
||||||
static uint32_t previousStateChange = 0;
|
static uint32_t previousStateChange = 0;
|
||||||
const uint16_t timeout = 400;
|
const uint16_t timeout = 40;
|
||||||
uint8_t currentState;
|
uint8_t currentState;
|
||||||
currentState = (
|
currentState = (
|
||||||
HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ?
|
HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ?
|
||||||
@@ -147,11 +131,11 @@ ButtonState getButtonState() {
|
|||||||
1 : 0) << 1;
|
1 : 0) << 1;
|
||||||
|
|
||||||
if (currentState)
|
if (currentState)
|
||||||
lastButtonTime = HAL_GetTick();
|
lastButtonTime = xTaskGetTickCount();
|
||||||
if (currentState == previousState) {
|
if (currentState == previousState) {
|
||||||
if (currentState == 0)
|
if (currentState == 0)
|
||||||
return BUTTON_NONE;
|
return BUTTON_NONE;
|
||||||
if ((HAL_GetTick() - previousStateChange) > timeout) {
|
if ((xTaskGetTickCount() - previousStateChange) > timeout) {
|
||||||
// User has been holding the button down
|
// User has been holding the button down
|
||||||
// We want to send a buttong is held message
|
// We want to send a buttong is held message
|
||||||
if (currentState == 0x01)
|
if (currentState == 0x01)
|
||||||
@@ -172,7 +156,7 @@ ButtonState getButtonState() {
|
|||||||
// User has released buttons
|
// User has released buttons
|
||||||
// If they previously had the buttons down we want to check if they were <
|
// If they previously had the buttons down we want to check if they were <
|
||||||
// long hold and trigger a press
|
// long hold and trigger a press
|
||||||
if ((HAL_GetTick() - previousStateChange) < timeout) {
|
if ((xTaskGetTickCount() - previousStateChange) < timeout) {
|
||||||
// The user didn't hold the button for long
|
// The user didn't hold the button for long
|
||||||
// So we send button press
|
// So we send button press
|
||||||
|
|
||||||
@@ -185,7 +169,7 @@ ButtonState getButtonState() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
previousState = currentState;
|
previousState = currentState;
|
||||||
previousStateChange = HAL_GetTick();
|
previousStateChange = xTaskGetTickCount();
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
return BUTTON_NONE;
|
return BUTTON_NONE;
|
||||||
@@ -208,13 +192,13 @@ static void waitForButtonPress() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void waitForButtonPressOrTimeout(uint32_t timeout) {
|
void waitForButtonPressOrTimeout(uint32_t timeout) {
|
||||||
timeout += HAL_GetTick();
|
timeout += xTaskGetTickCount();
|
||||||
// Make timeout our exit value
|
// Make timeout our exit value
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ButtonState buttons = getButtonState();
|
ButtonState buttons = getButtonState();
|
||||||
if (buttons)
|
if (buttons)
|
||||||
return;
|
return;
|
||||||
if (HAL_GetTick() > timeout)
|
if (xTaskGetTickCount() > timeout)
|
||||||
return;
|
return;
|
||||||
GUIDelay();
|
GUIDelay();
|
||||||
}
|
}
|
||||||
@@ -269,7 +253,7 @@ static void gui_drawBatteryIcon() {
|
|||||||
lcd.drawSymbol(16); // Draw the DC Logo
|
lcd.drawSymbol(16); // Draw the DC Logo
|
||||||
}
|
}
|
||||||
static void gui_solderingTempAdjust() {
|
static void gui_solderingTempAdjust() {
|
||||||
uint32_t lastChange = HAL_GetTick();
|
uint32_t lastChange = xTaskGetTickCount();
|
||||||
currentlyActiveTemperatureTarget = 0;
|
currentlyActiveTemperatureTarget = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
lcd.setCursor(0, 0);
|
lcd.setCursor(0, 0);
|
||||||
@@ -277,7 +261,7 @@ static void gui_solderingTempAdjust() {
|
|||||||
lcd.setFont(0);
|
lcd.setFont(0);
|
||||||
ButtonState buttons = getButtonState();
|
ButtonState buttons = getButtonState();
|
||||||
if (buttons)
|
if (buttons)
|
||||||
lastChange = HAL_GetTick();
|
lastChange = xTaskGetTickCount();
|
||||||
switch (buttons) {
|
switch (buttons) {
|
||||||
case BUTTON_NONE:
|
case BUTTON_NONE:
|
||||||
// stay
|
// stay
|
||||||
@@ -326,7 +310,7 @@ static void gui_solderingTempAdjust() {
|
|||||||
systemSettings.SolderingTemp = 50;
|
systemSettings.SolderingTemp = 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAL_GetTick() - lastChange > 1500)
|
if (xTaskGetTickCount() - lastChange > 200)
|
||||||
return; // exit if user just doesn't press anything for a bit
|
return; // exit if user just doesn't press anything for a bit
|
||||||
lcd.drawChar('<');
|
lcd.drawChar('<');
|
||||||
lcd.drawChar(' ');
|
lcd.drawChar(' ');
|
||||||
@@ -353,7 +337,7 @@ static void gui_settingsMenu() {
|
|||||||
lcd.clearScreen();
|
lcd.clearScreen();
|
||||||
lcd.setCursor(0, 0);
|
lcd.setCursor(0, 0);
|
||||||
|
|
||||||
if (HAL_GetTick() - lastButtonTime < 4000) {
|
if (xTaskGetTickCount() - lastButtonTime < 400) {
|
||||||
settingsMenu[currentScreen].draw.func();
|
settingsMenu[currentScreen].draw.func();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -364,11 +348,12 @@ static void gui_settingsMenu() {
|
|||||||
if (descriptionStart == 0)
|
if (descriptionStart == 0)
|
||||||
descriptionStart = HAL_GetTick();
|
descriptionStart = HAL_GetTick();
|
||||||
|
|
||||||
int16_t descriptionOffset =
|
int16_t descriptionOffset = ((((HAL_GetTick() - descriptionStart)
|
||||||
(((HAL_GetTick() - descriptionStart) / 3) % (maxOffset * 12));
|
/ 10) % (maxOffset * 3))) * 4;
|
||||||
//^ Rolling offset based on time
|
//^ Rolling offset based on time
|
||||||
lcd.setCursor(((7 * 12) - descriptionOffset), 0);
|
lcd.setCursor(((7 * 12) - descriptionOffset), 0);
|
||||||
lcd.print(settingsMenu[currentScreen].description);
|
lcd.print(settingsMenu[currentScreen].description);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ButtonState buttons = getButtonState();
|
ButtonState buttons = getButtonState();
|
||||||
@@ -392,16 +377,16 @@ static void gui_settingsMenu() {
|
|||||||
descriptionStart = 0;
|
descriptionStart = 0;
|
||||||
break;
|
break;
|
||||||
case BUTTON_F_LONG:
|
case BUTTON_F_LONG:
|
||||||
if (HAL_GetTick() - autoRepeatTimer > 200) {
|
if (xTaskGetTickCount() - autoRepeatTimer > 30) {
|
||||||
settingsMenu[currentScreen].incrementHandler.func();
|
settingsMenu[currentScreen].incrementHandler.func();
|
||||||
autoRepeatTimer = HAL_GetTick();
|
autoRepeatTimer = xTaskGetTickCount();
|
||||||
descriptionStart = 0;
|
descriptionStart = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BUTTON_B_LONG:
|
case BUTTON_B_LONG:
|
||||||
if (HAL_GetTick() - autoRepeatTimer > 200) {
|
if (xTaskGetTickCount() - autoRepeatTimer > 30) {
|
||||||
currentScreen++;
|
currentScreen++;
|
||||||
autoRepeatTimer = HAL_GetTick();
|
autoRepeatTimer = xTaskGetTickCount();
|
||||||
descriptionStart = 0;
|
descriptionStart = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -450,7 +435,7 @@ static int gui_showTipTempWarning() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (systemSettings.coolingTempBlink && tipTemp > 70) {
|
if (systemSettings.coolingTempBlink && tipTemp > 70) {
|
||||||
if (HAL_GetTick() % 500 < 250)
|
if (xTaskGetTickCount() % 50 < 25)
|
||||||
lcd.clearScreen();
|
lcd.clearScreen();
|
||||||
}
|
}
|
||||||
lcd.refresh();
|
lcd.refresh();
|
||||||
@@ -480,8 +465,8 @@ static int gui_SolderingSleepingMode() {
|
|||||||
ButtonState buttons = getButtonState();
|
ButtonState buttons = getButtonState();
|
||||||
if (buttons)
|
if (buttons)
|
||||||
return 0;
|
return 0;
|
||||||
if ((HAL_GetTick() - lastMovementTime < 1000)
|
if ((xTaskGetTickCount() - lastMovementTime < 100)
|
||||||
|| (HAL_GetTick() - lastButtonTime < 1000))
|
|| (xTaskGetTickCount() - lastButtonTime < 100))
|
||||||
return 0; // user moved or pressed a button, go back to soldering
|
return 0; // user moved or pressed a button, go back to soldering
|
||||||
if (checkVoltageForExit())
|
if (checkVoltageForExit())
|
||||||
return 1; // return non-zero on error
|
return 1; // return non-zero on error
|
||||||
@@ -532,8 +517,8 @@ static int gui_SolderingSleepingMode() {
|
|||||||
}
|
}
|
||||||
if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0
|
if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0
|
||||||
if (lastMovementTime)
|
if (lastMovementTime)
|
||||||
if (((uint32_t) (HAL_GetTick() - lastMovementTime))
|
if (((uint32_t) (xTaskGetTickCount() - lastMovementTime))
|
||||||
> (uint32_t) (systemSettings.ShutdownTime * 60 * 1000)) {
|
> (uint32_t) (systemSettings.ShutdownTime * 60 * 100)) {
|
||||||
// shutdown
|
// shutdown
|
||||||
currentlyActiveTemperatureTarget = 0;
|
currentlyActiveTemperatureTarget = 0;
|
||||||
return 1; // we want to exit soldering mode
|
return 1; // we want to exit soldering mode
|
||||||
@@ -560,9 +545,9 @@ static void gui_solderingMode() {
|
|||||||
bool boostModeOn = false;
|
bool boostModeOn = false;
|
||||||
uint32_t sleepThres = 0;
|
uint32_t sleepThres = 0;
|
||||||
if (systemSettings.SleepTime < 6)
|
if (systemSettings.SleepTime < 6)
|
||||||
sleepThres = systemSettings.SleepTime * 10 * 1000;
|
sleepThres = systemSettings.SleepTime * 10 * 100;
|
||||||
else
|
else
|
||||||
sleepThres = (systemSettings.SleepTime - 5) * 60 * 1000;
|
sleepThres = (systemSettings.SleepTime - 5) * 60 * 100;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
uint16_t tipTemp = getTipRawTemp(0);
|
uint16_t tipTemp = getTipRawTemp(0);
|
||||||
|
|
||||||
@@ -685,8 +670,8 @@ static void gui_solderingMode() {
|
|||||||
|
|
||||||
lcd.refresh();
|
lcd.refresh();
|
||||||
if (systemSettings.sensitivity)
|
if (systemSettings.sensitivity)
|
||||||
if (HAL_GetTick() - lastMovementTime > sleepThres
|
if (xTaskGetTickCount() - lastMovementTime > sleepThres
|
||||||
&& HAL_GetTick() - lastButtonTime > sleepThres) {
|
&& xTaskGetTickCount() - lastButtonTime > sleepThres) {
|
||||||
if (gui_SolderingSleepingMode()) {
|
if (gui_SolderingSleepingMode()) {
|
||||||
return; // If the function returns non-0 then exit
|
return; // If the function returns non-0 then exit
|
||||||
}
|
}
|
||||||
@@ -735,14 +720,24 @@ void startGUITask(void const *argument) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (showBootLogoIfavailable())
|
uint32_t ticks = xTaskGetTickCount();
|
||||||
waitForButtonPressOrTimeout(2000);
|
ticks += 400; //4 seconds
|
||||||
|
while (xTaskGetTickCount() < ticks) {
|
||||||
|
if (showBootLogoIfavailable() == false)
|
||||||
|
ticks = xTaskGetTickCount();
|
||||||
|
ButtonState buttons = getButtonState();
|
||||||
|
if (buttons)
|
||||||
|
ticks = xTaskGetTickCount();
|
||||||
|
GUIDelay();
|
||||||
|
}
|
||||||
|
|
||||||
HAL_IWDG_Refresh(&hiwdg);
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
if (systemSettings.autoStartMode) {
|
if (systemSettings.autoStartMode) {
|
||||||
// jump directly to the autostart mode
|
// jump directly to the autostart mode
|
||||||
if (systemSettings.autoStartMode == 1)
|
if (systemSettings.autoStartMode == 1)
|
||||||
gui_solderingMode();
|
gui_solderingMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ACCELDEBUG
|
#if ACCELDEBUG
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -751,7 +746,6 @@ void startGUITask(void const *argument) {
|
|||||||
}
|
}
|
||||||
//^ Kept here for a way to block this thread
|
//^ Kept here for a way to block this thread
|
||||||
#endif
|
#endif
|
||||||
//Show warning : No accel
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ButtonState buttons = getButtonState();
|
ButtonState buttons = getButtonState();
|
||||||
@@ -804,11 +798,11 @@ void startGUITask(void const *argument) {
|
|||||||
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
|
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
|
||||||
if (tipTemp > 50)
|
if (tipTemp > 50)
|
||||||
if (systemSettings.sensitivity) {
|
if (systemSettings.sensitivity) {
|
||||||
if ((HAL_GetTick() - lastMovementTime) > 60000
|
if ((xTaskGetTickCount() - lastMovementTime) > 6000
|
||||||
&& (HAL_GetTick() - lastButtonTime) > 60000)
|
&& (xTaskGetTickCount() - lastButtonTime) > 6000)
|
||||||
lcd.displayOnOff(false); // turn lcd off when no movement
|
lcd.displayOnOff(false); // turn lcd off when no movement
|
||||||
else if (HAL_GetTick() - lastMovementTime < 1000
|
else if (xTaskGetTickCount() - lastMovementTime < 100
|
||||||
|| HAL_GetTick() - lastButtonTime < 1000) /*Use short time for test, and prevent lots of I2C
|
|| xTaskGetTickCount() - lastButtonTime < 100) /*Use short time for test, and prevent lots of I2C
|
||||||
writes for no need*/
|
writes for no need*/
|
||||||
lcd.displayOnOff(true); // turn lcd back on
|
lcd.displayOnOff(true); // turn lcd back on
|
||||||
}
|
}
|
||||||
@@ -950,15 +944,7 @@ void startPIDTask(void const *argument) {
|
|||||||
#define MOVFilter 8
|
#define MOVFilter 8
|
||||||
void startMOVTask(void const *argument) {
|
void startMOVTask(void const *argument) {
|
||||||
osDelay(4000); // wait for accel to stabilize
|
osDelay(4000); // wait for accel to stabilize
|
||||||
if (PCBVersion == 2) {
|
|
||||||
//on PCB rev 2, accel does not work yet.
|
|
||||||
//So trigger wakeup timer events so the iron doesnt randomly sleep on people
|
|
||||||
for (;;) {
|
|
||||||
osDelay(1000);
|
|
||||||
lastMovementTime = HAL_GetTick();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
int16_t datax[MOVFilter];
|
int16_t datax[MOVFilter];
|
||||||
int16_t datay[MOVFilter];
|
int16_t datay[MOVFilter];
|
||||||
int16_t dataz[MOVFilter];
|
int16_t dataz[MOVFilter];
|
||||||
@@ -977,7 +963,10 @@ void startMOVTask(void const *argument) {
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
int32_t threshold = 1200 + (9 * 200);
|
int32_t threshold = 1200 + (9 * 200);
|
||||||
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
|
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
|
||||||
accel.getAxisReadings(&tx, &ty, &tz);
|
if (PCBVersion == 2)
|
||||||
|
accel2.getAxisReadings(&tx, &ty, &tz);
|
||||||
|
else
|
||||||
|
accel.getAxisReadings(&tx, &ty, &tz);
|
||||||
|
|
||||||
datax[currentPointer] = (int32_t) tx;
|
datax[currentPointer] = (int32_t) tx;
|
||||||
datay[currentPointer] = (int32_t) ty;
|
datay[currentPointer] = (int32_t) ty;
|
||||||
@@ -997,18 +986,19 @@ void startMOVTask(void const *argument) {
|
|||||||
avgz /= MOVFilter;
|
avgz /= MOVFilter;
|
||||||
lcd.setFont(1);
|
lcd.setFont(1);
|
||||||
lcd.setCursor(0, 0);
|
lcd.setCursor(0, 0);
|
||||||
lcd.printNumber(abs(avgx - (int32_t)tx), 5);
|
lcd.printNumber(abs(avgx - (int32_t) tx), 5);
|
||||||
lcd.print(" ");
|
lcd.print(" ");
|
||||||
lcd.printNumber(abs(avgy - (int32_t)ty), 5);
|
lcd.printNumber(abs(avgy - (int32_t) ty), 5);
|
||||||
if ((abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz)) > max)
|
if ((abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz)) > max)
|
||||||
max = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
|
max = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
|
||||||
lcd.setCursor(0, 8);
|
lcd.setCursor(0, 8);
|
||||||
lcd.printNumber(max, 5);
|
lcd.printNumber(max, 5);
|
||||||
lcd.print(" ");
|
lcd.print(" ");
|
||||||
|
|
||||||
lcd.printNumber((abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz)), 5);
|
lcd.printNumber((abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz)), 5);
|
||||||
lcd.refresh();
|
lcd.refresh();
|
||||||
if (HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET) max = 0;
|
if (HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET)
|
||||||
|
max = 0;
|
||||||
#endif
|
#endif
|
||||||
// Only run the actual processing if the sensitivity is set (aka we are
|
// Only run the actual processing if the sensitivity is set (aka we are
|
||||||
// enabled)
|
// enabled)
|
||||||
@@ -1029,7 +1019,7 @@ void startMOVTask(void const *argument) {
|
|||||||
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
|
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
|
||||||
// If error has occured then we update the tick timer
|
// If error has occured then we update the tick timer
|
||||||
if (error > threshold) {
|
if (error > threshold) {
|
||||||
lastMovementTime = HAL_GetTick();
|
lastMovementTime = xTaskGetTickCount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1056,43 +1046,23 @@ void startRotationTask(void const *argument) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
osDelay(500); // wait for accel to stabilize
|
osDelay(500); // wait for accel to stabilize
|
||||||
if (PCBVersion == 2) {
|
|
||||||
//Accelerometer not supported yet
|
|
||||||
//Disable this feature for now :(
|
|
||||||
for (;;) {
|
|
||||||
osDelay(1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
|
|
||||||
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
|
|
||||||
//^ We hold off enabling these until now to ensure the semaphore is available
|
|
||||||
// to be used first
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (xSemaphoreTake(rotationChangedSemaphore, portMAX_DELAY) == pdTRUE
|
|
||||||
|| (HAL_GPIO_ReadPin(INT_Orientation_GPIO_Port,
|
|
||||||
INT_Orientation_Pin) == GPIO_PIN_RESET)) {
|
|
||||||
// a rotation event has occured
|
|
||||||
bool rotation = accel.getOrientation();
|
|
||||||
if (systemSettings.OrientationMode == 2)
|
|
||||||
lcd.setRotation(rotation); // link the data through
|
|
||||||
}
|
|
||||||
osDelay(300);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handler called by HAL when a EXTI occurs, but after IRQ bit is cleared
|
// a rotation event has occurred
|
||||||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
uint8_t rotation;
|
||||||
static signed long xHigherPriorityTaskWoken;
|
if (PCBVersion == 2) {
|
||||||
if (GPIO_Pin == INT_Orientation_Pin) {
|
rotation = accel2.getOrientation();
|
||||||
xSemaphoreGiveFromISR(rotationChangedSemaphore,
|
} else {
|
||||||
&xHigherPriorityTaskWoken);
|
rotation = accel.getOrientation();
|
||||||
} else if (GPIO_Pin == INT_Movement_Pin) {
|
}
|
||||||
// New data is available for reading from the unit
|
if (systemSettings.OrientationMode == 2) {
|
||||||
// xSemaphoreGiveFromISR(accelDataAvailableSemaphore,
|
if (rotation != 0) {
|
||||||
// &xHigherPriorityTaskWoken);
|
lcd.setRotation(rotation == 2); // link the data through
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
osDelay(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user