1
0
forked from me/IronOS

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:
Ben V. Brown
2018-03-03 15:43:10 +11:00
committed by GitHub
parent 3ce0cc0d99
commit aef8f5f5bb
10 changed files with 221 additions and 119 deletions

1
.gitignore vendored
View File

@@ -43,3 +43,4 @@ Logo GUI/TS100 Logo Editor/TS100 Logo Editor/bin/
workspace/ts100/ts100.xml
workspace/ts100_old/*
*.cache
workspace/TS100/.settings/language.settings.xml

View File

@@ -6,7 +6,7 @@
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" 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 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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -18,7 +18,7 @@
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" 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 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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

View 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_ */

View 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_ */

View File

@@ -15,7 +15,7 @@ public:
MMA8652FC(I2C_HandleTypeDef* i2cHandle);
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);
private:

View 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];
}

View File

@@ -58,17 +58,20 @@ void MMA8652FC::setSensitivity(uint8_t threshold, uint8_t filterTime) {
taskEXIT_CRITICAL();
}
bool MMA8652FC::getOrientation() {
//First read the PL_STATUS registertaskENTER_CRITICAL();
uint8_t MMA8652FC::getOrientation() {
//First read the PL_STATUS register
taskENTER_CRITICAL();
uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG);
taskEXIT_CRITICAL();
plStatus >>= 1; //We don't need the up/down bit
plStatus &= 0x03; //mask to the two lower bits
//0 == left handed
//1 == right handed
if ((plStatus & 0b10000000) == 0b10000000) {
plStatus >>= 1; //We don't need the up/down bit
plStatus &= 0x03; //mask to the two lower bits
//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) {
uint8_t tempArr[6];

View File

@@ -165,7 +165,7 @@ static void MX_IWDG_Init(void) {
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_256;
hiwdg.Init.Reload = 4095;
hiwdg.Init.Reload = 50;
HAL_IWDG_Init(&hiwdg);
}

View File

@@ -103,13 +103,13 @@ static void printShortDescription(uint32_t shortDescIndex,
static int userConfirmation(const char* message) {
uint8_t maxOffset = strlen(message) + 7;
uint32_t messageStart = HAL_GetTick();
uint32_t messageStart = xTaskGetTickCount();
lcd.setFont(0);
lcd.setCursor(0, 0);
for (;;) {
int16_t messageOffset = (((HAL_GetTick() - messageStart) / 150) % maxOffset);
int16_t messageOffset = (((xTaskGetTickCount() - messageStart) / 15) % maxOffset);
lcd.clearScreen();
lcd.setCursor(12 * (7 - messageOffset), 0);
@@ -329,7 +329,7 @@ static void settings_setResetSettings(void) {
lcd.print("RESET OK");
lcd.refresh();
waitForButtonPressOrTimeout(2000);
waitForButtonPressOrTimeout(200);
}
}

View File

@@ -9,12 +9,13 @@
#include "stdlib.h"
#include "stm32f1xx_hal.h"
#include "string.h"
#include "LIS2DH12.hpp"
//#define I2CTest
#define ACCELDEBUG 0
// C++ objects
OLED lcd(&hi2c1);
MMA8652FC accel(&hi2c1);
LIS2DH12 accel2(&hi2c1);
uint8_t PCBVersion = 0;
// File local variables
uint16_t currentlyActiveTemperatureTarget = 0;
@@ -46,38 +47,21 @@ int main(void) {
lcd.setFont(0); // default to bigger font
//Testing for new weird board version
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;
accel.initalize(); // this sets up the I2C registers and loads up the default
// settings
} else
} else {
PCBVersion = 2;
//Setup the ST Accelerometer
accel2.initalize(); //startup the accelerometer
}
HAL_IWDG_Refresh(&hiwdg);
restoreSettings(); // load the settings from flash
setCalibrationOffset(systemSettings.CalibrationOffset);
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) */
/* definition and creation of GUITask */
osThreadDef(GUITask, startGUITask, osPriorityBelowNormal, 0, 512);
@@ -137,7 +121,7 @@ ButtonState getButtonState() {
*/
static uint8_t previousState = 0;
static uint32_t previousStateChange = 0;
const uint16_t timeout = 400;
const uint16_t timeout = 40;
uint8_t currentState;
currentState = (
HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ?
@@ -147,11 +131,11 @@ ButtonState getButtonState() {
1 : 0) << 1;
if (currentState)
lastButtonTime = HAL_GetTick();
lastButtonTime = xTaskGetTickCount();
if (currentState == previousState) {
if (currentState == 0)
return BUTTON_NONE;
if ((HAL_GetTick() - previousStateChange) > timeout) {
if ((xTaskGetTickCount() - previousStateChange) > timeout) {
// User has been holding the button down
// We want to send a buttong is held message
if (currentState == 0x01)
@@ -172,7 +156,7 @@ ButtonState getButtonState() {
// User has released buttons
// If they previously had the buttons down we want to check if they were <
// long hold and trigger a press
if ((HAL_GetTick() - previousStateChange) < timeout) {
if ((xTaskGetTickCount() - previousStateChange) < timeout) {
// The user didn't hold the button for long
// So we send button press
@@ -185,7 +169,7 @@ ButtonState getButtonState() {
}
}
previousState = currentState;
previousStateChange = HAL_GetTick();
previousStateChange = xTaskGetTickCount();
return retVal;
}
return BUTTON_NONE;
@@ -208,13 +192,13 @@ static void waitForButtonPress() {
}
void waitForButtonPressOrTimeout(uint32_t timeout) {
timeout += HAL_GetTick();
timeout += xTaskGetTickCount();
// Make timeout our exit value
for (;;) {
ButtonState buttons = getButtonState();
if (buttons)
return;
if (HAL_GetTick() > timeout)
if (xTaskGetTickCount() > timeout)
return;
GUIDelay();
}
@@ -269,7 +253,7 @@ static void gui_drawBatteryIcon() {
lcd.drawSymbol(16); // Draw the DC Logo
}
static void gui_solderingTempAdjust() {
uint32_t lastChange = HAL_GetTick();
uint32_t lastChange = xTaskGetTickCount();
currentlyActiveTemperatureTarget = 0;
for (;;) {
lcd.setCursor(0, 0);
@@ -277,7 +261,7 @@ static void gui_solderingTempAdjust() {
lcd.setFont(0);
ButtonState buttons = getButtonState();
if (buttons)
lastChange = HAL_GetTick();
lastChange = xTaskGetTickCount();
switch (buttons) {
case BUTTON_NONE:
// stay
@@ -326,7 +310,7 @@ static void gui_solderingTempAdjust() {
systemSettings.SolderingTemp = 50;
}
if (HAL_GetTick() - lastChange > 1500)
if (xTaskGetTickCount() - lastChange > 200)
return; // exit if user just doesn't press anything for a bit
lcd.drawChar('<');
lcd.drawChar(' ');
@@ -353,7 +337,7 @@ static void gui_settingsMenu() {
lcd.clearScreen();
lcd.setCursor(0, 0);
if (HAL_GetTick() - lastButtonTime < 4000) {
if (xTaskGetTickCount() - lastButtonTime < 400) {
settingsMenu[currentScreen].draw.func();
} else {
@@ -364,11 +348,12 @@ static void gui_settingsMenu() {
if (descriptionStart == 0)
descriptionStart = HAL_GetTick();
int16_t descriptionOffset =
(((HAL_GetTick() - descriptionStart) / 3) % (maxOffset * 12));
int16_t descriptionOffset = ((((HAL_GetTick() - descriptionStart)
/ 10) % (maxOffset * 3))) * 4;
//^ Rolling offset based on time
lcd.setCursor(((7 * 12) - descriptionOffset), 0);
lcd.print(settingsMenu[currentScreen].description);
}
ButtonState buttons = getButtonState();
@@ -392,16 +377,16 @@ static void gui_settingsMenu() {
descriptionStart = 0;
break;
case BUTTON_F_LONG:
if (HAL_GetTick() - autoRepeatTimer > 200) {
if (xTaskGetTickCount() - autoRepeatTimer > 30) {
settingsMenu[currentScreen].incrementHandler.func();
autoRepeatTimer = HAL_GetTick();
autoRepeatTimer = xTaskGetTickCount();
descriptionStart = 0;
}
break;
case BUTTON_B_LONG:
if (HAL_GetTick() - autoRepeatTimer > 200) {
if (xTaskGetTickCount() - autoRepeatTimer > 30) {
currentScreen++;
autoRepeatTimer = HAL_GetTick();
autoRepeatTimer = xTaskGetTickCount();
descriptionStart = 0;
}
break;
@@ -450,7 +435,7 @@ static int gui_showTipTempWarning() {
}
}
if (systemSettings.coolingTempBlink && tipTemp > 70) {
if (HAL_GetTick() % 500 < 250)
if (xTaskGetTickCount() % 50 < 25)
lcd.clearScreen();
}
lcd.refresh();
@@ -480,8 +465,8 @@ static int gui_SolderingSleepingMode() {
ButtonState buttons = getButtonState();
if (buttons)
return 0;
if ((HAL_GetTick() - lastMovementTime < 1000)
|| (HAL_GetTick() - lastButtonTime < 1000))
if ((xTaskGetTickCount() - lastMovementTime < 100)
|| (xTaskGetTickCount() - lastButtonTime < 100))
return 0; // user moved or pressed a button, go back to soldering
if (checkVoltageForExit())
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 (lastMovementTime)
if (((uint32_t) (HAL_GetTick() - lastMovementTime))
> (uint32_t) (systemSettings.ShutdownTime * 60 * 1000)) {
if (((uint32_t) (xTaskGetTickCount() - lastMovementTime))
> (uint32_t) (systemSettings.ShutdownTime * 60 * 100)) {
// shutdown
currentlyActiveTemperatureTarget = 0;
return 1; // we want to exit soldering mode
@@ -560,9 +545,9 @@ static void gui_solderingMode() {
bool boostModeOn = false;
uint32_t sleepThres = 0;
if (systemSettings.SleepTime < 6)
sleepThres = systemSettings.SleepTime * 10 * 1000;
sleepThres = systemSettings.SleepTime * 10 * 100;
else
sleepThres = (systemSettings.SleepTime - 5) * 60 * 1000;
sleepThres = (systemSettings.SleepTime - 5) * 60 * 100;
for (;;) {
uint16_t tipTemp = getTipRawTemp(0);
@@ -685,8 +670,8 @@ static void gui_solderingMode() {
lcd.refresh();
if (systemSettings.sensitivity)
if (HAL_GetTick() - lastMovementTime > sleepThres
&& HAL_GetTick() - lastButtonTime > sleepThres) {
if (xTaskGetTickCount() - lastMovementTime > sleepThres
&& xTaskGetTickCount() - lastButtonTime > sleepThres) {
if (gui_SolderingSleepingMode()) {
return; // If the function returns non-0 then exit
}
@@ -735,14 +720,24 @@ void startGUITask(void const *argument) {
default:
break;
}
if (showBootLogoIfavailable())
waitForButtonPressOrTimeout(2000);
uint32_t ticks = xTaskGetTickCount();
ticks += 400; //4 seconds
while (xTaskGetTickCount() < ticks) {
if (showBootLogoIfavailable() == false)
ticks = xTaskGetTickCount();
ButtonState buttons = getButtonState();
if (buttons)
ticks = xTaskGetTickCount();
GUIDelay();
}
HAL_IWDG_Refresh(&hiwdg);
if (systemSettings.autoStartMode) {
// jump directly to the autostart mode
if (systemSettings.autoStartMode == 1)
gui_solderingMode();
}
#if ACCELDEBUG
for (;;) {
@@ -751,7 +746,6 @@ void startGUITask(void const *argument) {
}
//^ Kept here for a way to block this thread
#endif
//Show warning : No accel
for (;;) {
ButtonState buttons = getButtonState();
@@ -804,11 +798,11 @@ void startGUITask(void const *argument) {
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
if (tipTemp > 50)
if (systemSettings.sensitivity) {
if ((HAL_GetTick() - lastMovementTime) > 60000
&& (HAL_GetTick() - lastButtonTime) > 60000)
if ((xTaskGetTickCount() - lastMovementTime) > 6000
&& (xTaskGetTickCount() - lastButtonTime) > 6000)
lcd.displayOnOff(false); // turn lcd off when no movement
else if (HAL_GetTick() - lastMovementTime < 1000
|| HAL_GetTick() - lastButtonTime < 1000) /*Use short time for test, and prevent lots of I2C
else if (xTaskGetTickCount() - lastMovementTime < 100
|| xTaskGetTickCount() - lastButtonTime < 100) /*Use short time for test, and prevent lots of I2C
writes for no need*/
lcd.displayOnOff(true); // turn lcd back on
}
@@ -950,15 +944,7 @@ void startPIDTask(void const *argument) {
#define MOVFilter 8
void startMOVTask(void const *argument) {
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 datay[MOVFilter];
int16_t dataz[MOVFilter];
@@ -977,7 +963,10 @@ void startMOVTask(void const *argument) {
for (;;) {
int32_t threshold = 1200 + (9 * 200);
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;
datay[currentPointer] = (int32_t) ty;
@@ -997,18 +986,19 @@ void startMOVTask(void const *argument) {
avgz /= MOVFilter;
lcd.setFont(1);
lcd.setCursor(0, 0);
lcd.printNumber(abs(avgx - (int32_t)tx), 5);
lcd.printNumber(abs(avgx - (int32_t) tx), 5);
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)
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.printNumber(max, 5);
lcd.print(" ");
lcd.printNumber((abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz)), 5);
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
// Only run the actual processing if the sensitivity is set (aka we are
// enabled)
@@ -1029,7 +1019,7 @@ void startMOVTask(void const *argument) {
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
// If error has occured then we update the tick timer
if (error > threshold) {
lastMovementTime = HAL_GetTick();
lastMovementTime = xTaskGetTickCount();
}
}
@@ -1056,43 +1046,23 @@ void startRotationTask(void const *argument) {
break;
}
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 (;;) {
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
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
static signed long xHigherPriorityTaskWoken;
if (GPIO_Pin == INT_Orientation_Pin) {
xSemaphoreGiveFromISR(rotationChangedSemaphore,
&xHigherPriorityTaskWoken);
} else if (GPIO_Pin == INT_Movement_Pin) {
// New data is available for reading from the unit
// xSemaphoreGiveFromISR(accelDataAvailableSemaphore,
// &xHigherPriorityTaskWoken);
// a rotation event has occurred
uint8_t rotation;
if (PCBVersion == 2) {
rotation = accel2.getOrientation();
} else {
rotation = accel.getOrientation();
}
if (systemSettings.OrientationMode == 2) {
if (rotation != 0) {
lcd.setRotation(rotation == 2); // link the data through
}
}
osDelay(500);
}
}