mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Add more F support, protect I2C on accel2 orientation
This commit is contained in:
@@ -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="3703734836139458" 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="1750838549288477430" 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="3703734836139458" 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="1750838549288477430" 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>
|
||||||
|
|||||||
@@ -33,7 +33,9 @@ void LIS2DH12::initalize() {
|
|||||||
uint8_t LIS2DH12::getOrientation() {
|
uint8_t LIS2DH12::getOrientation() {
|
||||||
// 8=right handed,4=left,16=flat
|
// 8=right handed,4=left,16=flat
|
||||||
//So we ignore if not 8/4
|
//So we ignore if not 8/4
|
||||||
|
taskENTER_CRITICAL();
|
||||||
uint8_t pos = I2C_RegisterRead(LIS_INT2_SRC);
|
uint8_t pos = I2C_RegisterRead(LIS_INT2_SRC);
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
if (pos == 8)
|
if (pos == 8)
|
||||||
return 1;
|
return 1;
|
||||||
else if (pos == 4)
|
else if (pos == 4)
|
||||||
@@ -59,7 +61,6 @@ void LIS2DH12::setSensitivity(uint8_t threshold, uint8_t filterTime) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LIS2DH12::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
|
void LIS2DH12::I2C_RegisterWrite(uint8_t reg, uint8_t data) {
|
||||||
|
|
||||||
HAL_I2C_Mem_Write(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data,
|
HAL_I2C_Mem_Write(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data,
|
||||||
1, 500);
|
1, 500);
|
||||||
}
|
}
|
||||||
@@ -68,6 +69,5 @@ uint8_t LIS2DH12::I2C_RegisterRead(uint8_t reg) {
|
|||||||
uint8_t tx_data[1];
|
uint8_t tx_data[1];
|
||||||
HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT,
|
HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT,
|
||||||
tx_data, 1, 500);
|
tx_data, 1, 500);
|
||||||
|
|
||||||
return tx_data[0];
|
return tx_data[0];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ void Setup_HAL() {
|
|||||||
MX_TIM2_Init();
|
MX_TIM2_Init();
|
||||||
MX_IWDG_Init();
|
MX_IWDG_Init();
|
||||||
|
|
||||||
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) ADCReadings, 64);
|
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) ADCReadings, 64);//start DMA of normal readings
|
||||||
HAL_ADCEx_InjectedStart(&hadc1); //enable injected readings
|
HAL_ADCEx_InjectedStart(&hadc1); //enable injected readings
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +252,7 @@ static void MX_TIM2_Init(void) {
|
|||||||
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
|
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
|
||||||
|
|
||||||
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
sConfigOC.Pulse = 117;
|
sConfigOC.Pulse = 118;
|
||||||
/*
|
/*
|
||||||
* It takes 4 milliseconds for output to be stable after PWM turns off.
|
* It takes 4 milliseconds for output to be stable after PWM turns off.
|
||||||
* Assume ADC samples in 0.5ms
|
* Assume ADC samples in 0.5ms
|
||||||
|
|||||||
@@ -285,9 +285,16 @@ static void settings_displayInputVRange(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void settings_setSleepTemp(void) {
|
static void settings_setSleepTemp(void) {
|
||||||
systemSettings.SleepTemp += 10;
|
//If in C, 10 deg, if in F 20 deg
|
||||||
if (systemSettings.SleepTemp > 300)
|
if (systemSettings.temperatureInF) {
|
||||||
systemSettings.SleepTemp = 50;
|
systemSettings.SleepTemp += 20;
|
||||||
|
if (systemSettings.SleepTemp > 580)
|
||||||
|
systemSettings.SleepTemp = 120;
|
||||||
|
} else {
|
||||||
|
systemSettings.SleepTemp += 10;
|
||||||
|
if (systemSettings.SleepTemp > 300)
|
||||||
|
systemSettings.SleepTemp = 50;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void settings_displaySleepTemp(void) {
|
static void settings_displaySleepTemp(void) {
|
||||||
@@ -339,6 +346,22 @@ static void settings_displayShutdownTime(void) {
|
|||||||
|
|
||||||
static void settings_setTempF(void) {
|
static void settings_setTempF(void) {
|
||||||
systemSettings.temperatureInF = !systemSettings.temperatureInF;
|
systemSettings.temperatureInF = !systemSettings.temperatureInF;
|
||||||
|
if (systemSettings.temperatureInF) {
|
||||||
|
//Change sleep, boost and soldering temps to the F equiv
|
||||||
|
//C to F == F= ( (C*9) +160)/5
|
||||||
|
systemSettings.BoostTemp = ((systemSettings.BoostTemp * 9) + 160) / 5;
|
||||||
|
systemSettings.SolderingTemp =
|
||||||
|
((systemSettings.SolderingTemp * 9) + 160) / 5;
|
||||||
|
systemSettings.SleepTemp = ((systemSettings.SleepTemp * 9) + 160) / 5;
|
||||||
|
} else {
|
||||||
|
//Change sleep, boost and soldering temps to the C equiv
|
||||||
|
// F->C == C = ((F-32)*5)/9
|
||||||
|
systemSettings.BoostTemp = ((systemSettings.BoostTemp - 32) * 5) / 9;
|
||||||
|
systemSettings.SolderingTemp = ((systemSettings.SolderingTemp - 32) * 5)
|
||||||
|
/ 9;
|
||||||
|
systemSettings.SleepTemp = ((systemSettings.SleepTemp - 32) * 5) / 9;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void settings_displayTempF(void) {
|
static void settings_displayTempF(void) {
|
||||||
@@ -438,12 +461,14 @@ static void settings_displayBoostModeEnabled(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void settings_setBoostTemp(void) {
|
static void settings_setBoostTemp(void) {
|
||||||
systemSettings.BoostTemp += 10; // Go up 10 at a time
|
|
||||||
if (systemSettings.temperatureInF) {
|
if (systemSettings.temperatureInF) {
|
||||||
|
systemSettings.BoostTemp += 20; // Go up 20F at a time
|
||||||
if (systemSettings.BoostTemp > 850) {
|
if (systemSettings.BoostTemp > 850) {
|
||||||
systemSettings.BoostTemp = 480; // loop back at 250
|
systemSettings.BoostTemp = 480; // loop back at 250
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
systemSettings.BoostTemp += 10; // Go up 10C at a time
|
||||||
if (systemSettings.BoostTemp > 450) {
|
if (systemSettings.BoostTemp > 450) {
|
||||||
systemSettings.BoostTemp = 250; // loop back at 250
|
systemSettings.BoostTemp = 250; // loop back at 250
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ uint16_t getTipInstantTemperature() {
|
|||||||
uint16_t getTipRawTemp(uint8_t instant) {
|
uint16_t getTipRawTemp(uint8_t instant) {
|
||||||
#define filterDepth1 1
|
#define filterDepth1 1
|
||||||
/*Pre filter used before PID*/
|
/*Pre filter used before PID*/
|
||||||
#define filterDepth2 32
|
#define filterDepth2 64
|
||||||
/*Post filter used for UI display*/
|
/*Post filter used for UI display*/
|
||||||
static uint16_t filterLayer1[filterDepth1];
|
static uint16_t filterLayer1[filterDepth1];
|
||||||
static uint16_t filterLayer2[filterDepth2];
|
static uint16_t filterLayer2[filterDepth2];
|
||||||
|
|||||||
@@ -60,8 +60,9 @@ int main(void) {
|
|||||||
accel2.initalize(); //startup the accelerometer
|
accel2.initalize(); //startup the accelerometer
|
||||||
} else {
|
} else {
|
||||||
PCBVersion = 3;
|
PCBVersion = 3;
|
||||||
systemSettings.SleepTime=0;
|
systemSettings.SleepTime = 0;
|
||||||
systemSettings.ShutdownTime=0;//No accel -> disable sleep
|
systemSettings.ShutdownTime = 0; //No accel -> disable sleep
|
||||||
|
systemSettings.sensitivity=0;
|
||||||
}
|
}
|
||||||
HAL_IWDG_Refresh(&hiwdg);
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
restoreSettings(); // load the settings from flash
|
restoreSettings(); // load the settings from flash
|
||||||
@@ -70,25 +71,25 @@ int main(void) {
|
|||||||
|
|
||||||
/* 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, 768); //3k
|
||||||
GUITaskHandle = osThreadCreate(osThread(GUITask), NULL);
|
GUITaskHandle = osThreadCreate(osThread(GUITask), NULL);
|
||||||
|
|
||||||
/* definition and creation of PIDTask */
|
/* definition and creation of PIDTask */
|
||||||
osThreadDef(PIDTask, startPIDTask, osPriorityRealtime, 0, 256);
|
osThreadDef(PIDTask, startPIDTask, osPriorityRealtime, 0, 512); //2k
|
||||||
PIDTaskHandle = osThreadCreate(osThread(PIDTask), NULL);
|
PIDTaskHandle = osThreadCreate(osThread(PIDTask), NULL);
|
||||||
|
if (PCBVersion != 3) {
|
||||||
/* definition and creation of ROTTask */
|
/* definition and creation of ROTTask */
|
||||||
osThreadDef(ROTTask, startRotationTask, osPriorityLow, 0, 256);
|
osThreadDef(ROTTask, startRotationTask, osPriorityLow, 0, 256); //1k
|
||||||
ROTTaskHandle = osThreadCreate(osThread(ROTTask), NULL);
|
ROTTaskHandle = osThreadCreate(osThread(ROTTask), NULL);
|
||||||
/* definition and creation of MOVTask */
|
/* definition and creation of MOVTask */
|
||||||
osThreadDef(MOVTask, startMOVTask, osPriorityNormal, 0, 256);
|
osThreadDef(MOVTask, startMOVTask, osPriorityNormal, 0, 512); //2k
|
||||||
MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL);
|
MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL);
|
||||||
|
}
|
||||||
/* Create the objects*/
|
/* Create the objects*/
|
||||||
rotationChangedSemaphore =
|
rotationChangedSemaphore = xSemaphoreCreateBinary();
|
||||||
xSemaphoreCreateBinary(); // Used to unlock rotation thread
|
// Used to unlock rotation thread
|
||||||
accelDataAvailableSemaphore =
|
accelDataAvailableSemaphore = xSemaphoreCreateBinary();
|
||||||
xSemaphoreCreateBinary(); // Used to unlock the movement thread
|
// Used to unlock the movement thread
|
||||||
/* Start scheduler */
|
/* Start scheduler */
|
||||||
osKernelStart();
|
osKernelStart();
|
||||||
|
|
||||||
@@ -627,7 +628,7 @@ static void gui_solderingMode() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lcd.refresh();
|
lcd.refresh();
|
||||||
if (systemSettings.sensitivity)
|
if (systemSettings.sensitivity && systemSettings.SleepTime)
|
||||||
if (xTaskGetTickCount() - lastMovementTime > sleepThres
|
if (xTaskGetTickCount() - lastMovementTime > sleepThres
|
||||||
&& xTaskGetTickCount() - lastButtonTime > sleepThres) {
|
&& xTaskGetTickCount() - lastButtonTime > sleepThres) {
|
||||||
if (gui_SolderingSleepingMode()) {
|
if (gui_SolderingSleepingMode()) {
|
||||||
@@ -728,8 +729,8 @@ void startGUITask(void const *argument) {
|
|||||||
lcd.clearScreen(); // Ensure the buffer starts clean
|
lcd.clearScreen(); // Ensure the buffer starts clean
|
||||||
lcd.setCursor(0, 0); // Position the cursor at the 0,0 (top left)
|
lcd.setCursor(0, 0); // Position the cursor at the 0,0 (top left)
|
||||||
lcd.setFont(1); // small font
|
lcd.setFont(1); // small font
|
||||||
lcd.print((char *) "V2.03 PCB"); // Print version number
|
lcd.print((char *) "V2.04 PCB"); // Print version number
|
||||||
lcd.printNumber(PCBVersion, 1);
|
lcd.printNumber(PCBVersion, 1); //Print PCB ID number
|
||||||
lcd.setCursor(0, 8); // second line
|
lcd.setCursor(0, 8); // second line
|
||||||
lcd.print(__DATE__); // print the compile date
|
lcd.print(__DATE__); // print the compile date
|
||||||
lcd.refresh();
|
lcd.refresh();
|
||||||
@@ -758,10 +759,15 @@ void startGUITask(void const *argument) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentlyActiveTemperatureTarget = 0; // ensure tip is off
|
currentlyActiveTemperatureTarget = 0; // ensure tip is off
|
||||||
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
|
|
||||||
|
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(1));//This forces a faster update rate on the filtering
|
||||||
|
|
||||||
if (tipTemp < 50) {
|
if (tipTemp < 50) {
|
||||||
|
|
||||||
if (systemSettings.sensitivity) {
|
if (systemSettings.sensitivity) {
|
||||||
|
|
||||||
if ((xTaskGetTickCount() - lastMovementTime) > 6000
|
if ((xTaskGetTickCount() - lastMovementTime) > 6000
|
||||||
&& (xTaskGetTickCount() - lastButtonTime) > 6000) {
|
&& (xTaskGetTickCount() - lastButtonTime) > 6000) {
|
||||||
lcd.displayOnOff(false); // turn lcd off when no movement
|
lcd.displayOnOff(false); // turn lcd off when no movement
|
||||||
@@ -846,11 +852,11 @@ void startPIDTask(void const *argument) {
|
|||||||
int32_t kp, ki, kd;
|
int32_t kp, ki, kd;
|
||||||
kp = 40;
|
kp = 40;
|
||||||
ki = 60;
|
ki = 60;
|
||||||
kd = 30;
|
kd = 20;
|
||||||
// REMEBER ^^^^ These constants are backwards
|
// REMEBER ^^^^ These constants are backwards
|
||||||
// They act as dividers, so to 'increase' a P term, you make the number
|
// They act as dividers, so to 'increase' a P term, you make the number
|
||||||
// smaller.
|
// smaller.
|
||||||
const int32_t itermMax = 60;
|
const int32_t itermMax = 100;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
|
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
|
||||||
if (currentlyActiveTemperatureTarget) {
|
if (currentlyActiveTemperatureTarget) {
|
||||||
@@ -859,6 +865,11 @@ void startPIDTask(void const *argument) {
|
|||||||
// 33 counts per C)
|
// 33 counts per C)
|
||||||
// P I & D are divisors, so inverse logic applies (beware)
|
// P I & D are divisors, so inverse logic applies (beware)
|
||||||
|
|
||||||
|
// Cap the max setpoint to 450C
|
||||||
|
if (currentlyActiveTemperatureTarget > ctoTipMeasurement(450)) {
|
||||||
|
currentlyActiveTemperatureTarget = ctoTipMeasurement(450);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t rawTempError = currentlyActiveTemperatureTarget - rawTemp;
|
int32_t rawTempError = currentlyActiveTemperatureTarget - rawTemp;
|
||||||
int32_t ierror = (rawTempError / ki);
|
int32_t ierror = (rawTempError / ki);
|
||||||
integralCount += ierror;
|
integralCount += ierror;
|
||||||
@@ -892,6 +903,7 @@ void startPIDTask(void const *argument) {
|
|||||||
setTipPWM(0); // disable the output driver if the output is set to be off
|
setTipPWM(0); // disable the output driver if the output is set to be off
|
||||||
integralCount = 0;
|
integralCount = 0;
|
||||||
derivativeLastValue = 0;
|
derivativeLastValue = 0;
|
||||||
|
osDelay(100); //sleep for a bit longer
|
||||||
}
|
}
|
||||||
|
|
||||||
HAL_IWDG_Refresh(&hiwdg);
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
@@ -901,7 +913,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
|
||||||
|
lastMovementTime = 0;
|
||||||
int16_t datax[MOVFilter];
|
int16_t datax[MOVFilter];
|
||||||
int16_t datay[MOVFilter];
|
int16_t datay[MOVFilter];
|
||||||
int16_t dataz[MOVFilter];
|
int16_t dataz[MOVFilter];
|
||||||
@@ -922,8 +934,8 @@ void startMOVTask(void const *argument) {
|
|||||||
osDelay(5000);
|
osDelay(5000);
|
||||||
}
|
}
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int32_t threshold = 1200 + (9 * 200);
|
int32_t threshold = 1500 + (9 * 200);
|
||||||
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
|
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
|
||||||
if (PCBVersion == 2)
|
if (PCBVersion == 2)
|
||||||
accel2.getAxisReadings(&tx, &ty, &tz);
|
accel2.getAxisReadings(&tx, &ty, &tz);
|
||||||
else if (PCBVersion == 1)
|
else if (PCBVersion == 1)
|
||||||
@@ -961,27 +973,24 @@ void startMOVTask(void const *argument) {
|
|||||||
if (HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET)
|
if (HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET)
|
||||||
max = 0;
|
max = 0;
|
||||||
#endif
|
#endif
|
||||||
// Only run the actual processing if the sensitivity is set (aka we are
|
|
||||||
// enabled)
|
|
||||||
if (systemSettings.sensitivity) {
|
|
||||||
// calculate averages
|
|
||||||
avgx = avgy = avgz = 0;
|
|
||||||
for (uint8_t i = 0; i < MOVFilter; i++) {
|
|
||||||
avgx += datax[i];
|
|
||||||
avgy += datay[i];
|
|
||||||
avgz += dataz[i];
|
|
||||||
}
|
|
||||||
avgx /= MOVFilter;
|
|
||||||
avgy /= MOVFilter;
|
|
||||||
avgz /= MOVFilter;
|
|
||||||
|
|
||||||
// So now we have averages, we want to look if these are different by more
|
// calculate averages
|
||||||
// than the threshold
|
avgx = avgy = avgz = 0;
|
||||||
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
|
for (uint8_t i = 0; i < MOVFilter; i++) {
|
||||||
// If error has occured then we update the tick timer
|
avgx += datax[i];
|
||||||
if (error > threshold) {
|
avgy += datay[i];
|
||||||
lastMovementTime = xTaskGetTickCount();
|
avgz += dataz[i];
|
||||||
}
|
}
|
||||||
|
avgx /= MOVFilter;
|
||||||
|
avgy /= MOVFilter;
|
||||||
|
avgz /= MOVFilter;
|
||||||
|
|
||||||
|
// So now we have averages, we want to look if these are different by more
|
||||||
|
// than the threshold
|
||||||
|
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
|
||||||
|
// If error has occurred then we update the tick timer
|
||||||
|
if (error > threshold) {
|
||||||
|
lastMovementTime = xTaskGetTickCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
osDelay(100); // Slow down update rate
|
osDelay(100); // Slow down update rate
|
||||||
|
|||||||
Reference in New Issue
Block a user