diff options
119 files changed, 4135 insertions, 3956 deletions
@@ -1,4 +1,4 @@ -FROM ubuntu:rolling
+FROM ubuntu:20.04
LABEL maintainer="Ben V. Brown <[email protected]>"
WORKDIR /build
diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h new file mode 100644 index 00000000..a558baad --- /dev/null +++ b/workspace/TS100/Core/BSP/BSP.h @@ -0,0 +1,55 @@ +#include "BSP_Flash.h"
+#include "BSP_Power.h"
+#include "BSP_QC.h"
+#include "Defines.h"
+#include "UnitSettings.h"
+#include "stdint.h"
+/*
+ * BSP.h -- Board Support
+ *
+ * This exposes functions that are expected to be implemented to add support for different hardware
+ */
+
+#ifndef BSP_BSP_H_
+#define BSP_BSP_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Called first thing in main() to init the hardware
+void preRToSInit();
+// Called once the RToS has started for any extra work
+void postRToSInit();
+
+// Called to reset the hardware watchdog unit
+void resetWatchdog();
+// Accepts a output level of 0.. to use to control the tip output PWM
+void setTipPWM(uint8_t pulse);
+// Returns the Handle temp in C, X10
+uint16_t getHandleTemperature();
+// Returns the Tip temperature ADC reading in raw units
+uint16_t getTipRawTemp(uint8_t refresh);
+// Returns the main DC input voltage, using the adjustable divisor + sample flag
+uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample);
+
+// Readers for the two buttons
+// !! Returns 1 if held down, 0 if released
+uint8_t getButtonA();
+uint8_t getButtonB();
+
+// This is a work around that will be called if I2C starts to bug out
+// This should toggle the SCL line until SDA goes high to end the current transaction
+void unstick_I2C();
+
+// Reboot the IC when things go seriously wrong
+void reboot();
+
+// If the user has programmed in a bootup logo, draw it to the screen from flash
+// Returns 1 if the logo was printed so that the unit waits for the timeout or button
+uint8_t showBootLogoIfavailable();
+
+void delay_ms(uint16_t count);
+#ifdef __cplusplus
+}
+#endif
+#endif /* BSP_BSP_H_ */
diff --git a/workspace/TS100/Core/BSP/BSP_Flash.h b/workspace/TS100/Core/BSP/BSP_Flash.h new file mode 100644 index 00000000..d03ecd33 --- /dev/null +++ b/workspace/TS100/Core/BSP/BSP_Flash.h @@ -0,0 +1,26 @@ +/*
+ * BSP_Flash.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+#include "stdint.h"
+#ifndef BSP_BSP_FLASH_H_
+#define BSP_BSP_FLASH_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Wrappers to allow read/writing to a sector of flash that we use to store all of the user settings
+ *
+ * Should allow reading and writing to the flash
+ */
+
+//Erase the flash, then save the buffer. Returns 1 if worked
+uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length);
+
+void flash_read_buffer(uint8_t *buffer, const uint16_t length);
+#ifdef __cplusplus
+}
+#endif
+#endif /* BSP_BSP_FLASH_H_ */
diff --git a/workspace/TS100/Core/BSP/BSP_Power.h b/workspace/TS100/Core/BSP/BSP_Power.h new file mode 100644 index 00000000..1ce7f2bf --- /dev/null +++ b/workspace/TS100/Core/BSP/BSP_Power.h @@ -0,0 +1,27 @@ +#include "stdint.h" +/* + * BSP_Power.h -- Board Support for Power control + * + * These functions are hooks used to allow for power control + * + */ + +#ifndef BSP_POWER_H_ +#define BSP_POWER_H_ +#ifdef __cplusplus +extern "C" { +#endif + +// Called once at startup, after RToS +// This can handle negotiations for QC/PD etc +void power_probe(); + +// Called periodically in the movement handling thread +// Can be used to check any details for the power system +void power_check(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/workspace/TS100/Core/BSP/BSP_QC.h b/workspace/TS100/Core/BSP/BSP_QC.h new file mode 100644 index 00000000..d1536a09 --- /dev/null +++ b/workspace/TS100/Core/BSP/BSP_QC.h @@ -0,0 +1,42 @@ +/*
+ * BSP_QC.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#ifndef BSP_BSP_QC_H_
+#define BSP_BSP_QC_H_
+#include "stdint.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Init GPIO for QC neg
+void QC_Init_GPIO();
+// Set the DP pin to 0.6V
+void QC_DPlusZero_Six();
+// Set the DM pin to 0.6V
+void QC_DNegZero_Six();
+// Set the DP pin to 3.3V
+void QC_DPlusThree_Three();
+// Set the DM pin to 3.3V
+void QC_DNegThree_Three();
+// Turn on weak pulldown on the DM pin
+// This is used as a helper for some power banks
+void QC_DM_PullDown();
+// Turn off the pulldown
+void QC_DM_No_PullDown();
+// Turn on output drivers that were initally disabled to prevent spike through QC disable mode
+void QC_Post_Probe_En();
+// Check if DM was pulled down
+// 1=Pulled down, 0 == pulled high
+uint8_t QC_DM_PulledDown();
+
+// Re-sync if required
+void QC_resync();
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BSP_BSP_QC_H_ */
diff --git a/workspace/TS100/Core/BSP/Defines.h b/workspace/TS100/Core/BSP/Defines.h new file mode 100644 index 00000000..52556f99 --- /dev/null +++ b/workspace/TS100/Core/BSP/Defines.h @@ -0,0 +1,19 @@ +/*
+ * Defines.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#ifndef BSP_DEFINES_H_
+#define BSP_DEFINES_H_
+
+
+enum Orientation {
+ ORIENTATION_LEFT_HAND = 0, ORIENTATION_RIGHT_HAND = 1, ORIENTATION_FLAT = 3
+};
+
+//It is assumed that all hardware implements an 8Hz update period at this time
+#define PID_TIM_HZ (8)
+
+#endif /* BSP_DEFINES_H_ */
diff --git a/workspace/TS100/Core/BSP/Miniware/BSP.cpp b/workspace/TS100/Core/BSP/Miniware/BSP.cpp new file mode 100644 index 00000000..591f005c --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/BSP.cpp @@ -0,0 +1,256 @@ +//BSP mapping functions
+
+#include "BSP.h"
+#include "Setup.h"
+#include "history.hpp"
+#include "Pins.h"
+#include "main.hpp"
+#include "history.hpp"
+#include "I2C_Wrapper.hpp"
+volatile uint16_t PWMSafetyTimer = 0;
+volatile uint8_t pendingPWM = 0;
+
+//2 second filter (ADC is PID_TIM_HZ Hz)
+history<uint16_t, PID_TIM_HZ> rawTempFilter = { { 0 }, 0, 0 };
+void resetWatchdog() {
+ HAL_IWDG_Refresh(&hiwdg);
+}
+
+uint16_t getHandleTemperature() {
+ // We return the current handle temperature in X10 C
+ // TMP36 in handle, 0.5V offset and then 10mV per deg C (0.75V @ 25C for
+ // example) STM32 = 4096 count @ 3.3V input -> But We oversample by 32/(2^2) =
+ // 8 times oversampling Therefore 32768 is the 3.3V input, so 0.1007080078125
+ // mV per count So we need to subtract an offset of 0.5V to center on 0C
+ // (4964.8 counts)
+ //
+ int32_t result = getADC(0);
+ result -= 4965; // remove 0.5V offset
+ // 10mV per C
+ // 99.29 counts per Deg C above 0C
+ result *= 100;
+ result /= 993;
+ return result;
+}
+
+uint16_t getTipInstantTemperature() {
+ uint16_t sum = 0; // 12 bit readings * 8 -> 15 bits
+ uint16_t readings[8];
+ //Looking to reject the highest outlier readings.
+ //As on some hardware these samples can run into the op-amp recovery time
+ //Once this time is up the signal stabilises quickly, so no need to reject minimums
+ readings[0] = hadc1.Instance->JDR1;
+ readings[1] = hadc1.Instance->JDR2;
+ readings[2] = hadc1.Instance->JDR3;
+ readings[3] = hadc1.Instance->JDR4;
+ readings[4] = hadc2.Instance->JDR1;
+ readings[5] = hadc2.Instance->JDR2;
+ readings[6] = hadc2.Instance->JDR3;
+ readings[7] = hadc2.Instance->JDR4;
+
+ for (int i = 0; i < 8; i++) {
+ sum += readings[i];
+ }
+ return sum; // 8x over sample
+}
+
+uint16_t getTipRawTemp(uint8_t refresh) {
+ if (refresh) {
+ uint16_t lastSample = getTipInstantTemperature();
+ rawTempFilter.update(lastSample);
+ return lastSample;
+ } else {
+ return rawTempFilter.average();
+ }
+}
+
+uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) {
+ // ADC maximum is 32767 == 3.3V at input == 28.05V at VIN
+ // Therefore we can divide down from there
+ // Multiplying ADC max by 4 for additional calibration options,
+ // ideal term is 467
+#ifdef MODEL_TS100
+#define BATTFILTERDEPTH 32
+#else
+#define BATTFILTERDEPTH 8
+
+#endif
+ static uint8_t preFillneeded = 10;
+ static uint32_t samples[BATTFILTERDEPTH];
+ static uint8_t index = 0;
+ if (preFillneeded) {
+ for (uint8_t i = 0; i < BATTFILTERDEPTH; i++)
+ samples[i] = getADC(1);
+ preFillneeded--;
+ }
+ if (sample) {
+ samples[index] = getADC(1);
+ index = (index + 1) % BATTFILTERDEPTH;
+ }
+ uint32_t sum = 0;
+
+ for (uint8_t i = 0; i < BATTFILTERDEPTH; i++)
+ sum += samples[i];
+
+ sum /= BATTFILTERDEPTH;
+ return sum * 4 / divisor;
+}
+
+void setTipPWM(uint8_t pulse) {
+ PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is
+ // disabled if the PID task is not scheduled often enough.
+
+ pendingPWM = pulse;
+}
+
+// These are called by the HAL after the corresponding events from the system
+// timers.
+
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
+// Period has elapsed
+ if (htim->Instance == TIM2) {
+ // we want to turn on the output again
+ PWMSafetyTimer--;
+ // We decrement this safety value so that lockups in the
+ // scheduler will not cause the PWM to become locked in an
+ // active driving state.
+ // While we could assume this could never happen, its a small price for
+ // increased safety
+ htim2.Instance->CCR4 = pendingPWM;
+ if (htim2.Instance->CCR4 && PWMSafetyTimer) {
+ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
+ } else {
+ HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
+ }
+ } else if (htim->Instance == TIM1) {
+ // STM uses this for internal functions as a counter for timeouts
+ HAL_IncTick();
+ }
+}
+
+void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {
+// This was a when the PWM for the output has timed out
+ if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4) {
+ HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
+ }
+}
+void unstick_I2C() {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ int timeout = 100;
+ int timeout_cnt = 0;
+
+ // 1. Clear PE bit.
+ hi2c1.Instance->CR1 &= ~(0x0001);
+ /**I2C1 GPIO Configuration
+ PB6 ------> I2C1_SCL
+ PB7 ------> I2C1_SDA
+ */
+ // 2. Configure the SCL and SDA I/Os as General Purpose Output Open-Drain, High level (Write 1 to GPIOx_ODR).
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+
+ GPIO_InitStruct.Pin = SCL_Pin;
+ HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct);
+ HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
+
+ GPIO_InitStruct.Pin = SDA_Pin;
+ HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct);
+ HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET);
+
+ while (GPIO_PIN_SET != HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin)) {
+ //Move clock to release I2C
+ HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_RESET);
+ asm("nop");
+ asm("nop");
+ asm("nop");
+ asm("nop");
+ HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
+
+ timeout_cnt++;
+ if (timeout_cnt > timeout)
+ return;
+ }
+
+ // 12. Configure the SCL and SDA I/Os as Alternate function Open-Drain.
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+
+ GPIO_InitStruct.Pin = SCL_Pin;
+ HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = SDA_Pin;
+ HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct);
+
+ HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET);
+
+ // 13. Set SWRST bit in I2Cx_CR1 register.
+ hi2c1.Instance->CR1 |= 0x8000;
+
+ asm("nop");
+
+ // 14. Clear SWRST bit in I2Cx_CR1 register.
+ hi2c1.Instance->CR1 &= ~0x8000;
+
+ asm("nop");
+
+ // 15. Enable the I2C peripheral by setting the PE bit in I2Cx_CR1 register
+ hi2c1.Instance->CR1 |= 0x0001;
+
+ // Call initialization function.
+ HAL_I2C_Init(&hi2c1);
+}
+
+uint8_t getButtonA() {
+ return HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ?
+ 1 : 0;
+}
+uint8_t getButtonB() {
+ return HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ?
+ 1 : 0;
+}
+
+/*
+ * Catch the IRQ that says that the conversion is done on the temperature
+ * readings coming in Once these have come in we can unblock the PID so that it
+ * runs again
+ */
+void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc) {
+ BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+ if (hadc == &hadc1) {
+ if (pidTaskNotification) {
+ vTaskNotifyGiveFromISR(pidTaskNotification,
+ &xHigherPriorityTaskWoken);
+ portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+ }
+ }
+}
+void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
+ FRToSI2C::CpltCallback();
+}
+void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
+ FRToSI2C::CpltCallback();
+}
+void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
+ FRToSI2C::CpltCallback();
+}
+void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c __unused) {
+
+ FRToSI2C::CpltCallback();
+}
+void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
+
+ FRToSI2C::CpltCallback();
+}
+void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
+ FRToSI2C::CpltCallback();
+}
+void reboot() {
+ NVIC_SystemReset();
+}
+
+void delay_ms(uint16_t count) {
+ HAL_Delay(count);
+}
diff --git a/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp b/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp new file mode 100644 index 00000000..ad727723 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp @@ -0,0 +1,142 @@ +/*
+ * FRToSI2C.cpp
+ *
+ * Created on: 14Apr.,2018
+ * Author: Ralim
+ */
+#include <I2C_Wrapper.hpp>
+#include "BSP.h"
+#include "Setup.h"
+#define I2CUSESDMA
+SemaphoreHandle_t FRToSI2C::I2CSemaphore;
+StaticSemaphore_t FRToSI2C::xSemaphoreBuffer;
+
+void FRToSI2C::CpltCallback() {
+ hi2c1.State = HAL_I2C_STATE_READY; // Force state reset (even if tx error)
+ if (I2CSemaphore) {
+ xSemaphoreGiveFromISR(I2CSemaphore, NULL);
+ }
+}
+
+bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
+ uint8_t *pData, uint16_t Size) {
+
+ if (I2CSemaphore == NULL) {
+ // no RToS, run blocking code
+ HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT,
+ pData, Size, 5000);
+ return true;
+ } else {
+ // RToS is active, run threading
+ // Get the mutex so we can use the I2C port
+ // Wait up to 1 second for the mutex
+ if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) {
+#ifdef I2CUSESDMA
+ if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress,
+ I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) {
+
+ I2C_Unstick();
+ xSemaphoreGive(I2CSemaphore);
+ return false;
+ } else {
+ xSemaphoreGive(I2CSemaphore);
+ return true;
+ }
+#else
+
+ if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, pData, Size,
+ 5000)==HAL_OK){
+ xSemaphoreGive(I2CSemaphore);
+ return true;
+ }
+ xSemaphoreGive(I2CSemaphore);
+ return false;
+#endif
+ } else {
+ return false;
+ }
+ }
+
+}
+void FRToSI2C::I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data) {
+ Mem_Write(address, reg, &data, 1);
+}
+
+uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) {
+ uint8_t tx_data[1];
+ Mem_Read(add, reg, tx_data, 1);
+ return tx_data[0];
+}
+void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
+ uint8_t *pData, uint16_t Size) {
+
+ if (I2CSemaphore == NULL) {
+ // no RToS, run blocking code
+ HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT,
+ pData, Size, 5000);
+ } else {
+ // RToS is active, run threading
+ // Get the mutex so we can use the I2C port
+ // Wait up to 1 second for the mutex
+ if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) {
+#ifdef I2CUSESDMA
+ if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress,
+ I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) {
+
+ I2C_Unstick();
+ xSemaphoreGive(I2CSemaphore);
+ }
+ xSemaphoreGive(I2CSemaphore);
+#else
+ if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, pData,
+ Size, 5000) != HAL_OK) {
+ }
+ xSemaphoreGive(I2CSemaphore);
+#endif
+ } else {
+ }
+ }
+
+}
+
+void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) {
+ if (I2CSemaphore == NULL) {
+ // no RToS, run blocking code
+ HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, 5000);
+ } else {
+ // RToS is active, run threading
+ // Get the mutex so we can use the I2C port
+ // Wait up to 1 second for the mutex
+ if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) {
+#ifdef I2CUSESDMA
+
+ if (HAL_I2C_Master_Transmit_DMA(&hi2c1, DevAddress, pData, Size)
+ != HAL_OK) {
+
+ I2C_Unstick();
+ xSemaphoreGive(I2CSemaphore);
+
+ }
+#else
+ HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, 5000);
+ xSemaphoreGive(I2CSemaphore);
+#endif
+
+ } else {
+ }
+ }
+
+}
+
+bool FRToSI2C::probe(uint16_t DevAddress) {
+ uint8_t buffer[1];
+ if (Mem_Read(DevAddress, 0, buffer, 1)) {
+ //ACK'd
+ return true;
+ }
+ return false;
+}
+
+void FRToSI2C::I2C_Unstick() {
+ unstick_I2C();
+}
diff --git a/workspace/TS100/Core/Inc/hardware.h b/workspace/TS100/Core/BSP/Miniware/Pins.h index 87bf69cc..1f0ddfa9 100644 --- a/workspace/TS100/Core/Inc/hardware.h +++ b/workspace/TS100/Core/BSP/Miniware/Pins.h @@ -1,148 +1,83 @@ -/* - * Hardware.h - * - * Created on: 29Aug.,2017 - * Author: Ben V. Brown - */ - -#ifndef HARDWARE_H_ -#define HARDWARE_H_ -#include "Setup.h" -#include "stm32f1xx_hal.h" -#include "FreeRTOS.h" -#include "stm32f1xx_hal.h" -#include "cmsis_os.h" -#include "unit.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum Orientation { - ORIENTATION_LEFT_HAND = 0, ORIENTATION_RIGHT_HAND = 1, ORIENTATION_FLAT = 3 -}; -#define PID_TIM_HZ (8) -#if defined(MODEL_TS100) + defined(MODEL_TS80) > 1 -#error "Multiple models defined!" -#elif defined(MODEL_TS100) + defined(MODEL_TS80) == 0 -#error "No model defined!" -#endif - -#ifdef MODEL_TS100 - -#define KEY_B_Pin GPIO_PIN_6 -#define KEY_B_GPIO_Port GPIOA -#define TMP36_INPUT_Pin GPIO_PIN_7 -#define TMP36_INPUT_GPIO_Port GPIOA -#define TMP36_ADC1_CHANNEL ADC_CHANNEL_7 -#define TIP_TEMP_Pin GPIO_PIN_0 -#define TIP_TEMP_GPIO_Port GPIOB -#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_8 -#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_8 -#define VIN_Pin GPIO_PIN_1 -#define VIN_GPIO_Port GPIOB -#define VIN_ADC1_CHANNEL ADC_CHANNEL_9 -#define VIN_ADC2_CHANNEL ADC_CHANNEL_9 -#define OLED_RESET_Pin GPIO_PIN_8 -#define OLED_RESET_GPIO_Port GPIOA -#define KEY_A_Pin GPIO_PIN_9 -#define KEY_A_GPIO_Port GPIOA -#define INT_Orientation_Pin GPIO_PIN_3 -#define INT_Orientation_GPIO_Port GPIOB -#define PWM_Out_Pin GPIO_PIN_4 -#define PWM_Out_GPIO_Port GPIOB -#define PWM_Out_CHANNEL TIM_CHANNEL_1 -#define PWM_Out_CCR -#define INT_Movement_Pin GPIO_PIN_5 -#define INT_Movement_GPIO_Port GPIOB -#define SCL_Pin GPIO_PIN_6 -#define SCL_GPIO_Port GPIOB -#define SDA_Pin GPIO_PIN_7 -#define SDA_GPIO_Port GPIOB - -#else -// TS80 pin map -#define KEY_B_Pin GPIO_PIN_0 -#define KEY_B_GPIO_Port GPIOB -#define TMP36_INPUT_Pin GPIO_PIN_4 -#define TMP36_INPUT_GPIO_Port GPIOA -#define TMP36_ADC1_CHANNEL ADC_CHANNEL_4 -#define TIP_TEMP_Pin GPIO_PIN_3 -#define TIP_TEMP_GPIO_Port GPIOA -#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3 -#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_3 - -#define VIN_Pin GPIO_PIN_2 -#define VIN_GPIO_Port GPIOA -#define VIN_ADC1_CHANNEL ADC_CHANNEL_2 -#define VIN_ADC2_CHANNEL ADC_CHANNEL_2 -#define OLED_RESET_Pin GPIO_PIN_15 -#define OLED_RESET_GPIO_Port GPIOA -#define KEY_A_Pin GPIO_PIN_1 -#define KEY_A_GPIO_Port GPIOB -#define INT_Orientation_Pin GPIO_PIN_4 -#define INT_Orientation_GPIO_Port GPIOB -#define PWM_Out_Pin GPIO_PIN_6 -#define PWM_Out_GPIO_Port GPIOA -#define PWM_Out_CHANNEL TIM_CHANNEL_1 -#define INT_Movement_Pin GPIO_PIN_5 -#define INT_Movement_GPIO_Port GPIOB -#define SCL_Pin GPIO_PIN_6 -#define SCL_GPIO_Port GPIOB -#define SDA_Pin GPIO_PIN_7 -#define SDA_GPIO_Port GPIOB - -#endif - -/* - * Keep in a uint8_t range for the ID's - */ -#ifdef MODEL_TS100 -enum TipType { - TS_B2 = 0, - TS_D24 = 1, - TS_BC2 = 2, - TS_C1 = 3, - Tip_MiniWare = 4, - HAKKO_BC2 = 4, - Tip_Hakko = 5, - Tip_Custom = 5, -}; -#endif -#ifdef MODEL_TS80 -enum TipType { - TS_B02 = 0, TS_D25 = 1, Tip_MiniWare = 2, Tip_Custom = 3, -}; -#endif -extern uint16_t tipGainCalValue ; - -uint16_t lookupTipDefaultCalValue(enum TipType tipID); - uint16_t getHandleTemperature(); -uint16_t getTipRawTemp(uint8_t refresh); -uint16_t getInputVoltageX10(uint16_t divisor,uint8_t sample); - -void setTipPWM(uint8_t pulse); -uint16_t ctoTipMeasurement(uint16_t temp); -uint16_t tipMeasurementToC(uint16_t raw); -uint16_t ftoTipMeasurement(uint16_t temp); -#ifdef ENABLED_FAHRENHEIT_SUPPORT -uint16_t tipMeasurementToF(uint16_t raw); -#endif -void seekQC(int16_t Vx10, uint16_t divisor); -void setCalibrationOffset(int16_t offSet); -void setTipType(enum TipType tipType, uint8_t manualCalGain); -uint32_t calculateTipR(); -int16_t calculateMaxVoltage(uint8_t useHP); -void startQC(uint16_t divisor); // Tries to negotiate QC for highest voltage, must be run after -// RToS -// This will try for 12V, failing that 9V, failing that 5V -// If input is over 12V returns -1 -// If the input is [5-12] Will return the value. -void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, - StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) ; -void vApplicationIdleHook(void); -#ifdef __cplusplus -} -#endif - -#endif /* HARDWARE_H_ */ +/*
+ * Pins.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#ifndef BSP_MINIWARE_PINS_H_
+#define BSP_MINIWARE_PINS_H_
+
+#if defined(MODEL_TS100) + defined(MODEL_TS80) > 1
+#error "Multiple models defined!"
+#elif defined(MODEL_TS100) + defined(MODEL_TS80) == 0
+#error "No model defined!"
+#endif
+
+#ifdef MODEL_TS100
+
+#define KEY_B_Pin GPIO_PIN_6
+#define KEY_B_GPIO_Port GPIOA
+#define TMP36_INPUT_Pin GPIO_PIN_7
+#define TMP36_INPUT_GPIO_Port GPIOA
+#define TMP36_ADC1_CHANNEL ADC_CHANNEL_7
+#define TIP_TEMP_Pin GPIO_PIN_0
+#define TIP_TEMP_GPIO_Port GPIOB
+#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_8
+#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_8
+#define VIN_Pin GPIO_PIN_1
+#define VIN_GPIO_Port GPIOB
+#define VIN_ADC1_CHANNEL ADC_CHANNEL_9
+#define VIN_ADC2_CHANNEL ADC_CHANNEL_9
+#define OLED_RESET_Pin GPIO_PIN_8
+#define OLED_RESET_GPIO_Port GPIOA
+#define KEY_A_Pin GPIO_PIN_9
+#define KEY_A_GPIO_Port GPIOA
+#define INT_Orientation_Pin GPIO_PIN_3
+#define INT_Orientation_GPIO_Port GPIOB
+#define PWM_Out_Pin GPIO_PIN_4
+#define PWM_Out_GPIO_Port GPIOB
+#define PWM_Out_CHANNEL TIM_CHANNEL_1
+#define PWM_Out_CCR
+#define INT_Movement_Pin GPIO_PIN_5
+#define INT_Movement_GPIO_Port GPIOB
+#define SCL_Pin GPIO_PIN_6
+#define SCL_GPIO_Port GPIOB
+#define SDA_Pin GPIO_PIN_7
+#define SDA_GPIO_Port GPIOB
+
+#else
+// TS80 pin map
+#define KEY_B_Pin GPIO_PIN_0
+#define KEY_B_GPIO_Port GPIOB
+#define TMP36_INPUT_Pin GPIO_PIN_4
+#define TMP36_INPUT_GPIO_Port GPIOA
+#define TMP36_ADC1_CHANNEL ADC_CHANNEL_4
+#define TIP_TEMP_Pin GPIO_PIN_3
+#define TIP_TEMP_GPIO_Port GPIOA
+#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3
+#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_3
+
+#define VIN_Pin GPIO_PIN_2
+#define VIN_GPIO_Port GPIOA
+#define VIN_ADC1_CHANNEL ADC_CHANNEL_2
+#define VIN_ADC2_CHANNEL ADC_CHANNEL_2
+#define OLED_RESET_Pin GPIO_PIN_15
+#define OLED_RESET_GPIO_Port GPIOA
+#define KEY_A_Pin GPIO_PIN_1
+#define KEY_A_GPIO_Port GPIOB
+#define INT_Orientation_Pin GPIO_PIN_4
+#define INT_Orientation_GPIO_Port GPIOB
+#define PWM_Out_Pin GPIO_PIN_6
+#define PWM_Out_GPIO_Port GPIOA
+#define PWM_Out_CHANNEL TIM_CHANNEL_1
+#define INT_Movement_Pin GPIO_PIN_5
+#define INT_Movement_GPIO_Port GPIOB
+#define SCL_Pin GPIO_PIN_6
+#define SCL_GPIO_Port GPIOB
+#define SDA_Pin GPIO_PIN_7
+#define SDA_GPIO_Port GPIOB
+
+#endif
+
+#endif /* BSP_MINIWARE_PINS_H_ */
diff --git a/workspace/TS100/Core/BSP/Miniware/Power.cpp b/workspace/TS100/Core/BSP/Miniware/Power.cpp new file mode 100644 index 00000000..30386c83 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/Power.cpp @@ -0,0 +1,21 @@ +#include "BSP.h" +#include "BSP_Power.h" +#include "QC3.h" +#include "Settings.h" +void power_probe() { +// If TS80 probe for QC +// If TS100 - noop +#ifdef MODEL_TS80 + startQC(systemSettings.voltageDiv); + + seekQC((systemSettings.cutoutSetting) ? 120 : 90, + systemSettings.voltageDiv); // this will move the QC output to the preferred voltage to start with + +#endif +} + +void power_check() { +#ifdef MODEL_TS80 + QC_resync(); +#endif +}
\ No newline at end of file diff --git a/workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp new file mode 100644 index 00000000..bd3841c3 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp @@ -0,0 +1,74 @@ +/*
+ * QC.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+#include "BSP.h"
+#include "Pins.h"
+#include "QC3.h"
+#include "Settings.h"
+#include "stm32f1xx_hal.h"
+void QC_DPlusZero_Six() {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // pull down D+
+}
+void QC_DNegZero_Six() {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
+}
+void QC_DPlusThree_Three() {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); // pull up D+
+}
+void QC_DNegThree_Three() {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
+}
+void QC_DM_PullDown() {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+}
+void QC_DM_No_PullDown() {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+}
+void QC_Init_GPIO() {
+ // Setup any GPIO into the right states for QC
+ GPIO_InitTypeDef GPIO_InitStruct;
+ GPIO_InitStruct.Pin = GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ // Turn off output mode on pins that we can
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_13;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+}
+void QC_Post_Probe_En() {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+ GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+}
+
+uint8_t QC_DM_PulledDown() { return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET ? 1 : 0; }
+
+void QC_resync() {
+#ifdef MODEL_TS80
+ seekQC((systemSettings.cutoutSetting) ? 120 : 90,
+ systemSettings.voltageDiv); // Run the QC seek again if we have drifted too much
+#endif
+}
\ No newline at end of file diff --git a/workspace/TS100/Core/BSP/Miniware/README.md b/workspace/TS100/Core/BSP/Miniware/README.md new file mode 100644 index 00000000..bb9de245 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/README.md @@ -0,0 +1,12 @@ +# BSP section for STM32F103 based Miniware products
+
+This folder contains the hardware abstractions required for the TS100, TS80 and probably TS80P soldering irons.
+
+## Main abstractions
+
+* Hardware Init
+* -> Should contain all bootstrap to bring the hardware up to an operating point
+* -> Two functions are required, a pre and post FreeRToS call
+* I2C read/write
+* Set PWM for the tip
+* Links between IRQ's on the system and the calls in the rest of the firmware
diff --git a/workspace/TS100/Core/Src/Setup.c b/workspace/TS100/Core/BSP/Miniware/Setup.c index 88aa1a3c..4b3d1f5b 100644 --- a/workspace/TS100/Core/Src/Setup.c +++ b/workspace/TS100/Core/BSP/Miniware/Setup.c @@ -5,6 +5,7 @@ * Author: Ben V. Brown */ #include "Setup.h" +#include "Pins.h" ADC_HandleTypeDef hadc1; ADC_HandleTypeDef hadc2; DMA_HandleTypeDef hdma_adc1; @@ -32,12 +33,8 @@ static void MX_ADC2_Init(void); void Setup_HAL() { SystemClock_Config(); -#ifndef LOCAL_BUILD __HAL_AFIO_REMAP_SWJ_DISABLE() ; -#else - __HAL_AFIO_REMAP_SWJ_NOJTAG(); -#endif MX_GPIO_Init(); MX_DMA_Init(); @@ -49,8 +46,8 @@ void Setup_HAL() { MX_IWDG_Init(); HAL_ADC_Start(&hadc2); HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*) ADCReadings, 64); // start DMA of normal readings - HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings - HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings + HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings + HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings } // channel 0 -> temperature sensor, 1-> VIN @@ -336,7 +333,7 @@ static void MX_TIM2_Init(void) { HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 255 + 13;//13 -> Delay of 5ms + sConfigOC.Pulse = 255 + 13; //13 -> Delay of 5ms //255 is the largest time period of the drive signal, and then offset ADC sample to be a bit delayed after this /* * It takes 4 milliseconds for output to be stable after PWM turns off. diff --git a/workspace/TS100/Core/Inc/Setup.h b/workspace/TS100/Core/BSP/Miniware/Setup.h index 3e8c5f46..c5b80813 100644 --- a/workspace/TS100/Core/Inc/Setup.h +++ b/workspace/TS100/Core/BSP/Miniware/Setup.h @@ -1,38 +1,38 @@ -/* - * Setup.h - * - * Created on: 29Aug.,2017 - * Author: Ben V. Brown - */ - -#ifndef SETUP_H_ -#define SETUP_H_ - -#ifdef __cplusplus -extern "C" { -#endif -#include <hardware.h> -#include "stm32f1xx_hal.h" - -extern ADC_HandleTypeDef hadc1; -extern ADC_HandleTypeDef hadc2; -extern DMA_HandleTypeDef hdma_adc1; - -extern DMA_HandleTypeDef hdma_i2c1_rx; -extern DMA_HandleTypeDef hdma_i2c1_tx; -extern I2C_HandleTypeDef hi2c1; - -extern IWDG_HandleTypeDef hiwdg; - -extern TIM_HandleTypeDef htim2; -extern TIM_HandleTypeDef htim3; -void Setup_HAL(); -uint16_t getADC(uint8_t channel); - -void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim); //Since the hal header file does not define this one - -#ifdef __cplusplus -} -#endif - -#endif /* SETUP_H_ */ +/*
+ * Setup.h
+ *
+ * Created on: 29Aug.,2017
+ * Author: Ben V. Brown
+ */
+
+#ifndef SETUP_H_
+#define SETUP_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "stm32f1xx_hal.h"
+
+extern ADC_HandleTypeDef hadc1;
+extern ADC_HandleTypeDef hadc2;
+extern DMA_HandleTypeDef hdma_adc1;
+
+extern DMA_HandleTypeDef hdma_i2c1_rx;
+extern DMA_HandleTypeDef hdma_i2c1_tx;
+extern I2C_HandleTypeDef hi2c1;
+
+extern IWDG_HandleTypeDef hiwdg;
+
+extern TIM_HandleTypeDef htim2;
+extern TIM_HandleTypeDef htim3;
+void Setup_HAL();
+uint16_t getADC(uint8_t channel);
+
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); //Since the hal header file does not define this one
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SETUP_H_ */
diff --git a/workspace/TS100/Core/BSP/Miniware/UnitSettings.h b/workspace/TS100/Core/BSP/Miniware/UnitSettings.h new file mode 100644 index 00000000..f3588b8b --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/UnitSettings.h @@ -0,0 +1,18 @@ +/*
+ * UnitSettings.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#ifndef BSP_MINIWARE_UNITSETTINGS_H_
+#define BSP_MINIWARE_UNITSETTINGS_H_
+//On the TS80, the LIS accel is mounted backwards
+#ifdef MODEL_TS80
+#define LIS_ORI_FLIP
+#endif
+
+
+
+
+#endif /* BSP_MINIWARE_UNITSETTINGS_H_ */
diff --git a/workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h index fdaf5c09..fdaf5c09 100644 --- a/workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h diff --git a/workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h index 333095ba..333095ba 100644 --- a/workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h diff --git a/workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h index 3652ff59..3652ff59 100644 --- a/workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/arm_common_tables.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/arm_common_tables.h index d5d72417..d5d72417 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/arm_common_tables.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/arm_common_tables.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/arm_const_structs.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/arm_const_structs.h index 54595f55..54595f55 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/arm_const_structs.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/arm_const_structs.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/arm_math.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/arm_math.h index 580cbbde..580cbbde 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/arm_math.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/arm_math.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/cmsis_armcc.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/cmsis_armcc.h index f2bb66a0..f2bb66a0 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/cmsis_armcc.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/cmsis_armcc.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/cmsis_armcc_V6.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/cmsis_armcc_V6.h index d714e9b0..d714e9b0 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/cmsis_armcc_V6.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/cmsis_armcc_V6.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/cmsis_gcc.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/cmsis_gcc.h index d868f2e6..d868f2e6 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/cmsis_gcc.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/cmsis_gcc.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cm0.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm0.h index fdee521a..fdee521a 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cm0.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm0.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cm0plus.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm0plus.h index 7614450d..7614450d 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cm0plus.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm0plus.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cm3.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm3.h index 34ed84c1..34ed84c1 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cm3.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm3.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cm4.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm4.h index 01cb73bf..01cb73bf 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cm4.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm4.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cm7.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm7.h index 20963c14..20963c14 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cm7.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cm7.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cmFunc.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cmFunc.h index ca319a55..ca319a55 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cmFunc.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cmFunc.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cmInstr.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cmInstr.h index a0a50645..a0a50645 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cmInstr.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cmInstr.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_cmSimd.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cmSimd.h index 4d76bf90..4d76bf90 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_cmSimd.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_cmSimd.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_sc000.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_sc000.h index ea16bf3e..ea16bf3e 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_sc000.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_sc000.h diff --git a/workspace/TS100/Drivers/CMSIS/Include/core_sc300.h b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_sc300.h index 820cef4f..820cef4f 100644 --- a/workspace/TS100/Drivers/CMSIS/Include/core_sc300.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/CMSIS/Include/core_sc300.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 41666dc4..41666dc4 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h index 653a094e..653a094e 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h index fd79972a..fd79972a 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h index b923ce41..b923ce41 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h index 9cb0c835..9cb0c835 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h index 0a0e54fe..0a0e54fe 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h index 524f61f0..524f61f0 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h index b5caf9fe..b5caf9fe 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h index 399076dd..399076dd 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h index 5ec01638..5ec01638 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h index 2594a194..2594a194 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h index ff4b96a4..ff4b96a4 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h index f8a68397..f8a68397 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h index 5a6f3955..5a6f3955 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h index 8499c7fd..8499c7fd 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h index 0e3bdfc5..0e3bdfc5 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h index 0080f335..0080f335 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h index aa62b797..aa62b797 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h index 3ad03bfa..3ad03bfa 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c index a449258b..a449258b 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c index de1ba752..de1ba752 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c index 2d539a22..2d539a22 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c index ba8bb631..ba8bb631 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c index d3989c2e..d3989c2e 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c index ea723908..ea723908 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c index b83fbc6a..b83fbc6a 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c index 2d569515..2d569515 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c index 551333bb..551333bb 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c index 09846a44..09846a44 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c index 79fef5d9..79fef5d9 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c index 44d66138..44d66138 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c index e146d9b6..e146d9b6 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c index 65db17b7..65db17b7 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c index 9a42f0ed..9a42f0ed 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c diff --git a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c index 8bf99260..8bf99260 100644 --- a/workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c +++ b/workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c diff --git a/workspace/TS100/Core/BSP/Miniware/flash.c b/workspace/TS100/Core/BSP/Miniware/flash.c new file mode 100644 index 00000000..26432da8 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/flash.c @@ -0,0 +1,49 @@ +/*
+ * flash.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#include "BSP_Flash.h"
+#include "BSP.h"
+#include "string.h"
+#include "stm32f1xx_hal.h"
+/*Flash start OR'ed with the maximum amount of flash - 1024 bytes*/
+/*We use the last 1024 byte page*/
+#define FLASH_ADDR (0x8000000 |0xFC00)
+uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
+ FLASH_EraseInitTypeDef pEraseInit;
+ pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
+ pEraseInit.Banks = FLASH_BANK_1;
+ pEraseInit.NbPages = 1;
+ pEraseInit.PageAddress = FLASH_ADDR;
+ uint32_t failingAddress = 0;
+ resetWatchdog();
+ __HAL_FLASH_CLEAR_FLAG(
+ FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY);
+ HAL_FLASH_Unlock();
+ HAL_Delay(10);
+ resetWatchdog();
+ HAL_FLASHEx_Erase(&pEraseInit, &failingAddress);
+ //^ Erase the page of flash (1024 bytes on this stm32)
+ // erased the chunk
+ // now we program it
+ uint16_t *data = (uint16_t*) buffer;
+ HAL_FLASH_Unlock();
+ for (uint8_t i = 0; i < (length / 2); i++) {
+ resetWatchdog();
+ HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_ADDR + (i * 2),
+ data[i]);
+ }
+ HAL_FLASH_Lock();
+ return 1;
+}
+
+void flash_read_buffer(uint8_t *buffer, const uint16_t length) {
+
+ uint16_t *data = (uint16_t*) buffer;
+ for (uint8_t i = 0; i < (length / 2); i++) {
+ data[i] = *((uint16_t*) (FLASH_ADDR + (i * 2)));
+ }
+}
diff --git a/workspace/TS100/Core/BSP/Miniware/logo.cpp b/workspace/TS100/Core/BSP/Miniware/logo.cpp new file mode 100644 index 00000000..f71df93d --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/logo.cpp @@ -0,0 +1,27 @@ +/*
+ * logo.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#include "BSP.h"
+#include "OLED.hpp"
+// Second last page of flash set aside for logo image.
+#define FLASH_LOGOADDR (0x8000000 | 0xF800)
+
+// Logo header signature.
+#define LOGO_HEADER_VALUE 0xF00DAA55
+
+uint8_t showBootLogoIfavailable() {
+// Do not show logo data if signature is not found.
+ if (LOGO_HEADER_VALUE
+ != *(reinterpret_cast<const uint32_t*>(FLASH_LOGOADDR))) {
+ return 0;
+ }
+
+ OLED::drawAreaSwapped(0, 0, 96, 16, (uint8_t*) (FLASH_LOGOADDR + 4));
+ OLED::refresh();
+ return 1;
+}
+
diff --git a/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp new file mode 100644 index 00000000..0c262a95 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp @@ -0,0 +1,13 @@ +#include "BSP.h" +#include "FreeRTOS.h" +#include "QC3.h" +#include "Settings.h" +#include "cmsis_os.h" +#include "main.hpp" +#include "power.hpp" +#include "stdlib.h" +#include "task.h" + +void postRToSInit() { + // Any after RTos setup +} diff --git a/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp new file mode 100644 index 00000000..6a16c44f --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp @@ -0,0 +1,22 @@ +/*
+ * preRTOS.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#include <I2C_Wrapper.hpp>
+#include "BSP.h"
+#include "Setup.h"
+#include "Pins.h"
+void preRToSInit() {
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick.
+ */
+ HAL_Init();
+ Setup_HAL(); // Setup all the HAL objects
+ FRToSI2C::init();
+ HAL_Delay(50);
+ HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET);
+ HAL_Delay(50);
+
+}
diff --git a/workspace/TS100/Core/Src/stm32f1xx_hal_msp.c b/workspace/TS100/Core/BSP/Miniware/stm32f1xx_hal_msp.c index d0b6cebd..3ccd6413 100644 --- a/workspace/TS100/Core/Src/stm32f1xx_hal_msp.c +++ b/workspace/TS100/Core/BSP/Miniware/stm32f1xx_hal_msp.c @@ -1,136 +1,136 @@ -#include <hardware.h> -#include "stm32f1xx_hal.h" -#include "Setup.h" -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) { - __HAL_RCC_AFIO_CLK_ENABLE() - ; - - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* System interrupt init*/ - /* MemoryManagement_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0); - /* BusFault_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0); - /* UsageFault_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0); - /* SVCall_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0); - /* DebugMonitor_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0); - /* PendSV_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); - - -} - -void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { - - GPIO_InitTypeDef GPIO_InitStruct; - if (hadc->Instance == ADC1) { - __HAL_RCC_ADC1_CLK_ENABLE() - ; - - /* ADC1 DMA Init */ - /* ADC1 Init */ - hdma_adc1.Instance = DMA1_Channel1; - hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; - hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; - hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; - hdma_adc1.Init.Mode = DMA_CIRCULAR; - hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH; - HAL_DMA_Init(&hdma_adc1); - - __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1); - - /* ADC1 interrupt Init */ - HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0); - HAL_NVIC_EnableIRQ(ADC1_2_IRQn); - } else { - __HAL_RCC_ADC2_CLK_ENABLE() - ; - - /**ADC2 GPIO Configuration - PB0 ------> ADC2_IN8 - PB1 ------> ADC2_IN9 - */ - GPIO_InitStruct.Pin = TIP_TEMP_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* ADC2 interrupt Init */ - HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0); - HAL_NVIC_EnableIRQ(ADC1_2_IRQn); - } - -} - -void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { - - GPIO_InitTypeDef GPIO_InitStruct; - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE() - ; - /* I2C1 DMA Init */ - /* I2C1_RX Init */ - hdma_i2c1_rx.Instance = DMA1_Channel7; - hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_i2c1_rx.Init.Mode = DMA_NORMAL; - hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_LOW; - HAL_DMA_Init(&hdma_i2c1_rx); - - __HAL_LINKDMA(hi2c, hdmarx, hdma_i2c1_rx); - - /* I2C1_TX Init */ - hdma_i2c1_tx.Instance = DMA1_Channel6; - hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE; - hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma_i2c1_tx.Init.Mode = DMA_NORMAL; - hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_MEDIUM; - HAL_DMA_Init(&hdma_i2c1_tx); - - __HAL_LINKDMA(hi2c, hdmatx, hdma_i2c1_tx); - - /* I2C1 interrupt Init */ - HAL_NVIC_SetPriority(I2C1_EV_IRQn, 15, 0); - HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); - HAL_NVIC_SetPriority(I2C1_ER_IRQn, 15, 0); - HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); - -} - -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { - if (htim_base->Instance == TIM3) { - /* Peripheral clock enable */ - __HAL_RCC_TIM3_CLK_ENABLE() - ; - } else if (htim_base->Instance == TIM2) { - /* Peripheral clock enable */ - __HAL_RCC_TIM2_CLK_ENABLE() - ; - } -} +#include "Pins.h"
+#include "stm32f1xx_hal.h"
+#include "Setup.h"
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void) {
+ __HAL_RCC_AFIO_CLK_ENABLE()
+ ;
+
+ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
+
+ /* System interrupt init*/
+ /* MemoryManagement_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
+ /* BusFault_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
+ /* UsageFault_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
+ /* SVCall_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0);
+ /* DebugMonitor_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
+ /* PendSV_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
+ /* SysTick_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
+
+
+}
+
+void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
+
+ GPIO_InitTypeDef GPIO_InitStruct;
+ if (hadc->Instance == ADC1) {
+ __HAL_RCC_ADC1_CLK_ENABLE()
+ ;
+
+ /* ADC1 DMA Init */
+ /* ADC1 Init */
+ hdma_adc1.Instance = DMA1_Channel1;
+ hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
+ hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
+ hdma_adc1.Init.Mode = DMA_CIRCULAR;
+ hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
+ HAL_DMA_Init(&hdma_adc1);
+
+ __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1);
+
+ /* ADC1 interrupt Init */
+ HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
+ } else {
+ __HAL_RCC_ADC2_CLK_ENABLE()
+ ;
+
+ /**ADC2 GPIO Configuration
+ PB0 ------> ADC2_IN8
+ PB1 ------> ADC2_IN9
+ */
+ GPIO_InitStruct.Pin = TIP_TEMP_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* ADC2 interrupt Init */
+ HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
+ }
+
+}
+
+void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
+
+ GPIO_InitTypeDef GPIO_InitStruct;
+ /**I2C1 GPIO Configuration
+ PB6 ------> I2C1_SCL
+ PB7 ------> I2C1_SDA
+ */
+ GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* Peripheral clock enable */
+ __HAL_RCC_I2C1_CLK_ENABLE()
+ ;
+ /* I2C1 DMA Init */
+ /* I2C1_RX Init */
+ hdma_i2c1_rx.Instance = DMA1_Channel7;
+ hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_i2c1_rx.Init.Mode = DMA_NORMAL;
+ hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_LOW;
+ HAL_DMA_Init(&hdma_i2c1_rx);
+
+ __HAL_LINKDMA(hi2c, hdmarx, hdma_i2c1_rx);
+
+ /* I2C1_TX Init */
+ hdma_i2c1_tx.Instance = DMA1_Channel6;
+ hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
+ hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
+ HAL_DMA_Init(&hdma_i2c1_tx);
+
+ __HAL_LINKDMA(hi2c, hdmatx, hdma_i2c1_tx);
+
+ /* I2C1 interrupt Init */
+ HAL_NVIC_SetPriority(I2C1_EV_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
+ HAL_NVIC_SetPriority(I2C1_ER_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
+
+}
+
+void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) {
+ if (htim_base->Instance == TIM3) {
+ /* Peripheral clock enable */
+ __HAL_RCC_TIM3_CLK_ENABLE()
+ ;
+ } else if (htim_base->Instance == TIM2) {
+ /* Peripheral clock enable */
+ __HAL_RCC_TIM2_CLK_ENABLE()
+ ;
+ }
+}
diff --git a/workspace/TS100/Core/Src/stm32f1xx_hal_timebase_TIM.c b/workspace/TS100/Core/BSP/Miniware/stm32f1xx_hal_timebase_TIM.c index 526e0e22..84a8ae55 100644 --- a/workspace/TS100/Core/Src/stm32f1xx_hal_timebase_TIM.c +++ b/workspace/TS100/Core/BSP/Miniware/stm32f1xx_hal_timebase_TIM.c @@ -1,158 +1,158 @@ -/** - ****************************************************************************** - * @file stm32f1xx_hal_timebase_TIM.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * This notice applies to any and all portions of this file - * that are not between comment pairs USER CODE BEGIN and - * USER CODE END. Other portions of this file, whether - * inserted by the user or by software development tools - * are owned by their respective copyright owners. - * - * Copyright (c) 2017 STMicroelectronics International N.V. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted, provided that the following conditions are met: - * - * 1. Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific written permission. - * 4. This software, including modifications and/or derivative works of this - * software, must execute solely and exclusively on microcontroller or - * microprocessor devices manufactured by or for STMicroelectronics. - * 5. Redistribution and use of this software other than as permitted under - * this license is void and will automatically terminate your rights under - * this license. - * - * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY - * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT - * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f1xx_hal.h" -#include "stm32f1xx_hal_tim.h" -/** @addtogroup STM32F7xx_HAL_Examples - * @{ - */ - -/** @addtogroup HAL_TimeBase - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim1; -uint32_t uwIncrementState = 0; -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief This function configures the TIM1 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priorty. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock = 0; - uint32_t uwPrescalerValue = 0; - uint32_t pFLatency; - - /*Configure the TIM1 IRQ priority */ - HAL_NVIC_SetPriority(TIM1_UP_IRQn, TickPriority ,0); - - /* Enable the TIM1 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM1_UP_IRQn); - - /* Enable TIM1 clock */ - __HAL_RCC_TIM1_CLK_ENABLE(); - - /* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - - /* Compute TIM1 clock */ - uwTimclock = HAL_RCC_GetPCLK2Freq(); - - /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1); - - /* Initialize TIM1 */ - htim1.Instance = TIM1; - - /* Initialize TIMx peripheral as follow: - + Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. - + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - + ClockDivision = 0 - + Counter direction = Up - */ - htim1.Init.Period = (1000000 / 1000) - 1; - htim1.Init.Prescaler = uwPrescalerValue; - htim1.Init.ClockDivision = 0; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - if(HAL_TIM_Base_Init(&htim1) == HAL_OK) - { - /* Start the TIM time Base generation in interrupt mode */ - return HAL_TIM_Base_Start_IT(&htim1); - } - - /* Return function status */ - return HAL_ERROR; -} - -/** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_SuspendTick(void) -{ - /* Disable TIM1 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); -} - -/** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_ResumeTick(void) -{ - /* Enable TIM1 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); -} - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/**
+ ******************************************************************************
+ * @file stm32f1xx_hal_timebase_TIM.c
+ * @brief HAL time base based on the hardware TIM.
+ ******************************************************************************
+ * This notice applies to any and all portions of this file
+ * that are not between comment pairs USER CODE BEGIN and
+ * USER CODE END. Other portions of this file, whether
+ * inserted by the user or by software development tools
+ * are owned by their respective copyright owners.
+ *
+ * Copyright (c) 2017 STMicroelectronics International N.V.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted, provided that the following conditions are met:
+ *
+ * 1. Redistribution of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of other
+ * contributors to this software may be used to endorse or promote products
+ * derived from this software without specific written permission.
+ * 4. This software, including modifications and/or derivative works of this
+ * software, must execute solely and exclusively on microcontroller or
+ * microprocessor devices manufactured by or for STMicroelectronics.
+ * 5. Redistribution and use of this software other than as permitted under
+ * this license is void and will automatically terminate your rights under
+ * this license.
+ *
+ * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
+ * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
+ * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f1xx_hal.h"
+#include "stm32f1xx_hal_tim.h"
+/** @addtogroup STM32F7xx_HAL_Examples
+ * @{
+ */
+
+/** @addtogroup HAL_TimeBase
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+TIM_HandleTypeDef htim1;
+uint32_t uwIncrementState = 0;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief This function configures the TIM1 as a time base source.
+ * The time source is configured to have 1ms time base with a dedicated
+ * Tick interrupt priority.
+ * @note This function is called automatically at the beginning of program after
+ * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
+ * @param TickPriority: Tick interrupt priorty.
+ * @retval HAL status
+ */
+HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
+{
+ RCC_ClkInitTypeDef clkconfig;
+ uint32_t uwTimclock = 0;
+ uint32_t uwPrescalerValue = 0;
+ uint32_t pFLatency;
+
+ /*Configure the TIM1 IRQ priority */
+ HAL_NVIC_SetPriority(TIM1_UP_IRQn, TickPriority ,0);
+
+ /* Enable the TIM1 global Interrupt */
+ HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
+
+ /* Enable TIM1 clock */
+ __HAL_RCC_TIM1_CLK_ENABLE();
+
+ /* Get clock configuration */
+ HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
+
+ /* Compute TIM1 clock */
+ uwTimclock = HAL_RCC_GetPCLK2Freq();
+
+ /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */
+ uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
+
+ /* Initialize TIM1 */
+ htim1.Instance = TIM1;
+
+ /* Initialize TIMx peripheral as follow:
+ + Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base.
+ + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ + ClockDivision = 0
+ + Counter direction = Up
+ */
+ htim1.Init.Period = (1000000 / 1000) - 1;
+ htim1.Init.Prescaler = uwPrescalerValue;
+ htim1.Init.ClockDivision = 0;
+ htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
+ if(HAL_TIM_Base_Init(&htim1) == HAL_OK)
+ {
+ /* Start the TIM time Base generation in interrupt mode */
+ return HAL_TIM_Base_Start_IT(&htim1);
+ }
+
+ /* Return function status */
+ return HAL_ERROR;
+}
+
+/**
+ * @brief Suspend Tick increment.
+ * @note Disable the tick increment by disabling TIM1 update interrupt.
+ * @param None
+ * @retval None
+ */
+void HAL_SuspendTick(void)
+{
+ /* Disable TIM1 update Interrupt */
+ __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE);
+}
+
+/**
+ * @brief Resume Tick increment.
+ * @note Enable the tick increment by Enabling TIM1 update interrupt.
+ * @param None
+ * @retval None
+ */
+void HAL_ResumeTick(void)
+{
+ /* Enable TIM1 Update interrupt */
+ __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/workspace/TS100/Core/Src/stm32f1xx_it.c b/workspace/TS100/Core/BSP/Miniware/stm32f1xx_it.c index e0047e08..b411c980 100644 --- a/workspace/TS100/Core/Src/stm32f1xx_it.c +++ b/workspace/TS100/Core/BSP/Miniware/stm32f1xx_it.c @@ -1,84 +1,84 @@ -// This is the stock standard STM interrupt file full of handlers -#include "stm32f1xx_hal.h" -#include "stm32f1xx.h" -#include "stm32f1xx_it.h" -#include "cmsis_os.h" -#include "Setup.h" - -extern TIM_HandleTypeDef htim1; //used for the systick - -/******************************************************************************/ -/* Cortex-M3 Processor Interruption and Exception Handlers */ -/******************************************************************************/ - -void NMI_Handler(void) { -} - -//We have the assembly for a breakpoint trigger here to halt the system when a debugger is connected -// Hardfault handler, often a screwup in the code -void HardFault_Handler(void) { -} - -// Memory management unit had an error -void MemManage_Handler(void) { -} - -// Prefetcher or busfault occured -void BusFault_Handler(void) { -} - -void UsageFault_Handler(void) { -} - -void DebugMon_Handler(void) { -} - -// Systick is used by FreeRTOS tick -void SysTick_Handler(void) { - osSystickHandler(); -} - -/******************************************************************************/ -/* STM32F1xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file. */ -/******************************************************************************/ - -// DMA used to move the ADC readings into system ram -void DMA1_Channel1_IRQHandler(void) { - HAL_DMA_IRQHandler(&hdma_adc1); -} -//ADC interrupt used for DMA -void ADC1_2_IRQHandler(void) { - HAL_ADC_IRQHandler(&hadc1); -} - -//Timer 1 has overflowed, used for HAL ticks -void TIM1_UP_IRQHandler(void) { - HAL_TIM_IRQHandler(&htim1); -} -//Timer 3 is used for the PWM output to the tip -void TIM3_IRQHandler(void) { - HAL_TIM_IRQHandler(&htim3); -} - -//Timer 2 is used for co-ordination of PWM & ADC -void TIM2_IRQHandler(void) { - HAL_TIM_IRQHandler(&htim2); -} - -void I2C1_EV_IRQHandler(void) { - HAL_I2C_EV_IRQHandler(&hi2c1); -} -void I2C1_ER_IRQHandler(void) { - HAL_I2C_ER_IRQHandler(&hi2c1); -} - -void DMA1_Channel6_IRQHandler(void) { - HAL_DMA_IRQHandler(&hdma_i2c1_tx); -} - -void DMA1_Channel7_IRQHandler(void) { - HAL_DMA_IRQHandler(&hdma_i2c1_rx); -} +// This is the stock standard STM interrupt file full of handlers
+#include "stm32f1xx_hal.h"
+#include "stm32f1xx.h"
+#include "stm32f1xx_it.h"
+#include "cmsis_os.h"
+#include "Setup.h"
+
+extern TIM_HandleTypeDef htim1; //used for the systick
+
+/******************************************************************************/
+/* Cortex-M3 Processor Interruption and Exception Handlers */
+/******************************************************************************/
+
+void NMI_Handler(void) {
+}
+
+//We have the assembly for a breakpoint trigger here to halt the system when a debugger is connected
+// Hardfault handler, often a screwup in the code
+void HardFault_Handler(void) {
+}
+
+// Memory management unit had an error
+void MemManage_Handler(void) {
+}
+
+// Prefetcher or busfault occured
+void BusFault_Handler(void) {
+}
+
+void UsageFault_Handler(void) {
+}
+
+void DebugMon_Handler(void) {
+}
+
+// Systick is used by FreeRTOS tick
+void SysTick_Handler(void) {
+ osSystickHandler();
+}
+
+/******************************************************************************/
+/* STM32F1xx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file. */
+/******************************************************************************/
+
+// DMA used to move the ADC readings into system ram
+void DMA1_Channel1_IRQHandler(void) {
+ HAL_DMA_IRQHandler(&hdma_adc1);
+}
+//ADC interrupt used for DMA
+void ADC1_2_IRQHandler(void) {
+ HAL_ADC_IRQHandler(&hadc1);
+}
+
+//Timer 1 has overflowed, used for HAL ticks
+void TIM1_UP_IRQHandler(void) {
+ HAL_TIM_IRQHandler(&htim1);
+}
+//Timer 3 is used for the PWM output to the tip
+void TIM3_IRQHandler(void) {
+ HAL_TIM_IRQHandler(&htim3);
+}
+
+//Timer 2 is used for co-ordination of PWM & ADC
+void TIM2_IRQHandler(void) {
+ HAL_TIM_IRQHandler(&htim2);
+}
+
+void I2C1_EV_IRQHandler(void) {
+ HAL_I2C_EV_IRQHandler(&hi2c1);
+}
+void I2C1_ER_IRQHandler(void) {
+ HAL_I2C_ER_IRQHandler(&hi2c1);
+}
+
+void DMA1_Channel6_IRQHandler(void) {
+ HAL_DMA_IRQHandler(&hdma_i2c1_tx);
+}
+
+void DMA1_Channel7_IRQHandler(void) {
+ HAL_DMA_IRQHandler(&hdma_i2c1_rx);
+}
diff --git a/workspace/TS100/Core/Src/system_stm32f1xx.c b/workspace/TS100/Core/BSP/Miniware/system_stm32f1xx.c index 662d38d6..dfff3485 100644 --- a/workspace/TS100/Core/Src/system_stm32f1xx.c +++ b/workspace/TS100/Core/BSP/Miniware/system_stm32f1xx.c @@ -1,317 +1,317 @@ -// This file was automatically generated by the STM Cube software -// And as such, is BSD licneced from STM -#include "stm32f1xx.h" - -#if !defined (HSI_VALUE) - #define HSI_VALUE 8000000U /*!< Default value of the Internal oscillator in Hz. - This value can be provided and adapted by the user application. */ -#endif /* HSI_VALUE */ - -/*!< Uncomment the following line if you need to use external SRAM */ -#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ -#ifndef LOCAL_BUILD -#define VECT_TAB_OFFSET 0x00004000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#else -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#warning LOCAL_BUILD SETUP - #endif -//We offset this by 0x4000 to because of the bootloader -/******************************************************************************* -* Clock Definitions -*******************************************************************************/ -#if defined(STM32F100xB) ||defined(STM32F100xE) - uint32_t SystemCoreClock = 24000000U; /*!< System Clock Frequency (Core Clock) */ -#else /*!< HSI Selected as System Clock source */ - uint32_t SystemCoreClock = 64000000U; /*!< System Clock Frequency (Core Clock) */ -#endif - -const uint8_t AHBPrescTable[16U] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -const uint8_t APBPrescTable[8U] = {0, 0, 0, 0, 1, 2, 3, 4}; - - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemCoreClock variable. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -void SystemInit (void) -{ - /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ - /* Set HSION bit */ - RCC->CR |= 0x00000001U; - - /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ -#if !defined(STM32F105xC) && !defined(STM32F107xC) - RCC->CFGR &= 0xF8FF0000U; -#else - RCC->CFGR &= 0xF0FF0000U; -#endif /* STM32F105xC */ - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= 0xFEF6FFFFU; - - /* Reset HSEBYP bit */ - RCC->CR &= 0xFFFBFFFFU; - - /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ - RCC->CFGR &= 0xFF80FFFFU; - -#if defined(STM32F105xC) || defined(STM32F107xC) - /* Reset PLL2ON and PLL3ON bits */ - RCC->CR &= 0xEBFFFFFFU; - - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x00FF0000U; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000U; -#elif defined(STM32F100xB) || defined(STM32F100xE) - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000U; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000U; -#else - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000U; -#endif /* STM32F105xC */ - -#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) - #ifdef DATA_IN_ExtSRAM - SystemInit_ExtMemCtl(); - #endif /* DATA_IN_ExtSRAM */ -#endif - -#ifdef VECT_TAB_SRAM - SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value - * 8 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value - * 8 MHz or 25 MHz, depending on the product used), user has to ensure - * that HSE_VALUE is same as the real frequency of the crystal used. - * Otherwise, this function may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * @param None - * @retval None - */ -void SystemCoreClockUpdate (void) -{ - uint32_t tmp = 0U, pllmull = 0U, pllsource = 0U; - -#if defined(STM32F105xC) || defined(STM32F107xC) - uint32_t prediv1source = 0U, prediv1factor = 0U, prediv2factor = 0U, pll2mull = 0U; -#endif /* STM32F105xC */ - -#if defined(STM32F100xB) || defined(STM32F100xE) - uint32_t prediv1factor = 0U; -#endif /* STM32F100xB or STM32F100xE */ - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00U: /* HSI used as system clock */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04U: /* HSE used as system clock */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08U: /* PLL used as system clock */ - - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; - pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; - -#if !defined(STM32F105xC) && !defined(STM32F107xC) - pllmull = ( pllmull >> 18U) + 2U; - - if (pllsource == 0x00U) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_VALUE >> 1U) * pllmull; - } - else - { - #if defined(STM32F100xB) || defined(STM32F100xE) - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U; - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; - #else - /* HSE selected as PLL clock entry */ - if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET) - {/* HSE oscillator clock divided by 2 */ - SystemCoreClock = (HSE_VALUE >> 1U) * pllmull; - } - else - { - SystemCoreClock = HSE_VALUE * pllmull; - } - #endif - } -#else - pllmull = pllmull >> 18U; - - if (pllmull != 0x0DU) - { - pllmull += 2U; - } - else - { /* PLL multiplication factor = PLL input clock * 6.5 */ - pllmull = 13U / 2U; - } - - if (pllsource == 0x00U) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_VALUE >> 1U) * pllmull; - } - else - {/* PREDIV1 selected as PLL clock entry */ - - /* Get PREDIV1 clock source and division factor */ - prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC; - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U; - - if (prediv1source == 0U) - { - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; - } - else - {/* PLL2 clock selected as PREDIV1 clock entry */ - - /* Get PREDIV2 division factor and PLL2 multiplication factor */ - prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4U) + 1U; - pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8U) + 2U; - SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; - } - } -#endif /* STM32F105xC */ - break; - - default: - SystemCoreClock = HSI_VALUE; - break; - } - - /* Compute HCLK clock frequency ----------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) -/** - * @brief Setup the external memory controller. Called in startup_stm32f1xx.s - * before jump to __main - * @param None - * @retval None - */ -#ifdef DATA_IN_ExtSRAM -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f1xx_xx.s/.c before jump to main. - * This function configures the external SRAM mounted on STM3210E-EVAL - * board (STM32 High density devices). This SRAM will be used as program - * data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmpreg; - /*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is - required, then adjust the Register Addresses */ - - /* Enable FSMC clock */ - RCC->AHBENR = 0x00000114U; - - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN); - - /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ - RCC->APB2ENR = 0x000001E0U; - - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN); - - (void)(tmpreg); - -/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ -/*---------------- SRAM Address lines configuration -------------------------*/ -/*---------------- NOE and NWE configuration --------------------------------*/ -/*---------------- NE3 configuration ----------------------------------------*/ -/*---------------- NBL0, NBL1 configuration ---------------------------------*/ - - GPIOD->CRL = 0x44BB44BBU; - GPIOD->CRH = 0xBBBBBBBBU; - - GPIOE->CRL = 0xB44444BBU; - GPIOE->CRH = 0xBBBBBBBBU; - - GPIOF->CRL = 0x44BBBBBBU; - GPIOF->CRH = 0xBBBB4444U; - - GPIOG->CRL = 0x44BBBBBBU; - GPIOG->CRH = 0x444B4B44U; - -/*---------------- FSMC Configuration ---------------------------------------*/ -/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ - - FSMC_Bank1->BTCR[4U] = 0x00001091U; - FSMC_Bank1->BTCR[5U] = 0x00110212U; -} -#endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +// This file was automatically generated by the STM Cube software
+// And as such, is BSD licneced from STM
+#include "stm32f1xx.h"
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE 8000000U /*!< Default value of the Internal oscillator in Hz.
+ This value can be provided and adapted by the user application. */
+#endif /* HSI_VALUE */
+
+/*!< Uncomment the following line if you need to use external SRAM */
+#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
+/* #define DATA_IN_ExtSRAM */
+#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */
+#ifndef LOCAL_BUILD
+#define VECT_TAB_OFFSET 0x00004000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+#else
+#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+#warning LOCAL_BUILD SETUP
+ #endif
+//We offset this by 0x4000 to because of the bootloader
+/*******************************************************************************
+* Clock Definitions
+*******************************************************************************/
+#if defined(STM32F100xB) ||defined(STM32F100xE)
+ uint32_t SystemCoreClock = 24000000U; /*!< System Clock Frequency (Core Clock) */
+#else /*!< HSI Selected as System Clock source */
+ uint32_t SystemCoreClock = 64000000U; /*!< System Clock Frequency (Core Clock) */
+#endif
+
+const uint8_t AHBPrescTable[16U] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
+const uint8_t APBPrescTable[8U] = {0, 0, 0, 0, 1, 2, 3, 4};
+
+
+/**
+ * @brief Setup the microcontroller system
+ * Initialize the Embedded Flash Interface, the PLL and update the
+ * SystemCoreClock variable.
+ * @note This function should be used only after reset.
+ * @param None
+ * @retval None
+ */
+void SystemInit (void)
+{
+ /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
+ /* Set HSION bit */
+ RCC->CR |= 0x00000001U;
+
+ /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
+#if !defined(STM32F105xC) && !defined(STM32F107xC)
+ RCC->CFGR &= 0xF8FF0000U;
+#else
+ RCC->CFGR &= 0xF0FF0000U;
+#endif /* STM32F105xC */
+
+ /* Reset HSEON, CSSON and PLLON bits */
+ RCC->CR &= 0xFEF6FFFFU;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
+ RCC->CFGR &= 0xFF80FFFFU;
+
+#if defined(STM32F105xC) || defined(STM32F107xC)
+ /* Reset PLL2ON and PLL3ON bits */
+ RCC->CR &= 0xEBFFFFFFU;
+
+ /* Disable all interrupts and clear pending bits */
+ RCC->CIR = 0x00FF0000U;
+
+ /* Reset CFGR2 register */
+ RCC->CFGR2 = 0x00000000U;
+#elif defined(STM32F100xB) || defined(STM32F100xE)
+ /* Disable all interrupts and clear pending bits */
+ RCC->CIR = 0x009F0000U;
+
+ /* Reset CFGR2 register */
+ RCC->CFGR2 = 0x00000000U;
+#else
+ /* Disable all interrupts and clear pending bits */
+ RCC->CIR = 0x009F0000U;
+#endif /* STM32F105xC */
+
+#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
+ #ifdef DATA_IN_ExtSRAM
+ SystemInit_ExtMemCtl();
+ #endif /* DATA_IN_ExtSRAM */
+#endif
+
+#ifdef VECT_TAB_SRAM
+ SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
+#else
+ SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
+#endif
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
+ * or HSI_VALUE(*) multiplied by the PLL factors.
+ *
+ * (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value
+ * 8 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value
+ * 8 MHz or 25 MHz, depending on the product used), user has to ensure
+ * that HSE_VALUE is same as the real frequency of the crystal used.
+ * Otherwise, this function may have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate (void)
+{
+ uint32_t tmp = 0U, pllmull = 0U, pllsource = 0U;
+
+#if defined(STM32F105xC) || defined(STM32F107xC)
+ uint32_t prediv1source = 0U, prediv1factor = 0U, prediv2factor = 0U, pll2mull = 0U;
+#endif /* STM32F105xC */
+
+#if defined(STM32F100xB) || defined(STM32F100xE)
+ uint32_t prediv1factor = 0U;
+#endif /* STM32F100xB or STM32F100xE */
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ tmp = RCC->CFGR & RCC_CFGR_SWS;
+
+ switch (tmp)
+ {
+ case 0x00U: /* HSI used as system clock */
+ SystemCoreClock = HSI_VALUE;
+ break;
+ case 0x04U: /* HSE used as system clock */
+ SystemCoreClock = HSE_VALUE;
+ break;
+ case 0x08U: /* PLL used as system clock */
+
+ /* Get PLL clock source and multiplication factor ----------------------*/
+ pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
+ pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
+
+#if !defined(STM32F105xC) && !defined(STM32F107xC)
+ pllmull = ( pllmull >> 18U) + 2U;
+
+ if (pllsource == 0x00U)
+ {
+ /* HSI oscillator clock divided by 2 selected as PLL clock entry */
+ SystemCoreClock = (HSI_VALUE >> 1U) * pllmull;
+ }
+ else
+ {
+ #if defined(STM32F100xB) || defined(STM32F100xE)
+ prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U;
+ /* HSE oscillator clock selected as PREDIV1 clock entry */
+ SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
+ #else
+ /* HSE selected as PLL clock entry */
+ if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET)
+ {/* HSE oscillator clock divided by 2 */
+ SystemCoreClock = (HSE_VALUE >> 1U) * pllmull;
+ }
+ else
+ {
+ SystemCoreClock = HSE_VALUE * pllmull;
+ }
+ #endif
+ }
+#else
+ pllmull = pllmull >> 18U;
+
+ if (pllmull != 0x0DU)
+ {
+ pllmull += 2U;
+ }
+ else
+ { /* PLL multiplication factor = PLL input clock * 6.5 */
+ pllmull = 13U / 2U;
+ }
+
+ if (pllsource == 0x00U)
+ {
+ /* HSI oscillator clock divided by 2 selected as PLL clock entry */
+ SystemCoreClock = (HSI_VALUE >> 1U) * pllmull;
+ }
+ else
+ {/* PREDIV1 selected as PLL clock entry */
+
+ /* Get PREDIV1 clock source and division factor */
+ prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC;
+ prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U;
+
+ if (prediv1source == 0U)
+ {
+ /* HSE oscillator clock selected as PREDIV1 clock entry */
+ SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
+ }
+ else
+ {/* PLL2 clock selected as PREDIV1 clock entry */
+
+ /* Get PREDIV2 division factor and PLL2 multiplication factor */
+ prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4U) + 1U;
+ pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8U) + 2U;
+ SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull;
+ }
+ }
+#endif /* STM32F105xC */
+ break;
+
+ default:
+ SystemCoreClock = HSI_VALUE;
+ break;
+ }
+
+ /* Compute HCLK clock frequency ----------------*/
+ /* Get HCLK prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)];
+ /* HCLK clock frequency */
+ SystemCoreClock >>= tmp;
+}
+
+#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
+/**
+ * @brief Setup the external memory controller. Called in startup_stm32f1xx.s
+ * before jump to __main
+ * @param None
+ * @retval None
+ */
+#ifdef DATA_IN_ExtSRAM
+/**
+ * @brief Setup the external memory controller.
+ * Called in startup_stm32f1xx_xx.s/.c before jump to main.
+ * This function configures the external SRAM mounted on STM3210E-EVAL
+ * board (STM32 High density devices). This SRAM will be used as program
+ * data memory (including heap and stack).
+ * @param None
+ * @retval None
+ */
+void SystemInit_ExtMemCtl(void)
+{
+ __IO uint32_t tmpreg;
+ /*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is
+ required, then adjust the Register Addresses */
+
+ /* Enable FSMC clock */
+ RCC->AHBENR = 0x00000114U;
+
+ /* Delay after an RCC peripheral clock enabling */
+ tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN);
+
+ /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */
+ RCC->APB2ENR = 0x000001E0U;
+
+ /* Delay after an RCC peripheral clock enabling */
+ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);
+
+ (void)(tmpreg);
+
+/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/
+/*---------------- SRAM Address lines configuration -------------------------*/
+/*---------------- NOE and NWE configuration --------------------------------*/
+/*---------------- NE3 configuration ----------------------------------------*/
+/*---------------- NBL0, NBL1 configuration ---------------------------------*/
+
+ GPIOD->CRL = 0x44BB44BBU;
+ GPIOD->CRH = 0xBBBBBBBBU;
+
+ GPIOE->CRL = 0xB44444BBU;
+ GPIOE->CRH = 0xBBBBBBBBU;
+
+ GPIOF->CRL = 0x44BBBBBBU;
+ GPIOF->CRH = 0xBBBB4444U;
+
+ GPIOG->CRL = 0x44BBBBBBU;
+ GPIOG->CRH = 0x444B4B44U;
+
+/*---------------- FSMC Configuration ---------------------------------------*/
+/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/
+
+ FSMC_Bank1->BTCR[4U] = 0x00001091U;
+ FSMC_Bank1->BTCR[5U] = 0x00110212U;
+}
+#endif /* DATA_IN_ExtSRAM */
+#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/workspace/TS100/Core/Drivers/Buttons.cpp b/workspace/TS100/Core/Drivers/Buttons.cpp new file mode 100644 index 00000000..beca08b1 --- /dev/null +++ b/workspace/TS100/Core/Drivers/Buttons.cpp @@ -0,0 +1,115 @@ +/*
+ * Buttons.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+#include <Buttons.hpp>
+#include "FreeRTOS.h"
+#include "task.h"
+#include "gui.hpp"
+uint32_t lastButtonTime = 0;
+
+ButtonState getButtonState() {
+ /*
+ * Read in the buttons and then determine if a state change needs to occur
+ */
+
+ /*
+ * If the previous state was 00 Then we want to latch the new state if
+ * different & update time
+ * If the previous state was !00 Then we want to search if we trigger long
+ * press (buttons still down), or if release we trigger press
+ * (downtime>filter)
+ */
+ static uint8_t previousState = 0;
+ static uint32_t previousStateChange = 0;
+ const uint16_t timeout = 40;
+ uint8_t currentState;
+ currentState = (getButtonA()) << 0;
+ currentState |= (getButtonB()) << 1;
+
+ if (currentState)
+ lastButtonTime = xTaskGetTickCount();
+ if (currentState == previousState) {
+ if (currentState == 0)
+ return BUTTON_NONE;
+ if ((xTaskGetTickCount() - previousStateChange) > timeout) {
+ // User has been holding the button down
+ // We want to send a button is held message
+ if (currentState == 0x01)
+ return BUTTON_F_LONG;
+ else if (currentState == 0x02)
+ return BUTTON_B_LONG;
+ else
+ return BUTTON_NONE; // Both being held case, we dont long hold this
+ } else
+ return BUTTON_NONE;
+ } else {
+ // A change in button state has occurred
+ ButtonState retVal = BUTTON_NONE;
+ if (currentState) {
+ // User has pressed a button down (nothing done on down)
+ if (currentState != previousState) {
+ // There has been a change in the button states
+ // If there is a rising edge on one of the buttons from double press we
+ // want to mask that out As users are having issues with not release
+ // both at once
+ if (previousState == 0x03)
+ currentState = 0x03;
+ }
+ } else {
+ // 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 ((xTaskGetTickCount() - previousStateChange) < timeout) {
+ // The user didn't hold the button for long
+ // So we send button press
+
+ if (previousState == 0x01)
+ retVal = BUTTON_F_SHORT;
+ else if (previousState == 0x02)
+ retVal = BUTTON_B_SHORT;
+ else
+ retVal = BUTTON_BOTH; // Both being held case
+ }
+ }
+ previousState = currentState;
+ previousStateChange = xTaskGetTickCount();
+ return retVal;
+ }
+ return BUTTON_NONE;
+}
+
+void waitForButtonPress() {
+ // we are just lazy and sleep until user confirms button press
+ // This also eats the button press event!
+ ButtonState buttons = getButtonState();
+ while (buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ }
+ while (!buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ }
+}
+
+void waitForButtonPressOrTimeout(uint32_t timeout) {
+ timeout += xTaskGetTickCount();
+ // calculate the exit point
+
+ ButtonState buttons = getButtonState();
+ while (buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ if (xTaskGetTickCount() > timeout)
+ return;
+ }
+ while (!buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ if (xTaskGetTickCount() > timeout)
+ return;
+ }
+}
diff --git a/workspace/TS100/Core/Drivers/Buttons.hpp b/workspace/TS100/Core/Drivers/Buttons.hpp new file mode 100644 index 00000000..fb4b1991 --- /dev/null +++ b/workspace/TS100/Core/Drivers/Buttons.hpp @@ -0,0 +1,35 @@ +/*
+ * Buttons.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+#include "BSP.h"
+#ifndef INC_BUTTONS_H_
+#define INC_BUTTONS_H_
+
+extern uint32_t lastButtonTime;
+
+enum ButtonState {
+ BUTTON_NONE = 0, /* No buttons pressed / < filter time*/
+ BUTTON_F_SHORT = 1, /* User has pressed the front button*/
+ BUTTON_B_SHORT = 2, /* User has pressed the back button*/
+ BUTTON_F_LONG = 4, /* User is holding the front button*/
+ BUTTON_B_LONG = 8, /* User is holding the back button*/
+ BUTTON_BOTH = 16, /* User has pressed both buttons*/
+
+/*
+ * Note:
+ * Pressed means press + release, we trigger on a full \__/ pulse
+ * holding means it has gone low, and been low for longer than filter time
+ */
+};
+
+//Returns what buttons are pressed (if any)
+ButtonState getButtonState();
+//Helpers
+void waitForButtonPressOrTimeout(uint32_t timeout);
+void waitForButtonPress();
+
+
+#endif /* INC_BUTTONS_H_ */
diff --git a/workspace/TS100/Core/Inc/Font.h b/workspace/TS100/Core/Drivers/Font.h index 07139044..761b2723 100644 --- a/workspace/TS100/Core/Inc/Font.h +++ b/workspace/TS100/Core/Drivers/Font.h @@ -1,192 +1,192 @@ -/* - * Font.h - * - * Created on: 17 Sep 2016 - * Author: Ralim - * - * ... This file contains the font... - */ - -#ifndef FONT_H_ -#define FONT_H_ -#include "Translation.h" - -#define FONT_12_WIDTH 12 -// FONTS ARE NO LONGER HERE, MOVED TO PYTHON AUTO GEN - - -const uint8_t ExtraFontChars[] = { - //width = 12 - //height = 16 - 0x00,0x18,0x24,0x24,0x18,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x02,0x02,0x02,0x00,0x00,0x00, // Degrees F - 0x00,0x18,0x24,0x24,0x18,0x80,0x40,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x10,0x10,0x10,0x00,0x00, // Degrees C - 0x00,0x00,0x20,0x30,0x38,0xFC,0xFE,0xFC,0x38,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00, // UP arrow - - 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x00, // Battery Empty - 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x50,0x50,0x50,0x50,0x50,0x50,0x40,0x3F,0x00, // Battery 1*/ - 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x58,0x58,0x58,0x58,0x58,0x58,0x40,0x3F,0x00, // Battery 2*/ - 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5C,0x5C,0x5C,0x5C,0x5C,0x5C,0x40,0x3F,0x00, // Battery 3*/ - 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5E,0x5E,0x5E,0x5E,0x5E,0x5E,0x40,0x3F,0x00, // Battery 4*/ - 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 5*/ - 0x00,0xF0,0x08,0x8E,0x82,0x82,0x82,0x82,0x8E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 6*/ - 0x00,0xF0,0x08,0xCE,0xC2,0xC2,0xC2,0xC2,0xCE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 7*/ - 0x00,0xF0,0x08,0xEE,0xE2,0xE2,0xE2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 8*/ - 0x00,0xF0,0x08,0xEE,0xE2,0xF2,0xF2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 9*/ - 0x00,0xF0,0x08,0xEE,0xE2,0xFA,0xFA,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 10*/ - - 0x00,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x00,0x00,0x38,0x3A,0x39,0x38,0x3A,0x39,0x38,0x3A,0x39,0x10,0x10, // heating - 0x00,0x60,0xE0,0xFE,0xE0,0xE0,0xE0,0xE0,0xFE,0xE0,0x60,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00, // AC - - 0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x82,0x62,0x1A,0x02,0xFC,0x3F,0x40,0x42,0x46,0x4C,0x58,0x46,0x41,0x40,0x40,0x40,0x3F, // ☑ (check box on, menu true) - 0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFC,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F, // ☐ (check box off, menu false) - - /* - 0x00,0x00,0x00,0x80,0x80,0xFE,0xFF,0x83,0x87,0x06,0x00,0x00,0x00,0x00,0x30,0x70,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00, // Function? - 0x00,0x70,0xFA,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xFF,0xFE,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // a_ - 0x00,0x3C,0x7E,0xE7,0xC3,0xC3,0xC3,0xC3,0xE7,0x7E,0x3C,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 0_ - 0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00, // 25% block - 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55, // 50% pipe - 0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF, // 75% block - 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // | pipe - 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // T pipe ,| - 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // ,| double pipe - 0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // || double pipe - 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME? - 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x00,0x00,0x00,0x00,0x00, // ,^ double pupe - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME? - 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // ,> pipe - 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // _|_ pipe - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // ,|, pipe - 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // |, pipe - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME? - 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME? - 0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // ,> double pipe - 0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ^, double pipe - 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // _|_ double pipe - 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ,|, double pipe - 0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // |, double pipe - 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // == double pipe - 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // #NAME?//#NAME? - 0x00,0x00,0x00,0x78,0xFC,0xCC,0x8C,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x3E,0x33,0x33,0x3F,0x1E,0x00,0x00,0x00, // Delta lowercase - 0x00,0x00,0x00,0x00,0x00,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 27 (') - 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00, // ,^ pipe - 0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // | , pipe - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // solid block - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // half block bottom - 0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00, // 7C (|) - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // top half solid block - 0x00,0x00,0x0C,0xFC,0xFC,0x6C,0x60,0x60,0xE0,0xC0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE small - 0x00,0x00,0x03,0xFF,0xFF,0x1B,0x18,0x18,0xF8,0xF0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE large - 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ? (,) - 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00, // = - 0x00,0x00,0x00,0x40,0x80,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // sideways comma - 0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x01,0x03,0x01,0x00,0x00, // .. - 0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x00,0x00, // . - 0x00,0x00,0x02,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // tiny 1 - 0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00, // small block - */ -}; - -const uint8_t FontSymbols[] = { - 0x00,0x00,0x00,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00, // Right block - 0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x00,0x00,0x00, // left block - 0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // UD arrow - 0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x00,0x00,0x37,0x37,0x00,0x00,0x00, // !! - 0x00,0x38,0x7C,0xC6,0x82,0xFE,0xFE,0x02,0xFE,0xFE,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x3F,0x3F,0x00,0x00, // paragraph - 0x00,0x00,0xDC,0xFE,0x22,0x22,0x22,0x22,0xE6,0xC4,0x00,0x00,0x00,0x00,0x08,0x19,0x11,0x11,0x11,0x11,0x1F,0x0E,0x00,0x00, // section - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x00, // cursor - 0x00,0x00,0x00,0x08,0x0C,0x0E,0xFF,0x0E,0x0C,0x08,0x00,0x00,0x00,0x00,0x00,0x44,0x4C,0x5C,0x7F,0x5C,0x4C,0x44,0x00,0x00, // UD arrow - 0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, // UP arrow - 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // Down arrow - 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x01,0x00,0x00, // right arrow - 0x00,0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00, // left arrow - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - 0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x07,0x03,0x01,0x00, // LR arrow - 0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04, // UP block - 0x00,0x20,0x60,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x60,0x20,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x03,0x01,0x00,0x00,0x00 // Down block -}; - -const uint8_t WarningBlock24[] = { - //width = 24 - //height = 16 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0x0C,0x02,0xF1,0xF1,0xF1,0x02,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0xC0,0xB0,0x8C,0x83,0x80,0x80,0x80,0x80,0xB3,0xB3,0xB3,0x80,0x80,0x80,0x80,0x83,0x8C,0xB0,0xC0,0x00,0x00 -}; - -const uint8_t idleScreenBG[] = { - //width = 84 - //height = 16 - 0x00,0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81, - 0x81,0x81,0x81,0x81,0xC1,0xE1,0x61,0x61,0x61,0x41,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02, - 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, - 0x99,0x65,0x01,0x01,0x81,0x41,0x01,0x02,0x02,0x04,0x18,0xE0, - 0x00,0x07,0x18,0x20,0x40,0x40,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81, - 0x81,0x81,0x81,0x81,0x83,0x87,0x86,0x86,0x86,0x82,0x80,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40, - 0x80,0x82,0x87,0x85,0x85,0x85,0x85,0x87,0x87,0x85,0x87,0x85,0x87,0x87,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x92, - 0x8A,0x84,0x82,0x81,0x80,0x80,0x80,0x40,0x40,0x20,0x18,0x07 -}; - -const uint8_t idleScreenBGF[] = { - //width = 84 - //height = 16 - 0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x81,0x01,0x01,0x65,0x99,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, - 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02, - 0x01,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0xC1, - 0xE1,0x61,0x61,0x61,0x41,0x01,0x02,0x02,0x04,0x18,0xE0,0x00, - 0x07,0x18,0x20,0x40,0x40,0x80,0x80,0x80,0x81,0x82,0x84,0x8A,0x92,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x87,0x87, - 0x85,0x87,0x85,0x87,0x87,0x85,0x85,0x85,0x85,0x87,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40, - 0x80,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x83, - 0x87,0x86,0x86,0x86,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00 -}; - -/* - * 16x16 icons - * */ -const uint8_t SettingsMenuIcons[] = { - - // Soldering - //width = 16 - //height = 16 - 0x00, 0x02, 0x04, 0x08, 0x12, 0x24, 0xC4, 0x42, 0x82, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x07, 0x0A, 0x14, 0x28, 0x50, - 0x60, 0x00, - - - - //Sleep - //width = 16 - //height = 16 - 0x00, 0xC6, 0xE6, 0xF6, 0xBE, 0x9E, 0x8E, 0x86, 0x00, 0x00, - 0x40, 0x40, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x45, 0x65, 0x75, 0x5D, 0x4C, 0x00, 0x06, 0x07, 0x07, 0x05, - 0x04, 0x00, - - - - //Menu - //width = 16 - //height = 16 - 0x00,0x80,0x06,0x86,0x46,0x06,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x00, - 0x00,0x00,0x61,0x60,0x00,0x00,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x00, - - //Wrench - ///width = 16 - //height = 16 - 0x00, 0x18, 0x30, 0x32, 0x7E, 0x7C, 0xF0, 0xC0, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0x3E, 0x7E, 0x4C, 0x0C, - 0x18, 0x00, - #ifdef NOTUSED - //Calibration (Not used, kept for future menu layouts) - //width = 16 - //height = 16 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE8, 0x70, - 0x7A, 0x5E, 0x8E, 0x1C, 0x30, 0x00, 0x00, 0x10, 0x38, 0x1C, - 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, - #endif -}; - - -#endif /* FONT_H_ */ +/*
+ * Font.h
+ *
+ * Created on: 17 Sep 2016
+ * Author: Ralim
+ *
+ * ... This file contains the font...
+ */
+
+#ifndef FONT_H_
+#define FONT_H_
+#include "Translation.h"
+
+#define FONT_12_WIDTH 12
+// THE MAIN FONTS ARE NO LONGER HERE, MOVED TO PYTHON AUTO GEN
+// THESE ARE ONLY THE SYMBOL FONTS
+
+const uint8_t ExtraFontChars[] = {
+ //width = 12
+ //height = 16
+ 0x00,0x18,0x24,0x24,0x18,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x02,0x02,0x02,0x00,0x00,0x00, // Degrees F
+ 0x00,0x18,0x24,0x24,0x18,0x80,0x40,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x10,0x10,0x10,0x00,0x00, // Degrees C
+ 0x00,0x00,0x20,0x30,0x38,0xFC,0xFE,0xFC,0x38,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00, // UP arrow
+
+ 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x00, // Battery Empty
+ 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x50,0x50,0x50,0x50,0x50,0x50,0x40,0x3F,0x00, // Battery 1*/
+ 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x58,0x58,0x58,0x58,0x58,0x58,0x40,0x3F,0x00, // Battery 2*/
+ 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5C,0x5C,0x5C,0x5C,0x5C,0x5C,0x40,0x3F,0x00, // Battery 3*/
+ 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5E,0x5E,0x5E,0x5E,0x5E,0x5E,0x40,0x3F,0x00, // Battery 4*/
+ 0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 5*/
+ 0x00,0xF0,0x08,0x8E,0x82,0x82,0x82,0x82,0x8E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 6*/
+ 0x00,0xF0,0x08,0xCE,0xC2,0xC2,0xC2,0xC2,0xCE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 7*/
+ 0x00,0xF0,0x08,0xEE,0xE2,0xE2,0xE2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 8*/
+ 0x00,0xF0,0x08,0xEE,0xE2,0xF2,0xF2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 9*/
+ 0x00,0xF0,0x08,0xEE,0xE2,0xFA,0xFA,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 10*/
+
+ 0x00,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x00,0x00,0x38,0x3A,0x39,0x38,0x3A,0x39,0x38,0x3A,0x39,0x10,0x10, // heating
+ 0x00,0x60,0xE0,0xFE,0xE0,0xE0,0xE0,0xE0,0xFE,0xE0,0x60,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00, // AC
+
+ 0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x82,0x62,0x1A,0x02,0xFC,0x3F,0x40,0x42,0x46,0x4C,0x58,0x46,0x41,0x40,0x40,0x40,0x3F, // ☑ (check box on, menu true)
+ 0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFC,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F, // ☐ (check box off, menu false)
+
+ /*
+ 0x00,0x00,0x00,0x80,0x80,0xFE,0xFF,0x83,0x87,0x06,0x00,0x00,0x00,0x00,0x30,0x70,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00, // Function?
+ 0x00,0x70,0xFA,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xFF,0xFE,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // a_
+ 0x00,0x3C,0x7E,0xE7,0xC3,0xC3,0xC3,0xC3,0xE7,0x7E,0x3C,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 0_
+ 0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00, // 25% block
+ 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55, // 50% pipe
+ 0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF, // 75% block
+ 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // | pipe
+ 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // T pipe ,|
+ 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // ,| double pipe
+ 0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // || double pipe
+ 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME?
+ 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x00,0x00,0x00,0x00,0x00, // ,^ double pupe
+ 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME?
+ 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // ,> pipe
+ 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // _|_ pipe
+ 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // ,|, pipe
+ 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // |, pipe
+ 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME?
+ 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME?
+ 0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // ,> double pipe
+ 0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ^, double pipe
+ 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // _|_ double pipe
+ 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ,|, double pipe
+ 0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // |, double pipe
+ 0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // == double pipe
+ 0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // #NAME?//#NAME?
+ 0x00,0x00,0x00,0x78,0xFC,0xCC,0x8C,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x3E,0x33,0x33,0x3F,0x1E,0x00,0x00,0x00, // Delta lowercase
+ 0x00,0x00,0x00,0x00,0x00,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 27 (')
+ 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00, // ,^ pipe
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // | , pipe
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // solid block
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // half block bottom
+ 0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00, // 7C (|)
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // top half solid block
+ 0x00,0x00,0x0C,0xFC,0xFC,0x6C,0x60,0x60,0xE0,0xC0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE small
+ 0x00,0x00,0x03,0xFF,0xFF,0x1B,0x18,0x18,0xF8,0xF0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE large
+ 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ? (,)
+ 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00, // =
+ 0x00,0x00,0x00,0x40,0x80,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // sideways comma
+ 0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x01,0x03,0x01,0x00,0x00, // ..
+ 0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x00,0x00, // .
+ 0x00,0x00,0x02,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // tiny 1
+ 0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00, // small block
+ */
+};
+
+const uint8_t FontSymbols[] = {
+ 0x00,0x00,0x00,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00, // Right block
+ 0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x00,0x00,0x00, // left block
+ 0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // UD arrow
+ 0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x00,0x00,0x37,0x37,0x00,0x00,0x00, // !!
+ 0x00,0x38,0x7C,0xC6,0x82,0xFE,0xFE,0x02,0xFE,0xFE,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x3F,0x3F,0x00,0x00, // paragraph
+ 0x00,0x00,0xDC,0xFE,0x22,0x22,0x22,0x22,0xE6,0xC4,0x00,0x00,0x00,0x00,0x08,0x19,0x11,0x11,0x11,0x11,0x1F,0x0E,0x00,0x00, // section
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x00, // cursor
+ 0x00,0x00,0x00,0x08,0x0C,0x0E,0xFF,0x0E,0x0C,0x08,0x00,0x00,0x00,0x00,0x00,0x44,0x4C,0x5C,0x7F,0x5C,0x4C,0x44,0x00,0x00, // UD arrow
+ 0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, // UP arrow
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // Down arrow
+ 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x01,0x00,0x00, // right arrow
+ 0x00,0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00, // left arrow
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
+ 0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x07,0x03,0x01,0x00, // LR arrow
+ 0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04, // UP block
+ 0x00,0x20,0x60,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x60,0x20,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x03,0x01,0x00,0x00,0x00 // Down block
+};
+
+const uint8_t WarningBlock24[] = {
+ //width = 24
+ //height = 16
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0x0C,0x02,0xF1,0xF1,0xF1,0x02,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xC0,0xB0,0x8C,0x83,0x80,0x80,0x80,0x80,0xB3,0xB3,0xB3,0x80,0x80,0x80,0x80,0x83,0x8C,0xB0,0xC0,0x00,0x00
+};
+
+const uint8_t idleScreenBG[] = {
+ //width = 84
+ //height = 16
+ 0x00,0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
+ 0x81,0x81,0x81,0x81,0xC1,0xE1,0x61,0x61,0x61,0x41,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+ 0x99,0x65,0x01,0x01,0x81,0x41,0x01,0x02,0x02,0x04,0x18,0xE0,
+ 0x00,0x07,0x18,0x20,0x40,0x40,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
+ 0x81,0x81,0x81,0x81,0x83,0x87,0x86,0x86,0x86,0x82,0x80,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40,
+ 0x80,0x82,0x87,0x85,0x85,0x85,0x85,0x87,0x87,0x85,0x87,0x85,0x87,0x87,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x92,
+ 0x8A,0x84,0x82,0x81,0x80,0x80,0x80,0x40,0x40,0x20,0x18,0x07
+};
+
+const uint8_t idleScreenBGF[] = {
+ //width = 84
+ //height = 16
+ 0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x81,0x01,0x01,0x65,0x99,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02,
+ 0x01,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0xC1,
+ 0xE1,0x61,0x61,0x61,0x41,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,
+ 0x07,0x18,0x20,0x40,0x40,0x80,0x80,0x80,0x81,0x82,0x84,0x8A,0x92,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x87,0x87,
+ 0x85,0x87,0x85,0x87,0x87,0x85,0x85,0x85,0x85,0x87,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40,
+ 0x80,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x83,
+ 0x87,0x86,0x86,0x86,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00
+};
+
+/*
+ * 16x16 icons
+ * */
+const uint8_t SettingsMenuIcons[] = {
+
+ // Soldering
+ //width = 16
+ //height = 16
+ 0x00, 0x02, 0x04, 0x08, 0x12, 0x24, 0xC4, 0x42, 0x82, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x07, 0x0A, 0x14, 0x28, 0x50,
+ 0x60, 0x00,
+
+
+
+ //Sleep
+ //width = 16
+ //height = 16
+ 0x00, 0xC6, 0xE6, 0xF6, 0xBE, 0x9E, 0x8E, 0x86, 0x00, 0x00,
+ 0x40, 0x40, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x45, 0x65, 0x75, 0x5D, 0x4C, 0x00, 0x06, 0x07, 0x07, 0x05,
+ 0x04, 0x00,
+
+
+
+ //Menu
+ //width = 16
+ //height = 16
+ 0x00,0x80,0x06,0x86,0x46,0x06,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x00,
+ 0x00,0x00,0x61,0x60,0x00,0x00,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x00,
+
+ //Wrench
+ ///width = 16
+ //height = 16
+ 0x00, 0x18, 0x30, 0x32, 0x7E, 0x7C, 0xF0, 0xC0, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0x3E, 0x7E, 0x4C, 0x0C,
+ 0x18, 0x00,
+ #ifdef NOTUSED
+ //Calibration (Not used, kept for future menu layouts)
+ //width = 16
+ //height = 16
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE8, 0x70,
+ 0x7A, 0x5E, 0x8E, 0x1C, 0x30, 0x00, 0x00, 0x10, 0x38, 0x1C,
+ 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ #endif
+};
+
+
+#endif /* FONT_H_ */
diff --git a/workspace/TS100/Core/Inc/FRToSI2C.hpp b/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp index f1515929..3753a481 100644 --- a/workspace/TS100/Core/Inc/FRToSI2C.hpp +++ b/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp @@ -1,44 +1,52 @@ -/* - * FRToSI2C.hpp - * - * Created on: 14Apr.,2018 - * Author: Ralim - */ - -#ifndef FRTOSI2C_HPP_ -#define FRTOSI2C_HPP_ -#include "stm32f1xx_hal.h" -#include "cmsis_os.h" - -class FRToSI2C { -public: - - static void init(I2C_HandleTypeDef *i2chandle) { - i2c = i2chandle; - I2CSemaphore = nullptr; - } - - static void FRToSInit() { - I2CSemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer); - xSemaphoreGive(I2CSemaphore); - } - - static void CpltCallback(); //Normal Tx Callback - - static void Mem_Read(uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - static void Mem_Write(uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - - static void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size); - static void I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data); - static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg); - -private: - static I2C_HandleTypeDef *i2c; - static void I2C1_ClearBusyFlagErratum(); - static SemaphoreHandle_t I2CSemaphore; - static StaticSemaphore_t xSemaphoreBuffer; -}; - -#endif /* FRTOSI2C_HPP_ */ +/*
+ * FRToSI2C.hpp
+ *
+ * Created on: 14Apr.,2018
+ * Author: Ralim
+ */
+
+#ifndef FRTOSI2C_HPP_
+#define FRTOSI2C_HPP_
+
+#include "cmsis_os.h"
+
+/*
+ * Wrapper class to work with the device I2C bus
+ *
+ * This provides mutex protection of the peripheral
+ * Also allows hardware to use DMA should it want to
+ *
+ *
+ */
+class FRToSI2C {
+public:
+
+ static void init() {
+ I2CSemaphore = nullptr;
+ }
+
+ static void FRToSInit() {
+ I2CSemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer);
+ xSemaphoreGive(I2CSemaphore);
+ }
+
+ static void CpltCallback(); //Normal Tx Callback
+
+ static bool Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
+ uint8_t *pData, uint16_t Size);
+ static void Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
+ uint8_t *pData, uint16_t Size);
+ //Returns true if device ACK's being addressed
+ static bool probe(uint16_t DevAddress);
+
+ static void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
+ static void I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data);
+ static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg);
+
+private:
+ static void I2C_Unstick();
+ static SemaphoreHandle_t I2CSemaphore;
+ static StaticSemaphore_t xSemaphoreBuffer;
+};
+
+#endif /* FRTOSI2C_HPP_ */
diff --git a/workspace/TS100/Core/Drivers/LIS2DH12.cpp b/workspace/TS100/Core/Drivers/LIS2DH12.cpp new file mode 100644 index 00000000..888e1231 --- /dev/null +++ b/workspace/TS100/Core/Drivers/LIS2DH12.cpp @@ -0,0 +1,52 @@ +/*
+ * LIS2DH12.cpp
+ *
+ * Created on: 27Feb.,2018
+ * Author: Ralim
+ */
+
+#include <array>
+
+#include "LIS2DH12.hpp"
+#include "cmsis_os.h"
+
+typedef struct {
+ const uint8_t reg;
+ const uint8_t value;
+} LIS_REG;
+
+static const LIS_REG i2c_registers[] = { { LIS_CTRL_REG1, 0x17 }, // 25Hz
+ { LIS_CTRL_REG2, 0b00001000 }, // Highpass filter off
+ { LIS_CTRL_REG3, 0b01100000 }, // Setup interrupt pins
+ { LIS_CTRL_REG4, 0b00001000 }, // Block update mode off, HR on
+ { LIS_CTRL_REG5, 0b00000010 }, { LIS_CTRL_REG6, 0b01100010 },
+ //Basically setup the unit to run, and enable 4D orientation detection
+ { LIS_INT2_CFG, 0b01111110 }, //setup for movement detection
+ { LIS_INT2_THS, 0x28 }, { LIS_INT2_DURATION, 64 }, {
+ LIS_INT1_CFG, 0b01111110 }, { LIS_INT1_THS, 0x28 }, {
+ LIS_INT1_DURATION, 64 } };
+
+void LIS2DH12::initalize() {
+ for (size_t index = 0;
+ index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]));
+ index++) {
+ FRToSI2C::I2C_RegisterWrite(LIS2DH_I2C_ADDRESS,
+ i2c_registers[index].reg, i2c_registers[index].value);
+ }
+}
+
+void LIS2DH12::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) {
+ std::array<int16_t, 3> sensorData;
+
+ FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8,
+ reinterpret_cast<uint8_t*>(sensorData.begin()),
+ sensorData.size() * sizeof(int16_t));
+
+ x = sensorData[0];
+ y = sensorData[1];
+ z = sensorData[2];
+}
+
+bool LIS2DH12::detect() {
+ return FRToSI2C::probe(LIS2DH_I2C_ADDRESS);
+}
diff --git a/workspace/TS100/Core/Inc/LIS2DH12.hpp b/workspace/TS100/Core/Drivers/LIS2DH12.hpp index 5a30288f..79346e98 100644 --- a/workspace/TS100/Core/Inc/LIS2DH12.hpp +++ b/workspace/TS100/Core/Drivers/LIS2DH12.hpp @@ -1,42 +1,42 @@ -/* - * LIS2DH12.hpp - * - * Created on: 27Feb.,2018 - * Author: Ralim - */ - -#ifndef LIS2DH12_HPP_ -#define LIS2DH12_HPP_ -#include "stm32f1xx_hal.h" -#include "FRToSI2C.hpp" -#include "LIS2DH12_defines.hpp" -#include "hardware.h" - -class LIS2DH12 { -public: - static void initalize(); - //1 = rh, 2,=lh, 8=flat - static Orientation getOrientation() { -#ifdef MODEL_TS80 - uint8_t val = (FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS, - LIS_INT2_SRC) >> 2); - if (val == 8) - val = 3; - else if (val == 1) - val = 1; - else if (val == 2) - val = 0; - else - val = 3; - return static_cast<Orientation>(val); -#endif -#ifdef MODEL_TS100 - return static_cast<Orientation>((FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,LIS_INT2_SRC) >> 2) - 1); -#endif - } - static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z); - -private: -}; - -#endif /* LIS2DH12_HPP_ */ +/*
+ * LIS2DH12.hpp
+ *
+ * Created on: 27Feb.,2018
+ * Author: Ralim
+ */
+
+#ifndef LIS2DH12_HPP_
+#define LIS2DH12_HPP_
+#include "I2C_Wrapper.hpp"
+#include "LIS2DH12_defines.hpp"
+#include "BSP.h"
+
+class LIS2DH12 {
+public:
+ static bool detect();
+ static void initalize();
+ //1 = rh, 2,=lh, 8=flat
+ static Orientation getOrientation() {
+#ifdef LIS_ORI_FLIP
+ uint8_t val = (FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,
+ LIS_INT2_SRC) >> 2);
+ if (val == 8)
+ val = 3;
+ else if (val == 1)
+ val = 1;
+ else if (val == 2)
+ val = 0;
+ else
+ val = 3;
+ return static_cast<Orientation>(val);
+#endif
+#ifdef MODEL_TS100
+ return static_cast<Orientation>((FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,LIS_INT2_SRC) >> 2) - 1);
+#endif
+ }
+ static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z);
+
+private:
+};
+
+#endif /* LIS2DH12_HPP_ */
diff --git a/workspace/TS100/Core/Inc/LIS2DH12_defines.hpp b/workspace/TS100/Core/Drivers/LIS2DH12_defines.hpp index f317fbca..c233aca5 100644 --- a/workspace/TS100/Core/Inc/LIS2DH12_defines.hpp +++ b/workspace/TS100/Core/Drivers/LIS2DH12_defines.hpp @@ -1,28 +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_ */ +/*
+ * 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_ */
diff --git a/workspace/TS100/Core/Src/MMA8652FC.cpp b/workspace/TS100/Core/Drivers/MMA8652FC.cpp index ebe10568..cd41488a 100644 --- a/workspace/TS100/Core/Src/MMA8652FC.cpp +++ b/workspace/TS100/Core/Drivers/MMA8652FC.cpp @@ -1,78 +1,88 @@ -/* - * MMA8652FC.cpp - * - * Created on: 31Aug.,2017 - * Author: Ben V. Brown - */ - -#include <array> - -#include "MMA8652FC.hpp" -#include "cmsis_os.h" - -typedef struct { - const uint8_t reg; - const uint8_t val; -} MMA_REG; - -static const MMA_REG i2c_registers[] = { { CTRL_REG2, 0 }, //Normal mode - { CTRL_REG2, 0x40 }, // Reset all registers to POR values - { FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled - { PL_CFG_REG, 0x40 }, //Enable the orientation detection - { PL_COUNT_REG, 200 }, //200 count debounce - { PL_BF_ZCOMP_REG, 0b01000111 }, //Set the threshold to 42 degrees - { P_L_THS_REG, 0b10011100 }, //Up the trip angles - { CTRL_REG4, 0x01 | (1 << 4) }, // Enable dataready interrupt & orientation interrupt - { CTRL_REG5, 0x01 }, // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2 - { CTRL_REG2, 0x12 }, //Set maximum resolution oversampling - { XYZ_DATA_CFG_REG, (1 << 4) }, //select high pass filtered data - { HP_FILTER_CUTOFF_REG, 0x03 }, //select high pass filtered data - { CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode -}; - - -void MMA8652FC::initalize() { - size_t index = 0; - - //send all the init commands to the unit - - FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val); - index++; - FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val); - index++; - - HAL_Delay(2); // ~1ms delay - - while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) { - FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val); - index++; - } -} - -Orientation MMA8652FC::getOrientation() { - //First read the PL_STATUS register - uint8_t plStatus = FRToSI2C::I2C_RegisterRead(MMA8652FC_I2C_ADDRESS,PL_STATUS_REG); - 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 static_cast<Orientation>(plStatus); - } - - return ORIENTATION_FLAT; -} - -void MMA8652FC::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) { - std::array<int16_t, 3> sensorData; - - FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, I2C_MEMADD_SIZE_8BIT, - reinterpret_cast<uint8_t*>(sensorData.begin()), - sensorData.size() * sizeof(int16_t)); - - x = static_cast<int16_t>(__builtin_bswap16(*reinterpret_cast<uint16_t*>(&sensorData[0]))); - y = static_cast<int16_t>(__builtin_bswap16(*reinterpret_cast<uint16_t*>(&sensorData[1]))); - z = static_cast<int16_t>(__builtin_bswap16(*reinterpret_cast<uint16_t*>(&sensorData[2]))); -} +/*
+ * MMA8652FC.cpp
+ *
+ * Created on: 31Aug.,2017
+ * Author: Ben V. Brown
+ */
+
+#include <array>
+
+#include "MMA8652FC.hpp"
+#include "cmsis_os.h"
+
+typedef struct {
+ const uint8_t reg;
+ const uint8_t val;
+} MMA_REG;
+
+static const MMA_REG i2c_registers[] = { { CTRL_REG2, 0 }, //Normal mode
+ { CTRL_REG2, 0x40 }, // Reset all registers to POR values
+ { FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled
+ { PL_CFG_REG, 0x40 }, //Enable the orientation detection
+ { PL_COUNT_REG, 200 }, //200 count debounce
+ { PL_BF_ZCOMP_REG, 0b01000111 }, //Set the threshold to 42 degrees
+ { P_L_THS_REG, 0b10011100 }, //Up the trip angles
+ { CTRL_REG4, 0x01 | (1 << 4) }, // Enable dataready interrupt & orientation interrupt
+ { CTRL_REG5, 0x01 }, // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2
+ { CTRL_REG2, 0x12 }, //Set maximum resolution oversampling
+ { XYZ_DATA_CFG_REG, (1 << 4) }, //select high pass filtered data
+ { HP_FILTER_CUTOFF_REG, 0x03 }, //select high pass filtered data
+ { CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode
+};
+
+void MMA8652FC::initalize() {
+ size_t index = 0;
+
+ //send all the init commands to the unit
+
+ FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, i2c_registers[index].reg,
+ i2c_registers[index].val);
+ index++;
+ FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, i2c_registers[index].reg,
+ i2c_registers[index].val);
+ index++;
+
+ delay_ms(2); // ~1ms delay
+
+ while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) {
+ FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,
+ i2c_registers[index].reg, i2c_registers[index].val);
+ index++;
+ }
+}
+
+Orientation MMA8652FC::getOrientation() {
+ //First read the PL_STATUS register
+ uint8_t plStatus = FRToSI2C::I2C_RegisterRead(MMA8652FC_I2C_ADDRESS,
+ PL_STATUS_REG);
+ 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 static_cast<Orientation>(plStatus);
+ }
+
+ return ORIENTATION_FLAT;
+}
+
+void MMA8652FC::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) {
+ std::array<int16_t, 3> sensorData;
+
+ FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG,
+ reinterpret_cast<uint8_t*>(sensorData.begin()),
+ sensorData.size() * sizeof(int16_t));
+
+ x = static_cast<int16_t>(__builtin_bswap16(
+ *reinterpret_cast<uint16_t*>(&sensorData[0])));
+ y = static_cast<int16_t>(__builtin_bswap16(
+ *reinterpret_cast<uint16_t*>(&sensorData[1])));
+ z = static_cast<int16_t>(__builtin_bswap16(
+ *reinterpret_cast<uint16_t*>(&sensorData[2])));
+}
+
+bool MMA8652FC::detect() {
+ return FRToSI2C::probe(MMA8652FC_I2C_ADDRESS);
+}
diff --git a/workspace/TS100/Core/Drivers/MMA8652FC.hpp b/workspace/TS100/Core/Drivers/MMA8652FC.hpp new file mode 100644 index 00000000..ec160ab5 --- /dev/null +++ b/workspace/TS100/Core/Drivers/MMA8652FC.hpp @@ -0,0 +1,27 @@ +/*
+ * MMA8652FC.h
+ *
+ * Created on: 31Aug.,2017
+ * Author: Ben V. Brown
+ */
+
+#ifndef MMA8652FC_HPP_
+#define MMA8652FC_HPP_
+#include "MMA8652FC_defines.h"
+#include "I2C_Wrapper.hpp"
+#include "BSP.h"
+
+class MMA8652FC {
+
+public:
+ //Returns true if this accelerometer is detected
+ static bool detect();
+ //Init any internal state
+ static void initalize();
+ static Orientation getOrientation(); // Reads the I2C register and returns the orientation (true == left)
+ static void getAxisReadings(int16_t &x, int16_t &y, int16_t &z);
+
+private:
+};
+
+#endif /* MMA8652FC_HPP_ */
diff --git a/workspace/TS100/Core/Inc/MMA8652FC_defines.h b/workspace/TS100/Core/Drivers/MMA8652FC_defines.h index af4ef38c..d3526c02 100644 --- a/workspace/TS100/Core/Inc/MMA8652FC_defines.h +++ b/workspace/TS100/Core/Drivers/MMA8652FC_defines.h @@ -1,124 +1,124 @@ -/* - * MMA8652FC_defines.h - * - * Created on: 31Aug.,2017 - * Author: Ben V. Brown - */ - -#ifndef MMA8652FC_DEFINES_H_ -#define MMA8652FC_DEFINES_H_ - -//--------------MMA8652 Registers-------------------------------------------// - -#define STATUS_REG 0x00 // STATUS Register - -#define OUT_X_MSB_REG 0x01 // [7:0] are 8 MSBs of the 14-bit X-axis sample -#define OUT_X_LSB_REG 0x02 // [7:2] are the 6 LSB of 14-bit X-axis sample -#define OUT_Y_MSB_REG 0x03 // [7:0] are 8 MSBs of the 14-bit Y-axis sample -#define OUT_Y_LSB_REG 0x04 // [7:2] are the 6 LSB of 14-bit Y-axis sample -#define OUT_Z_MSB_REG 0x05 // [7:0] are 8 MSBs of the 14-bit Z-axis sample -#define OUT_Z_LSB_REG 0x06 // [7:2] are the 6 LSB of 14-bit Z-axis sample - -#define F_SETUP_REG 0x09 // F_SETUP FIFO Setup Register -#define TRIG_CFG_REG 0x0A // TRIG_CFG Map of FIFO data capture events -#define SYSMOD_REG 0x0B // SYSMOD System Mode Register -#define INT_SOURCE_REG 0x0C // INT_SOURCE System Interrupt Status Register -#define WHO_AM_I_REG 0x0D // WHO_AM_I Device ID Register -#define XYZ_DATA_CFG_REG 0x0E // XYZ_DATA_CFG Sensor Data Configuration Register -#define HP_FILTER_CUTOFF_REG 0x0F // HP_FILTER_CUTOFF High Pass Filter Register - -#define PL_STATUS_REG 0x10 // PL_STATUS Portrait/Landscape Status Register -#define PL_CFG_REG 0x11 // PL_CFG Portrait/Landscape Configuration Register -#define PL_COUNT_REG 0x12 // PL_COUNT Portrait/Landscape Debounce Register -#define PL_BF_ZCOMP_REG 0x13 // PL_BF_ZCOMP Back/Front and Z Compensation Register -#define P_L_THS_REG 0x14 // P_L_THS Portrait to Landscape Threshold Register - -#define FF_MT_CFG_REG 0x15 // FF_MT_CFG Freefall and Motion Configuration Register -#define FF_MT_SRC_REG 0x16 // FF_MT_SRC Freefall and Motion Source Register -#define FF_MT_THS_REG 0x17 // FF_MT_THS Freefall and Motion Threshold Register -#define FF_MT_COUNT_REG 0x18 // FF_MT_COUNT Freefall Motion Count Register - -#define TRANSIENT_CFG_REG 0x1D // TRANSIENT_CFG Transient Configuration Register -#define TRANSIENT_SRC_REG 0x1E // TRANSIENT_SRC Transient Source Register -#define TRANSIENT_THS_REG 0x1F // TRANSIENT_THS Transient Threshold Register -#define TRANSIENT_COUNT_REG 0x20 // TRANSIENT_COUNT Transient Debounce Counter Register - -#define PULSE_CFG_REG 0x21 // PULSE_CFG Pulse Configuration Register -#define PULSE_SRC_REG 0x22 // PULSE_SRC Pulse Source Register -#define PULSE_THSX_REG 0x23 // PULSE_THS XYZ Pulse Threshold Registers -#define PULSE_THSY_REG 0x24 -#define PULSE_THSZ_REG 0x25 -#define PULSE_TMLT_REG 0x26 // PULSE_TMLT Pulse Time Window Register -#define PULSE_LTCY_REG 0x27 // PULSE_LTCY Pulse Latency Timer Register -#define PULSE_WIND_REG 0x28 // PULSE_WIND Second Pulse Time Window Register - -#define ASLP_COUNT_REG 0x29 // ASLP_COUNT Auto Sleep Inactivity Timer Register - -#define CTRL_REG1 0x2A // CTRL_REG1 System Control 1 Register -#define CTRL_REG2 0x2B // CTRL_REG2 System Control 2 Register -#define CTRL_REG3 0x2C // CTRL_REG3 Interrupt Control Register -#define CTRL_REG4 0x2D // CTRL_REG4 Interrupt Enable Register -#define CTRL_REG5 0x2E // CTRL_REG5 Interrupt Configuration Register - -#define OFF_X_REG 0x2F // XYZ Offset Correction Registers -#define OFF_Y_REG 0x30 -#define OFF_Z_REG 0x31 - -//MMA8652FC 7-bit I2C address - -#define MMA8652FC_I2C_ADDRESS (0x1D<<1) - -//MMA8652FC Sensitivity - -#define SENSITIVITY_2G 1024 -#define SENSITIVITY_4G 512 -#define SENSITIVITY_8G 256 - -#define STATUS_REG 0x00 -#define X_MSB_REG 0X01 -#define X_LSB_REG 0X02 -#define Y_MSB_REG 0X03 -#define Y_LSB_REG 0X04 -#define Z_MSB_REG 0X05 -#define Z_LSB_REG 0X06 - -#define TRIG_CFG 0X0A -#define SYSMOD 0X0B -#define INT_SOURCE 0X0C -#define DEVICE_ID 0X0D - -//-----STATUS_REG(0X00)-----Bit Define----------------------------------------// -#define ZYXDR_BIT 0X08 -//----XYZ_DATA_CFG_REG(0xE)-Bit Define----------------------------------------// -#define FS_MASK 0x03 -#define FULL_SCALE_2G 0x00 //2g=0x0,4g=0x1,8g=0x2 -#define FULL_SCALE_4G 0x01 -#define FULL_SCALE_8G 0x02 -//---------CTRL_REG1(0X2A)Bit Define------------------------------------------// -#define ACTIVE_MASK 1<<0 //bit0 -#define DR_MASK 0x38 //bit D5,D4,D3 -#define FHZ800 0x0 //800hz -#define FHZ400 0x1 //400hz -#define FHZ200 0x2 //200hz -#define FHZ100 0x3 //100hz -#define FHZ50 0x4 //50hz -#define FHZ2 0x5 //12.5hz -#define FHZ1 0x6 //6.25hz -#define FHZ0 0x7 //1.563hz - -//---------CTRL_REG2(0X2B)Bit Define------------------------------------------// -#define MODS_MASK 0x03 //Oversampling Mode 4 -#define Normal_Mode 0x0 //Normal=0,Low Noise Low Power MODS=1, -//HI RESOLUTION=2,LOW POWER MODS = 11 -//----CTRL_REG4---Interrupt Enable BIT ---------------------------------------// -//0 interrupt is disabled (default) -//1 interrupt is enabled -#define INT_EN_ASLP 1<<7 //Auto-SLEEP/WAKE Interrupt Enable -#define INT_EN_FIFO 1<<6 //FIFO Interrupt Enable -#define INT_EN_TRANS 1<<5 //Transient Interrupt Enable -#define INT_EN_LNDPRT 1<<4 //Orientation(Landscape/Portrait)Interrupt Enable -#define INT_EN_PULSE 1<<3 //Pulse Detection Interrupt Enable -#define INT_EN_FF_MT 1<<2 //Freefall/Motion Interrupt Enable -#define INT_EN_DRDY 1<<0 //Data Ready Interrupt Enable - -#endif /* MMA8652FC_DEFINES_H_ */ +/*
+ * MMA8652FC_defines.h
+ *
+ * Created on: 31Aug.,2017
+ * Author: Ben V. Brown
+ */
+
+#ifndef MMA8652FC_DEFINES_H_
+#define MMA8652FC_DEFINES_H_
+
+//--------------MMA8652 Registers-------------------------------------------//
+
+#define STATUS_REG 0x00 // STATUS Register
+
+#define OUT_X_MSB_REG 0x01 // [7:0] are 8 MSBs of the 14-bit X-axis sample
+#define OUT_X_LSB_REG 0x02 // [7:2] are the 6 LSB of 14-bit X-axis sample
+#define OUT_Y_MSB_REG 0x03 // [7:0] are 8 MSBs of the 14-bit Y-axis sample
+#define OUT_Y_LSB_REG 0x04 // [7:2] are the 6 LSB of 14-bit Y-axis sample
+#define OUT_Z_MSB_REG 0x05 // [7:0] are 8 MSBs of the 14-bit Z-axis sample
+#define OUT_Z_LSB_REG 0x06 // [7:2] are the 6 LSB of 14-bit Z-axis sample
+
+#define F_SETUP_REG 0x09 // F_SETUP FIFO Setup Register
+#define TRIG_CFG_REG 0x0A // TRIG_CFG Map of FIFO data capture events
+#define SYSMOD_REG 0x0B // SYSMOD System Mode Register
+#define INT_SOURCE_REG 0x0C // INT_SOURCE System Interrupt Status Register
+#define WHO_AM_I_REG 0x0D // WHO_AM_I Device ID Register
+#define XYZ_DATA_CFG_REG 0x0E // XYZ_DATA_CFG Sensor Data Configuration Register
+#define HP_FILTER_CUTOFF_REG 0x0F // HP_FILTER_CUTOFF High Pass Filter Register
+
+#define PL_STATUS_REG 0x10 // PL_STATUS Portrait/Landscape Status Register
+#define PL_CFG_REG 0x11 // PL_CFG Portrait/Landscape Configuration Register
+#define PL_COUNT_REG 0x12 // PL_COUNT Portrait/Landscape Debounce Register
+#define PL_BF_ZCOMP_REG 0x13 // PL_BF_ZCOMP Back/Front and Z Compensation Register
+#define P_L_THS_REG 0x14 // P_L_THS Portrait to Landscape Threshold Register
+
+#define FF_MT_CFG_REG 0x15 // FF_MT_CFG Freefall and Motion Configuration Register
+#define FF_MT_SRC_REG 0x16 // FF_MT_SRC Freefall and Motion Source Register
+#define FF_MT_THS_REG 0x17 // FF_MT_THS Freefall and Motion Threshold Register
+#define FF_MT_COUNT_REG 0x18 // FF_MT_COUNT Freefall Motion Count Register
+
+#define TRANSIENT_CFG_REG 0x1D // TRANSIENT_CFG Transient Configuration Register
+#define TRANSIENT_SRC_REG 0x1E // TRANSIENT_SRC Transient Source Register
+#define TRANSIENT_THS_REG 0x1F // TRANSIENT_THS Transient Threshold Register
+#define TRANSIENT_COUNT_REG 0x20 // TRANSIENT_COUNT Transient Debounce Counter Register
+
+#define PULSE_CFG_REG 0x21 // PULSE_CFG Pulse Configuration Register
+#define PULSE_SRC_REG 0x22 // PULSE_SRC Pulse Source Register
+#define PULSE_THSX_REG 0x23 // PULSE_THS XYZ Pulse Threshold Registers
+#define PULSE_THSY_REG 0x24
+#define PULSE_THSZ_REG 0x25
+#define PULSE_TMLT_REG 0x26 // PULSE_TMLT Pulse Time Window Register
+#define PULSE_LTCY_REG 0x27 // PULSE_LTCY Pulse Latency Timer Register
+#define PULSE_WIND_REG 0x28 // PULSE_WIND Second Pulse Time Window Register
+
+#define ASLP_COUNT_REG 0x29 // ASLP_COUNT Auto Sleep Inactivity Timer Register
+
+#define CTRL_REG1 0x2A // CTRL_REG1 System Control 1 Register
+#define CTRL_REG2 0x2B // CTRL_REG2 System Control 2 Register
+#define CTRL_REG3 0x2C // CTRL_REG3 Interrupt Control Register
+#define CTRL_REG4 0x2D // CTRL_REG4 Interrupt Enable Register
+#define CTRL_REG5 0x2E // CTRL_REG5 Interrupt Configuration Register
+
+#define OFF_X_REG 0x2F // XYZ Offset Correction Registers
+#define OFF_Y_REG 0x30
+#define OFF_Z_REG 0x31
+
+//MMA8652FC 7-bit I2C address
+
+#define MMA8652FC_I2C_ADDRESS (0x1D<<1)
+
+//MMA8652FC Sensitivity
+
+#define SENSITIVITY_2G 1024
+#define SENSITIVITY_4G 512
+#define SENSITIVITY_8G 256
+
+#define STATUS_REG 0x00
+#define X_MSB_REG 0X01
+#define X_LSB_REG 0X02
+#define Y_MSB_REG 0X03
+#define Y_LSB_REG 0X04
+#define Z_MSB_REG 0X05
+#define Z_LSB_REG 0X06
+
+#define TRIG_CFG 0X0A
+#define SYSMOD 0X0B
+#define INT_SOURCE 0X0C
+#define DEVICE_ID 0X0D
+
+//-----STATUS_REG(0X00)-----Bit Define----------------------------------------//
+#define ZYXDR_BIT 0X08
+//----XYZ_DATA_CFG_REG(0xE)-Bit Define----------------------------------------//
+#define FS_MASK 0x03
+#define FULL_SCALE_2G 0x00 //2g=0x0,4g=0x1,8g=0x2
+#define FULL_SCALE_4G 0x01
+#define FULL_SCALE_8G 0x02
+//---------CTRL_REG1(0X2A)Bit Define------------------------------------------//
+#define ACTIVE_MASK 1<<0 //bit0
+#define DR_MASK 0x38 //bit D5,D4,D3
+#define FHZ800 0x0 //800hz
+#define FHZ400 0x1 //400hz
+#define FHZ200 0x2 //200hz
+#define FHZ100 0x3 //100hz
+#define FHZ50 0x4 //50hz
+#define FHZ2 0x5 //12.5hz
+#define FHZ1 0x6 //6.25hz
+#define FHZ0 0x7 //1.563hz
+
+//---------CTRL_REG2(0X2B)Bit Define------------------------------------------//
+#define MODS_MASK 0x03 //Oversampling Mode 4
+#define Normal_Mode 0x0 //Normal=0,Low Noise Low Power MODS=1,
+//HI RESOLUTION=2,LOW POWER MODS = 11
+//----CTRL_REG4---Interrupt Enable BIT ---------------------------------------//
+//0 interrupt is disabled (default)
+//1 interrupt is enabled
+#define INT_EN_ASLP 1<<7 //Auto-SLEEP/WAKE Interrupt Enable
+#define INT_EN_FIFO 1<<6 //FIFO Interrupt Enable
+#define INT_EN_TRANS 1<<5 //Transient Interrupt Enable
+#define INT_EN_LNDPRT 1<<4 //Orientation(Landscape/Portrait)Interrupt Enable
+#define INT_EN_PULSE 1<<3 //Pulse Detection Interrupt Enable
+#define INT_EN_FF_MT 1<<2 //Freefall/Motion Interrupt Enable
+#define INT_EN_DRDY 1<<0 //Data Ready Interrupt Enable
+
+#endif /* MMA8652FC_DEFINES_H_ */
diff --git a/workspace/TS100/Core/Src/OLED.cpp b/workspace/TS100/Core/Drivers/OLED.cpp index 3949b17a..fc9867eb 100644 --- a/workspace/TS100/Core/Src/OLED.cpp +++ b/workspace/TS100/Core/Drivers/OLED.cpp @@ -63,7 +63,6 @@ uint8_t OLED_Setup_Array[] = { const uint8_t REFRESH_COMMANDS[17] = { 0x80, 0xAF, 0x80, 0x21, 0x80, 0x20, 0x80, 0x7F, 0x80, 0xC0, 0x80, 0x22, 0x80, 0x00, 0x80, 0x01, 0x40 }; - /* * Animation timing function that follows a bezier curve. * @param t A given percentage value [0..<100] @@ -95,10 +94,6 @@ void OLED::initialize() { displayOffset = 0; memcpy(&screenBuffer[0], &REFRESH_COMMANDS[0], sizeof(REFRESH_COMMANDS)); - HAL_Delay(50); - HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET); - HAL_Delay(50); - // Set the display to be ON once the settings block is sent and send the // initialisation data to the OLED. @@ -148,10 +143,10 @@ void OLED::drawScrollIndicator(uint8_t y, uint8_t height) { uint16_t whole; uint8_t strips[2]; } column; - + column.whole = (1 << height) - 1; column.whole <<= y; - + // Draw a one pixel wide bar to the left with a single pixel as // the scroll indicator. fillArea(OLED_WIDTH - 1, 0, 1, 8, column.strips[0]); @@ -195,11 +190,14 @@ void OLED::transitionSecondaryFramebuffer(bool forwardNavigation) { offset = progress; - memmove(&firstStripPtr[oldStart], &firstStripPtr[oldPrevious], OLED_WIDTH - progress); - memmove(&secondStripPtr[oldStart], &secondStripPtr[oldPrevious], OLED_WIDTH - progress); + memmove(&firstStripPtr[oldStart], &firstStripPtr[oldPrevious], + OLED_WIDTH - progress); + memmove(&secondStripPtr[oldStart], &secondStripPtr[oldPrevious], + OLED_WIDTH - progress); memmove(&firstStripPtr[newStart], &firstBackStripPtr[newEnd], progress); - memmove(&secondStripPtr[newStart], &secondBackStripPtr[newEnd], progress); + memmove(&secondStripPtr[newStart], &secondBackStripPtr[newEnd], + progress); refresh(); osDelay(40); @@ -275,7 +273,7 @@ uint8_t OLED::getFont() { inline void stripLeaderZeros(char *buffer, uint8_t places) { //Removing the leading zero's by swapping them to SymbolSpace // Stop 1 short so that we dont blank entire number if its zero - for (int i = 0; i < (places-1); i++) { + for (int i = 0; i < (places - 1); i++) { if (buffer[i] == 2) { buffer[i] = SymbolSpace[0]; } else { diff --git a/workspace/TS100/Core/Inc/OLED.hpp b/workspace/TS100/Core/Drivers/OLED.hpp index 5994e9f6..5e3238a7 100644 --- a/workspace/TS100/Core/Inc/OLED.hpp +++ b/workspace/TS100/Core/Drivers/OLED.hpp @@ -9,11 +9,10 @@ #ifndef OLED_HPP_
#define OLED_HPP_
-#include <hardware.h>
-#include "stm32f1xx_hal.h"
+#include <BSP.h>
#include <stdbool.h>
#include <string.h>
-#include "FRToSI2C.hpp"
+#include "I2C_Wrapper.hpp"
#include "Font.h"
#ifdef __cplusplus
extern "C" {
@@ -27,12 +26,11 @@ extern "C" { #define OLED_HEIGHT 16
#define FRAMEBUFFER_START 17
-class OLED {
+class OLED {
public:
enum DisplayState : bool {
- OFF = false,
- ON = true
+ OFF = false, ON = true
};
static void initialize(); // Startup the I2C coms (brings screen out of reset etc)
@@ -40,7 +38,7 @@ public: // Draw the buffer out to the LCD using the DMA Channel
static void refresh() {
FRToSI2C::Transmit( DEVICEADDR_OLED, screenBuffer,
- FRAMEBUFFER_START + (OLED_WIDTH * 2));
+ FRAMEBUFFER_START + (OLED_WIDTH * 2));
//DMA tx time is ~ 20mS Ensure after calling this you delay for at least 25ms
//or we need to goto double buffering
}
@@ -49,16 +47,16 @@ public: displayState = state;
screenBuffer[1] = (state == ON) ? 0xAF : 0xAE;
}
-
+
static void setRotation(bool leftHanded); // Set the rotation for the screen
// Get the current rotation of the LCD
- static bool getRotation() {
+ static bool getRotation() {
return inLeftHandedMode;
}
static int16_t getCursorX() {
return cursor_x;
}
- static void print(const char* string);// Draw a string to the current location, with current font
+ static void print(const char *string);// Draw a string to the current location, with current font
// Set the cursor location by pixels
static void setCursor(int16_t x, int16_t y) {
cursor_x = x;
@@ -71,11 +69,12 @@ public: }
static void setFont(uint8_t fontNumber); // (Future) Set the font that is being used
static uint8_t getFont();
- static void drawImage(const uint8_t* buffer, uint8_t x, uint8_t width) {
+ static void drawImage(const uint8_t *buffer, uint8_t x, uint8_t width) {
drawArea(x, 0, width, 16, buffer);
}
// Draws an image to the buffer, at x offset from top to bottom (fixed height renders)
- static void printNumber(uint16_t number, uint8_t places,bool noLeaderZeros=true);
+ static void printNumber(uint16_t number, uint8_t places,
+ bool noLeaderZeros = true);
// Draws a number at the current cursor location
// Clears the buffer
static void clearScreen() {
@@ -92,9 +91,9 @@ public: static void debugNumber(int32_t val);
static void drawSymbol(uint8_t symbolID);//Used for drawing symbols of a predictable width
static void drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
- const uint8_t* ptr); //Draw an area, but y must be aligned on 0/8 offset
- static void drawAreaSwapped(int16_t x, int8_t y, uint8_t wide, uint8_t height,
- const uint8_t* ptr); //Draw an area, but y must be aligned on 0/8 offset
+ const uint8_t *ptr); //Draw an area, but y must be aligned on 0/8 offset
+ static void drawAreaSwapped(int16_t x, int8_t y, uint8_t wide,
+ uint8_t height, const uint8_t *ptr); //Draw an area, but y must be aligned on 0/8 offset
static void fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
const uint8_t value); //Fill an area, but y must be aligned on 0/8 offset
static void drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,
@@ -106,9 +105,9 @@ public: private:
static void drawChar(char c); // Draw a character to a specific location
static void setFramebuffer(uint8_t *buffer);
- static const uint8_t* currentFont;// Pointer to the current font used for rendering to the buffer
- static uint8_t* firstStripPtr; // Pointers to the strips to allow for buffer having extra content
- static uint8_t* secondStripPtr; //Pointers to the strips
+ static const uint8_t *currentFont; // Pointer to the current font used for rendering to the buffer
+ static uint8_t *firstStripPtr; // Pointers to the strips to allow for buffer having extra content
+ static uint8_t *secondStripPtr; //Pointers to the strips
static bool inLeftHandedMode; // Whether the screen is in left or not (used for offsets in GRAM)
static DisplayState displayState;
static uint8_t fontWidth, fontHeight;
diff --git a/workspace/TS100/Core/Drivers/README.md b/workspace/TS100/Core/Drivers/README.md new file mode 100644 index 00000000..9b5ebf91 --- /dev/null +++ b/workspace/TS100/Core/Drivers/README.md @@ -0,0 +1,10 @@ +# Drivers
+
+Drivers are the classes used to represent physical hardware on the board in a more abstract way, that are more complex than just an IO
+
+* OLED Display
+* Accelerometers
+* Button handling logic
+* Tip thermo response modelling
+
+All drivers should be written with minimal hardware assumptions, and defer hardware related logic to the BSP folder where possible
\ No newline at end of file diff --git a/workspace/TS100/Core/Src/TipThermoModel.cpp b/workspace/TS100/Core/Drivers/TipThermoModel.cpp index e35b2915..ac1c9389 100644 --- a/workspace/TS100/Core/Src/TipThermoModel.cpp +++ b/workspace/TS100/Core/Drivers/TipThermoModel.cpp @@ -7,7 +7,7 @@ #include "TipThermoModel.h" #include "Settings.h" -#include "hardware.h" +#include "BSP.h" #include "../../configuration.h" /* diff --git a/workspace/TS100/Core/Src/TipThermoModel.h b/workspace/TS100/Core/Drivers/TipThermoModel.h index 6c31f6bd..a4b0b368 100644 --- a/workspace/TS100/Core/Src/TipThermoModel.h +++ b/workspace/TS100/Core/Drivers/TipThermoModel.h @@ -8,7 +8,7 @@ #ifndef SRC_TIPTHERMOMODEL_H_ #define SRC_TIPTHERMOMODEL_H_ #include "stdint.h" -#include "hardware.h" +#include "BSP.h" #include "unit.h" class TipThermoModel { public: diff --git a/workspace/TS100/Core/Inc/FreeRTOSHooks.h b/workspace/TS100/Core/Inc/FreeRTOSHooks.h new file mode 100644 index 00000000..8dca47e6 --- /dev/null +++ b/workspace/TS100/Core/Inc/FreeRTOSHooks.h @@ -0,0 +1,28 @@ +/*
+ * FreeRTOSHooks.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#ifndef INC_FREERTOSHOOKS_H_
+#define INC_FREERTOSHOOKS_H_
+
+#include "FreeRTOS.h"
+#include "cmsis_os.h"
+#include "unit.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// RToS
+void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
+ StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize);
+void vApplicationIdleHook(void);
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* INC_FREERTOSHOOKS_H_ */
diff --git a/workspace/TS100/Core/Inc/MMA8652FC.hpp b/workspace/TS100/Core/Inc/MMA8652FC.hpp deleted file mode 100644 index b6d2938e..00000000 --- a/workspace/TS100/Core/Inc/MMA8652FC.hpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * MMA8652FC.h - * - * Created on: 31Aug.,2017 - * Author: Ben V. Brown - */ - -#ifndef MMA8652FC_HPP_ -#define MMA8652FC_HPP_ -#include "stm32f1xx_hal.h" -#include "MMA8652FC_defines.h" -#include "FRToSI2C.hpp" -#include "hardware.h" - -class MMA8652FC { - -public: - - - static void initalize(); // Initalize the system - static Orientation getOrientation();// Reads the I2C register and returns the orientation (true == left) - static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z); - -private: -}; - -#endif /* MMA8652FC_HPP_ */ diff --git a/workspace/TS100/Core/Inc/QC3.h b/workspace/TS100/Core/Inc/QC3.h new file mode 100644 index 00000000..0ddf1b0f --- /dev/null +++ b/workspace/TS100/Core/Inc/QC3.h @@ -0,0 +1,21 @@ +/*
+ * QC3.h
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#ifndef INC_QC3_H_
+#define INC_QC3_H_
+#include "stdint.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+void seekQC(int16_t Vx10, uint16_t divisor);
+void startQC(uint16_t divisor); // Tries to negotiate QC for highest voltage, must be run after
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INC_QC3_H_ */
diff --git a/workspace/TS100/Core/Inc/Settings.h b/workspace/TS100/Core/Inc/Settings.h index cde51fc4..21d4b35d 100644 --- a/workspace/TS100/Core/Inc/Settings.h +++ b/workspace/TS100/Core/Inc/Settings.h @@ -42,7 +42,7 @@ typedef struct { uint8_t temperatureInF :1; // Should the temp be in F or C (true is F) #endif uint8_t descriptionScrollSpeed :1; // Description scroll speed - uint8_t KeepAwakePulse; // Keep Awake pulse power in 0.1 watts (10 = 1Watt) + uint8_t KeepAwakePulse; // Keep Awake pulse power in 0.1 watts (10 = 1Watt) uint16_t voltageDiv; // Voltage divisor factor uint16_t BoostTemp; // Boost mode set point for the iron @@ -51,7 +51,7 @@ typedef struct { uint8_t powerLimitEnable; // Allow toggling of power limit without changing value uint8_t powerLimit; // Maximum power iron allowed to output - + uint16_t TipGain; // uV/C * 10, it can be used to convert tip thermocouple voltage to temperateture TipV/TipGain = TipTemp uint8_t ReverseButtonTempChangeEnabled; // Change the plus and minus button assigment @@ -70,5 +70,5 @@ void saveSettings(); bool restoreSettings(); uint8_t lookupVoltageLevel(uint8_t level); void resetSettings(); -bool showBootLogoIfavailable(); + #endif /* SETTINGS_H_ */ diff --git a/workspace/TS100/Core/Inc/Translation.h b/workspace/TS100/Core/Inc/Translation.h index e918ae8a..614ea12f 100644 --- a/workspace/TS100/Core/Inc/Translation.h +++ b/workspace/TS100/Core/Inc/Translation.h @@ -7,8 +7,8 @@ #ifndef TRANSLATION_H_
#define TRANSLATION_H_
-#include "stm32f1xx_hal.h"
#include "unit.h"
+#include "stdint.h"
enum ShortNameType {
SHORT_NAME_SINGLE_LINE = 1, SHORT_NAME_DOUBLE_LINE = 2,
};
diff --git a/workspace/TS100/Core/Inc/gui.hpp b/workspace/TS100/Core/Inc/gui.hpp index d79b71dd..f05d59fb 100644 --- a/workspace/TS100/Core/Inc/gui.hpp +++ b/workspace/TS100/Core/Inc/gui.hpp @@ -1,38 +1,38 @@ -/* - * gui.h - * - * Created on: 3Sep.,2017 - * Author: Ben V. Brown - */ - -#ifndef GUI_HPP_ -#define GUI_HPP_ -#include "Translation.h" -#include "Settings.h" -#include "hardware.h" - -#define PRESS_ACCEL_STEP 3 -#define PRESS_ACCEL_INTERVAL_MIN 10 -#define PRESS_ACCEL_INTERVAL_MAX 30 - - -//GUI holds the menu structure and all its methods for the menu itself - -//Declarations for all the methods for the settings menu (at end of this file) - -//Wrapper for holding a function pointer -typedef struct state_func_t { - void (*func)(void); -} state_func; - -//Struct for holding the function pointers and descriptions -typedef struct { - const char *description; - const state_func incrementHandler; - const state_func draw; -} menuitem; - -void enterSettingsMenu(); -extern const menuitem rootSettingsMenu[]; - -#endif /* GUI_HPP_ */ +/*
+ * gui.h
+ *
+ * Created on: 3Sep.,2017
+ * Author: Ben V. Brown
+ */
+
+#ifndef GUI_HPP_
+#define GUI_HPP_
+#include "Translation.h"
+#include "Settings.h"
+#include "BSP.h"
+
+#define PRESS_ACCEL_STEP 3
+#define PRESS_ACCEL_INTERVAL_MIN 10
+#define PRESS_ACCEL_INTERVAL_MAX 30
+
+//GUI holds the menu structure and all its methods for the menu itself
+
+//Declarations for all the methods for the settings menu (at end of this file)
+
+//Wrapper for holding a function pointer
+typedef struct state_func_t {
+ void (*func)(void);
+} state_func;
+
+//Struct for holding the function pointers and descriptions
+typedef struct {
+ const char *description;
+ const state_func incrementHandler;
+ const state_func draw;
+} menuitem;
+
+void enterSettingsMenu();
+void GUIDelay();
+extern const menuitem rootSettingsMenu[];
+
+#endif /* GUI_HPP_ */
diff --git a/workspace/TS100/Core/Inc/main.hpp b/workspace/TS100/Core/Inc/main.hpp index fb1809c7..37bc9816 100644 --- a/workspace/TS100/Core/Inc/main.hpp +++ b/workspace/TS100/Core/Inc/main.hpp @@ -1,31 +1,12 @@ #ifndef __MAIN_H #define __MAIN_H -#include <MMA8652FC.hpp> #include "OLED.hpp" #include "Setup.h" extern uint8_t PCBVersion; extern uint32_t currentTempTargetDegC; extern bool settingsWereReset; -enum ButtonState { - BUTTON_NONE = 0, /* No buttons pressed / < filter time*/ - BUTTON_F_SHORT = 1, /* User has pressed the front button*/ - BUTTON_B_SHORT = 2, /* User has pressed the back button*/ - BUTTON_F_LONG = 4, /* User is holding the front button*/ - BUTTON_B_LONG = 8, /* User is holding the back button*/ - BUTTON_BOTH = 16, /* User has pressed both buttons*/ -/* - * Note: - * Pressed means press + release, we trigger on a full \__/ pulse - * holding means it has gone low, and been low for longer than filter time - */ -}; - -ButtonState getButtonState(); -void waitForButtonPressOrTimeout(uint32_t timeout); -void waitForButtonPress(); -void GUIDelay(); #ifdef __cplusplus extern "C" { #endif @@ -40,6 +21,13 @@ void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c); void vApplicationStackOverflowHook(xTaskHandle *pxTask, signed portCHAR *pcTaskName); +//Threads +void startGUITask(void const *argument); +void startPIDTask(void const *argument); +void startMOVTask(void const *argument); +extern TaskHandle_t pidTaskNotification; +extern uint8_t accelInit; +extern uint32_t lastMovementTime; #ifdef __cplusplus } #endif diff --git a/workspace/TS100/Core/Inc/power.hpp b/workspace/TS100/Core/Inc/power.hpp index 9e86752b..c882a99a 100644 --- a/workspace/TS100/Core/Inc/power.hpp +++ b/workspace/TS100/Core/Inc/power.hpp @@ -7,7 +7,7 @@ #include "stdint.h" #include <history.hpp> -#include "hardware.h" +#include "BSP.h" #include "expMovingAverage.h" #ifndef POWER_HPP_ #define POWER_HPP_ diff --git a/workspace/TS100/Core/Src/FRToSI2C.cpp b/workspace/TS100/Core/Src/FRToSI2C.cpp deleted file mode 100644 index aabd6906..00000000 --- a/workspace/TS100/Core/Src/FRToSI2C.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* - * FRToSI2C.cpp - * - * Created on: 14Apr.,2018 - * Author: Ralim - */ -#include "hardware.h" -#include "FRToSI2C.hpp" -#define I2CUSESDMA -I2C_HandleTypeDef* FRToSI2C::i2c; -SemaphoreHandle_t FRToSI2C::I2CSemaphore; -StaticSemaphore_t FRToSI2C::xSemaphoreBuffer; - -void FRToSI2C::CpltCallback() { - i2c->State = HAL_I2C_STATE_READY; // Force state reset (even if tx error) - if (I2CSemaphore) { - xSemaphoreGiveFromISR(I2CSemaphore, NULL); - } -} - -void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { - - if (I2CSemaphore == NULL) { - // no RToS, run blocking code - HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, - 5000); - } else { - // RToS is active, run threading - // Get the mutex so we can use the I2C port - // Wait up to 1 second for the mutex - if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) { -#ifdef I2CUSESDMA - if (HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, - Size, 500) != HAL_OK) { - - I2C1_ClearBusyFlagErratum(); - xSemaphoreGive(I2CSemaphore); - } - xSemaphoreGive(I2CSemaphore); -#else - - HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, - 5000); - xSemaphoreGive(I2CSemaphore); -#endif - } else { - } - } - -} -void FRToSI2C::I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data) { - Mem_Write(address, reg, I2C_MEMADD_SIZE_8BIT, &data, 1); -} - -uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) { - uint8_t tx_data[1]; - Mem_Read(add, reg, I2C_MEMADD_SIZE_8BIT, tx_data, 1); - return tx_data[0]; -} -void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { - - if (I2CSemaphore == NULL) { - // no RToS, run blocking code - HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, - 5000); - } else { - // RToS is active, run threading - // Get the mutex so we can use the I2C port - // Wait up to 1 second for the mutex - if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) { -#ifdef I2CUSESDMA - if (HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, - pData, Size, 500) != HAL_OK) { - - I2C1_ClearBusyFlagErratum(); - xSemaphoreGive(I2CSemaphore); - } - xSemaphoreGive(I2CSemaphore); -#else - if (HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, - Size, 5000) != HAL_OK) { - } - xSemaphoreGive(I2CSemaphore); -#endif - } else { - } - } - -} - -void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) { - if (I2CSemaphore == NULL) { - // no RToS, run blocking code - HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000); - } else { - // RToS is active, run threading - // Get the mutex so we can use the I2C port - // Wait up to 1 second for the mutex - if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) { -#ifdef I2CUSESDMA - - if (HAL_I2C_Master_Transmit_DMA(i2c, DevAddress, pData, Size) - != HAL_OK) { - - I2C1_ClearBusyFlagErratum(); - xSemaphoreGive(I2CSemaphore); - - } -#else - HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000); - xSemaphoreGive(I2CSemaphore); -#endif - - } else { - } - } - -} - -void FRToSI2C::I2C1_ClearBusyFlagErratum() { - GPIO_InitTypeDef GPIO_InitStruct; - int timeout = 100; - int timeout_cnt = 0; - - // 1. Clear PE bit. - i2c->Instance->CR1 &= ~(0x0001); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - // 2. Configure the SCL and SDA I/Os as General Purpose Output Open-Drain, High level (Write 1 to GPIOx_ODR). - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_InitStruct.Pin = SCL_Pin; - HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct); - HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET); - - GPIO_InitStruct.Pin = SDA_Pin; - HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct); - HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET); - - while (GPIO_PIN_SET != HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin)) { - //Move clock to release I2C - HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_RESET); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET); - - timeout_cnt++; - if (timeout_cnt > timeout) - return; - } - - // 12. Configure the SCL and SDA I/Os as Alternate function Open-Drain. - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_InitStruct.Pin = SCL_Pin; - HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = SDA_Pin; - HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct); - - HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET); - - // 13. Set SWRST bit in I2Cx_CR1 register. - i2c->Instance->CR1 |= 0x8000; - - asm("nop"); - - // 14. Clear SWRST bit in I2Cx_CR1 register. - i2c->Instance->CR1 &= ~0x8000; - - asm("nop"); - - // 15. Enable the I2C peripheral by setting the PE bit in I2Cx_CR1 register - i2c->Instance->CR1 |= 0x0001; - - // Call initialization function. - HAL_I2C_Init(i2c); -} diff --git a/workspace/TS100/Core/Src/FreeRTOSHooks.c b/workspace/TS100/Core/Src/FreeRTOSHooks.c new file mode 100644 index 00000000..1e9c3dc6 --- /dev/null +++ b/workspace/TS100/Core/Src/FreeRTOSHooks.c @@ -0,0 +1,32 @@ +/*
+ * FreeRTOSHooks.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#include "FreeRTOSHooks.h"
+#include "BSP.h"
+void vApplicationIdleHook(void) {
+ resetWatchdog();
+}
+
+/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
+static StaticTask_t xIdleTaskTCBBuffer;
+static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];
+
+void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
+ StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) {
+ *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
+ *ppxIdleTaskStackBuffer = &xIdleStack[0];
+ *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
+ /* place for user code */
+}
+
+void vApplicationStackOverflowHook(xTaskHandle *pxTask,
+ signed portCHAR *pcTaskName) {
+ (void) pxTask;
+ (void) pcTaskName;
+// We dont have a good way to handle a stack overflow at this point in time
+ reboot();
+}
diff --git a/workspace/TS100/Core/Src/GUIThread.cpp b/workspace/TS100/Core/Src/GUIThread.cpp deleted file mode 100644 index 28e0f88b..00000000 --- a/workspace/TS100/Core/Src/GUIThread.cpp +++ /dev/null @@ -1,915 +0,0 @@ -/* - * GUIThread.cpp - * - * Created on: 19 Aug 2019 - * Author: ralim - */ -#include <MMA8652FC.hpp> -#include <gui.hpp> -#include <main.hpp> -#include "LIS2DH12.hpp" -#include <history.hpp> -#include <power.hpp> -#include "Settings.h" -#include "Translation.h" -#include "cmsis_os.h" -#include "stdlib.h" -#include "stm32f1xx_hal.h" -#include "string.h" -#include "TipThermoModel.h" -#include "unit.h" -#include "../../configuration.h" - -extern uint8_t PCBVersion; -// File local variables -extern uint32_t currentTempTargetDegC; -extern uint8_t accelInit; -extern uint32_t lastMovementTime; -extern int16_t idealQCVoltage; -uint32_t lastButtonTime = 0; -extern osThreadId GUITaskHandle; -extern osThreadId MOVTaskHandle; -extern osThreadId PIDTaskHandle; - -// TODO: express time constants in terms of dividends of portTICK_RATE_MS - -#define MOVEMENT_INACTIVITY_TIME 6000 -#define BUTTON_INACTIVITY_TIME 6000 - -static uint16_t min(uint16_t a, uint16_t b) { - if (a > b) - return b; - else - return a; -} - -void printVoltage() { - uint32_t volt = getInputVoltageX10(systemSettings.voltageDiv, 0); - OLED::printNumber(volt / 10, 2); - OLED::print(SymbolDot); - OLED::printNumber(volt % 10, 1); -} -void GUIDelay() { - // Called in all UI looping tasks, - // This limits the re-draw rate to the LCD and also lets the DMA run - // As the gui task can very easily fill this bus with transactions, which will - // prevent the movement detection from running - osDelay(50); -} -void gui_drawTipTemp(bool symbol) { - // Draw tip temp handling unit conversion & tolerance near setpoint - uint16_t Temp = 0; - #ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - Temp = TipThermoModel::getTipInF(); - else - #endif - Temp = TipThermoModel::getTipInC(); - - OLED::printNumber(Temp, 3); // Draw the tip temp out finally - if (symbol) { - if (OLED::getFont() == 0) { - //Big font, can draw nice symbols - #ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - OLED::drawSymbol(0); - else - #endif - OLED::drawSymbol(1); - } else { - //Otherwise fall back to chars - #ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - OLED::print(SymbolDegF); - else - #endif - OLED::print(SymbolDegC); - } - } -} -ButtonState getButtonState() { - /* - * Read in the buttons and then determine if a state change needs to occur - */ - - /* - * If the previous state was 00 Then we want to latch the new state if - * different & update time - * If the previous state was !00 Then we want to search if we trigger long - * press (buttons still down), or if release we trigger press - * (downtime>filter) - */ - static uint8_t previousState = 0; - static uint32_t previousStateChange = 0; - const uint16_t timeout = 40; - uint8_t currentState; - currentState = ( - HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ? - 1 : 0) << 0; - currentState |= ( - HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ? - 1 : 0) << 1; - - if (currentState) - lastButtonTime = xTaskGetTickCount(); - if (currentState == previousState) { - if (currentState == 0) - return BUTTON_NONE; - if ((xTaskGetTickCount() - previousStateChange) > timeout) { - // User has been holding the button down - // We want to send a buttong is held message - if (currentState == 0x01) - return BUTTON_F_LONG; - else if (currentState == 0x02) - return BUTTON_B_LONG; - else - return BUTTON_NONE; // Both being held case, we dont long hold this - } else - return BUTTON_NONE; - } else { - // A change in button state has occurred - ButtonState retVal = BUTTON_NONE; - if (currentState) { - // User has pressed a button down (nothing done on down) - if (currentState != previousState) { - // There has been a change in the button states - // If there is a rising edge on one of the buttons from double press we - // want to mask that out As users are having issues with not release - // both at once - if (previousState == 0x03) - currentState = 0x03; - } - } else { - // 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 ((xTaskGetTickCount() - previousStateChange) < timeout) { - // The user didn't hold the button for long - // So we send button press - - if (previousState == 0x01) - retVal = BUTTON_F_SHORT; - else if (previousState == 0x02) - retVal = BUTTON_B_SHORT; - else - retVal = BUTTON_BOTH; // Both being held case - } - } - previousState = currentState; - previousStateChange = xTaskGetTickCount(); - return retVal; - } - return BUTTON_NONE; -} - -void waitForButtonPress() { - // we are just lazy and sleep until user confirms button press - // This also eats the button press event! - ButtonState buttons = getButtonState(); - while (buttons) { - buttons = getButtonState(); - GUIDelay(); - } - while (!buttons) { - buttons = getButtonState(); - GUIDelay(); - } -} - -void waitForButtonPressOrTimeout(uint32_t timeout) { - timeout += xTaskGetTickCount(); - // calculate the exit point - - ButtonState buttons = getButtonState(); - while (buttons) { - buttons = getButtonState(); - GUIDelay(); - if (xTaskGetTickCount() > timeout) - return; - } - while (!buttons) { - buttons = getButtonState(); - GUIDelay(); - if (xTaskGetTickCount() > timeout) - return; - } -} -#ifdef MODEL_TS100 -// returns true if undervoltage has occured -static bool checkVoltageForExit() { - uint16_t v = getInputVoltageX10(systemSettings.voltageDiv, 0); - - //Dont check for first 1.5 seconds while the ADC stabilizes and the DMA fills the buffer - if (xTaskGetTickCount() > 150) { - if ((v < lookupVoltageLevel(systemSettings.cutoutSetting))) { - GUIDelay(); - OLED::clearScreen(); - OLED::setCursor(0, 0); - if (systemSettings.detailedSoldering) { - OLED::setFont(1); - OLED::print(UndervoltageString); - OLED::setCursor(0, 8); - OLED::print(InputVoltageString); - printVoltage(); - OLED::print(SymbolVolts); - - } else { - OLED::setFont(0); - OLED::print(UVLOWarningString); - } - - OLED::refresh(); - currentTempTargetDegC = 0; - waitForButtonPress(); - return true; - } - } - return false; -} -#endif -static void gui_drawBatteryIcon() { -#ifdef MODEL_TS100 - if (systemSettings.cutoutSetting) { - // User is on a lithium battery - // we need to calculate which of the 10 levels they are on - uint8_t cellCount = systemSettings.cutoutSetting + 2; - uint32_t cellV = getInputVoltageX10(systemSettings.voltageDiv, 0) - / cellCount; - // Should give us approx cell voltage X10 - // Range is 42 -> 33 = 9 steps therefore we will use battery 1-10 - if (cellV < 33) - cellV = 33; - cellV -= 33; // Should leave us a number of 0-9 - if (cellV > 9) - cellV = 9; - OLED::drawBattery(cellV + 1); - } else - OLED::drawSymbol(15); // Draw the DC Logo -#else - // On TS80 we replace this symbol with the voltage we are operating on - // If <9V then show single digit, if not show duals - uint8_t V = getInputVoltageX10(systemSettings.voltageDiv, 0); - if (V % 10 >= 5) - V = V / 10 + 1; // round up - else - V = V / 10; - if (V >= 10) { - int16_t xPos = OLED::getCursorX(); - OLED::setFont(1); - OLED::printNumber(1, 1); - OLED::setCursor(xPos, 8); - OLED::printNumber(V % 10, 1); - OLED::setFont(0); - OLED::setCursor(xPos + 12, 0); // need to reset this as if we drew a wide char - } else { - OLED::printNumber(V, 1); - } -#endif -} -static void gui_solderingTempAdjust() { - uint32_t lastChange = xTaskGetTickCount(); - currentTempTargetDegC = 0; - uint32_t autoRepeatTimer = 0; - uint8_t autoRepeatAcceleration = 0; - for (;;) { - OLED::setCursor(0, 0); - OLED::clearScreen(); - OLED::setFont(0); - ButtonState buttons = getButtonState(); - if (buttons) - lastChange = xTaskGetTickCount(); - switch (buttons) { - case BUTTON_NONE: - // stay - break; - case BUTTON_BOTH: - // exit - return; - break; -case BUTTON_B_LONG: - if (xTaskGetTickCount() - autoRepeatTimer - + autoRepeatAcceleration> PRESS_ACCEL_INTERVAL_MAX) { - if(systemSettings.ReverseButtonTempChangeEnabled) { - systemSettings.SolderingTemp += systemSettings.TempChangeLongStep; - } else systemSettings.SolderingTemp -= systemSettings.TempChangeLongStep; - - autoRepeatTimer = xTaskGetTickCount(); - autoRepeatAcceleration += PRESS_ACCEL_STEP; - } - break; - case BUTTON_B_SHORT: - if(systemSettings.ReverseButtonTempChangeEnabled) { - systemSettings.SolderingTemp += systemSettings.TempChangeShortStep; - } else systemSettings.SolderingTemp -= systemSettings.TempChangeShortStep; - break; - case BUTTON_F_LONG: - if (xTaskGetTickCount() - autoRepeatTimer - + autoRepeatAcceleration> PRESS_ACCEL_INTERVAL_MAX) { - if(systemSettings.ReverseButtonTempChangeEnabled) { - systemSettings.SolderingTemp -= systemSettings.TempChangeLongStep; - } else systemSettings.SolderingTemp += systemSettings.TempChangeLongStep; - autoRepeatTimer = xTaskGetTickCount(); - autoRepeatAcceleration += PRESS_ACCEL_STEP; - } - break; - case BUTTON_F_SHORT: - if(systemSettings.ReverseButtonTempChangeEnabled) { - systemSettings.SolderingTemp -= systemSettings.TempChangeShortStep; // add 10 - } else systemSettings.SolderingTemp += systemSettings.TempChangeShortStep; // add 10 - break; - default: - break; - } - if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration) - < PRESS_ACCEL_INTERVAL_MIN) { - autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX - - PRESS_ACCEL_INTERVAL_MIN; - } - // constrain between 10-450 C - #ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) { - if (systemSettings.SolderingTemp > 850) - systemSettings.SolderingTemp = 850; - if (systemSettings.SolderingTemp < 60) - systemSettings.SolderingTemp = 60; - } - else - #endif - { - if (systemSettings.SolderingTemp > 450) - systemSettings.SolderingTemp = 450; - if (systemSettings.SolderingTemp < 10) - systemSettings.SolderingTemp = 10; - } - - if (xTaskGetTickCount() - lastChange > 200) - return; // exit if user just doesn't press anything for a bit - -#ifdef MODEL_TS80 - if (!OLED::getRotation()) { -#else - if (OLED::getRotation()) { -#endif - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus:SymbolMinus); - } else { - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus:SymbolPlus); - } - - - OLED::print(SymbolSpace); - OLED::printNumber(systemSettings.SolderingTemp, 3); - #ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - OLED::drawSymbol(0); - else - #endif - { - OLED::drawSymbol(1); - } - OLED::print(SymbolSpace); -#ifdef MODEL_TS80 - if (!OLED::getRotation()) { -#else - if (OLED::getRotation()) { -#endif - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus:SymbolPlus); - } else { - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus:SymbolMinus); - } - OLED::refresh(); - GUIDelay(); - } -} - -static int gui_SolderingSleepingMode(bool stayOff) { - // Drop to sleep temperature and display until movement or button press - - for (;;) { - ButtonState buttons = getButtonState(); - if (buttons) - return 0; - if ((xTaskGetTickCount() > 100) - && ((accelInit && (xTaskGetTickCount() - lastMovementTime < 100)) - || (xTaskGetTickCount() - lastButtonTime < 100))) - return 0; // user moved or pressed a button, go back to soldering -#ifdef MODEL_TS100 - if (checkVoltageForExit()) - return 1; // return non-zero on error -#endif -#ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) { - currentTempTargetDegC = stayOff ? 0 : TipThermoModel::convertFtoC( - min(systemSettings.SleepTemp, - systemSettings.SolderingTemp)); - } else -#endif - { - currentTempTargetDegC = stayOff ? 0 : min(systemSettings.SleepTemp, - systemSettings.SolderingTemp); - } - // draw the lcd - uint16_t tipTemp; -#ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - tipTemp = TipThermoModel::getTipInF(); - else -#endif - { - tipTemp = TipThermoModel::getTipInC(); - } - - OLED::clearScreen(); - OLED::setCursor(0, 0); - if (systemSettings.detailedSoldering) { - OLED::setFont(1); - OLED::print(SleepingAdvancedString); - OLED::setCursor(0, 8); - OLED::print(SleepingTipAdvancedString); - OLED::printNumber(tipTemp, 3); -#ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - OLED::print(SymbolDegF); - else -#endif - { - OLED::print(SymbolDegC); - } - - OLED::print(SymbolSpace); - printVoltage(); - OLED::print(SymbolVolts); - } else { - OLED::setFont(0); - OLED::print(SleepingSimpleString); - OLED::printNumber(tipTemp, 3); -#ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - OLED::drawSymbol(0); - else -#endif - { - OLED::drawSymbol(1); - } - } - if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0 - if (lastMovementTime) - if (((uint32_t) (xTaskGetTickCount() - lastMovementTime)) - > (uint32_t) (systemSettings.ShutdownTime * 60 * 100)) { - // shutdown - currentTempTargetDegC = 0; - return 1; // we want to exit soldering mode - } - OLED::refresh(); - GUIDelay(); - } - return 0; -} - -static void display_countdown(int sleepThres) { - /* - * Print seconds or minutes (if > 99 seconds) until sleep - * mode is triggered. - */ - int lastEventTime = - lastButtonTime < lastMovementTime ? - lastMovementTime : lastButtonTime; - int downCount = sleepThres - xTaskGetTickCount() + lastEventTime; - if (downCount > 9900) { - OLED::printNumber(downCount / 6000 + 1, 2); - OLED::print(SymbolMinutes); - } else { - OLED::printNumber(downCount / 100 + 1, 2); - OLED::print(SymbolSeconds); - } -} - -static void gui_solderingMode(uint8_t jumpToSleep) { - /* - * * Soldering (gui_solderingMode) - * -> Main loop where we draw temp, and animations - * --> User presses buttons and they goto the temperature adjust screen - * ---> Display the current setpoint temperature - * ---> Use buttons to change forward and back on temperature - * ---> Both buttons or timeout for exiting - * --> Long hold front button to enter boost mode - * ---> Just temporarily sets the system into the alternate temperature for - * PID control - * --> Long hold back button to exit - * --> Double button to exit - */ - bool boostModeOn = false; - - uint32_t sleepThres = 0; - if (systemSettings.SleepTime < 6) - sleepThres = systemSettings.SleepTime * 10 * 100; - else - sleepThres = (systemSettings.SleepTime - 5) * 60 * 100; - if (jumpToSleep) { - if (gui_SolderingSleepingMode(jumpToSleep == 2)) { - lastButtonTime = xTaskGetTickCount(); - return; // If the function returns non-0 then exit - } - } - for (;;) { - - ButtonState buttons = getButtonState(); - switch (buttons) { - case BUTTON_NONE: - // stay - boostModeOn = false; - break; - case BUTTON_BOTH: - // exit - return; - break; - case BUTTON_B_LONG: - return; // exit on back long hold - break; - case BUTTON_F_LONG: - // if boost mode is enabled turn it on - if (systemSettings.boostModeEnabled) - boostModeOn = true; - break; - case BUTTON_F_SHORT: - case BUTTON_B_SHORT: { - uint16_t oldTemp = systemSettings.SolderingTemp; - gui_solderingTempAdjust(); // goto adjust temp mode - if (oldTemp != systemSettings.SolderingTemp) { - saveSettings(); // only save on change - } - } - break; - default: - break; - } - // else we update the screen information - OLED::setCursor(0, 0); - OLED::clearScreen(); - OLED::setFont(0); - //Draw in the screen details - if (systemSettings.detailedSoldering) { - OLED::setFont(1); - OLED::print(SolderingAdvancedPowerPrompt); // Power: - OLED::printNumber(x10WattHistory.average() / 10, 2); - OLED::print(SymbolDot); - OLED::printNumber(x10WattHistory.average() % 10, 1); - OLED::print(SymbolWatts); - - if (systemSettings.sensitivity && systemSettings.SleepTime) { - OLED::print(SymbolSpace); - display_countdown(sleepThres); - } - - OLED::setCursor(0, 8); - OLED::print(SleepingTipAdvancedString); - //OLED::printNumber( - // TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0)), 5); // Draw the tip temp out finally - - gui_drawTipTemp(true); - OLED::print(SymbolSpace); - printVoltage(); - OLED::print(SymbolVolts); - } else { - // We switch the layout direction depending on the orientation of the - // OLED:: - if (OLED::getRotation()) { - // battery - gui_drawBatteryIcon(); - OLED::print(SymbolSpace); // Space out gap between battery <-> temp - gui_drawTipTemp(true); // Draw current tip temp - - // We draw boost arrow if boosting, or else gap temp <-> heat - // indicator - if (boostModeOn) - OLED::drawSymbol(2); - else - OLED::print(SymbolSpace); - - // Draw heating/cooling symbols - OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); - } else { - // Draw heating/cooling symbols - OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); - // We draw boost arrow if boosting, or else gap temp <-> heat - // indicator - if (boostModeOn) - OLED::drawSymbol(2); - else - OLED::print(SymbolSpace); - gui_drawTipTemp(true); // Draw current tip temp - - OLED::print(SymbolSpace); // Space out gap between battery <-> temp - - gui_drawBatteryIcon(); - } - } - OLED::refresh(); - - // Update the setpoints for the temperature - if (boostModeOn) { -#ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - currentTempTargetDegC = TipThermoModel::convertFtoC( - systemSettings.BoostTemp); - else -#endif - { - currentTempTargetDegC = (systemSettings.BoostTemp); - } - } else { -#ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - currentTempTargetDegC = TipThermoModel::convertFtoC( - systemSettings.SolderingTemp); - else -#endif - { - currentTempTargetDegC = (systemSettings.SolderingTemp); - } - } - -#ifdef MODEL_TS100 - // Undervoltage test - if (checkVoltageForExit()) { - lastButtonTime = xTaskGetTickCount(); - return; - } -#else - // on the TS80 we only want to check for over voltage to prevent tip damage - /*if (getInputVoltageX10(systemSettings.voltageDiv, 1) > 150) { - lastButtonTime = xTaskGetTickCount(); - currentlyActiveTemperatureTarget = 0; - return; // Over voltage - }*/ -#endif - - if (systemSettings.sensitivity && systemSettings.SleepTime) - if (xTaskGetTickCount() - lastMovementTime > sleepThres - && xTaskGetTickCount() - lastButtonTime > sleepThres) { - if (gui_SolderingSleepingMode(false)) { - return; // If the function returns non-0 then exit - } - } - //slow down ui update rate - GUIDelay(); - } -} - -void showDebugMenu(void) { - uint8_t screen = 0; - ButtonState b; - for (;;) { - OLED::clearScreen(); // Ensure the buffer starts clean - OLED::setCursor(0, 0); // Position the cursor at the 0,0 (top left) - OLED::setFont(1); // small font - OLED::print(SymbolVersionNumber); // Print version number - OLED::setCursor(0, 8); // second line - OLED::print(DebugMenu[screen]); - switch (screen) { - case 0: //Just prints date - break; - case 1: - //High water mark for GUI - OLED::printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5); - break; - case 2: - //High water mark for the Movement task - OLED::printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5); - break; - case 3: - //High water mark for the PID task - OLED::printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5); - break; - case 4: - //system up time stamp - OLED::printNumber(xTaskGetTickCount() / 100, 5); - break; - case 5: - //Movement time stamp - OLED::printNumber(lastMovementTime / 100, 5); - break; - case 6: - //Raw Tip - { - uint32_t temp = systemSettings.CalibrationOffset; - systemSettings.CalibrationOffset = 0; - OLED::printNumber( - TipThermoModel::convertTipRawADCTouV(getTipRawTemp(1)), 6); - systemSettings.CalibrationOffset = temp; - } - break; - case 7: - //Temp in C - OLED::printNumber(TipThermoModel::getTipInC(1), 5); - break; - case 8: - //Handle Temp - OLED::printNumber(getHandleTemperature(), 3); - break; - case 9: - //Voltage input - printVoltage(); - break; - case 10: - // Print PCB ID number - OLED::printNumber(PCBVersion, 1); - break; - default: - break; - } - - OLED::refresh(); - b = getButtonState(); - if (b == BUTTON_B_SHORT) - return; - else if (b == BUTTON_F_SHORT) { - screen++; - screen = screen % 11; - } - GUIDelay(); - } -} - -/* StartGUITask function */ -void startGUITask(void const *argument __unused) { - FRToSI2C::FRToSInit(); - uint8_t tempWarningState = 0; - bool buttonLockout = false; - bool tempOnDisplay = false; - getTipRawTemp(1); // reset filter - OLED::setRotation(systemSettings.OrientationMode & 1); - uint32_t ticks = xTaskGetTickCount(); - ticks += 400; // 4 seconds from now - while (xTaskGetTickCount() < ticks) { - if (showBootLogoIfavailable() == false) - ticks = xTaskGetTickCount(); - ButtonState buttons = getButtonState(); - if (buttons) - ticks = xTaskGetTickCount(); // make timeout now so we will exit - GUIDelay(); - } - - if (settingsWereReset) { - //Display alert settings were reset - OLED::clearScreen(); - OLED::setFont(1); - OLED::setCursor(0, 0); - OLED::print(SettingsResetMessage); - OLED::refresh(); - waitForButtonPressOrTimeout(1000); - - } - - if (systemSettings.autoStartMode) { - // jump directly to the autostart mode - if (systemSettings.autoStartMode == 1) - { - gui_solderingMode(0); - buttonLockout = true; - } - else if (systemSettings.autoStartMode == 2) - { - gui_solderingMode(1); - buttonLockout = true; - } - else if (systemSettings.autoStartMode == 3) - { - gui_solderingMode(2); - buttonLockout = true; - } - } - -#ifdef ACCELDEBUG - - for (;;) { - HAL_IWDG_Refresh(&hiwdg); - osDelay(100); - } -//^ Kept here for a way to block this thread -#endif - - for (;;) { - ButtonState buttons = getButtonState(); - if (buttons != BUTTON_NONE) { - OLED::setDisplayState(OLED::DisplayState::ON); - OLED::setFont(0); - } - if (tempWarningState == 2) - buttons = BUTTON_F_SHORT; - if (buttons != BUTTON_NONE && buttonLockout) - buttons = BUTTON_NONE; - else - buttonLockout = false; - - switch (buttons) { - case BUTTON_NONE: - // Do nothing - break; - case BUTTON_BOTH: - // Not used yet - // In multi-language this might be used to reset language on a long hold - // or some such - break; - - case BUTTON_B_LONG: - // Show the version information - showDebugMenu(); - break; - case BUTTON_F_LONG: - gui_solderingTempAdjust(); - saveSettings(); - break; - case BUTTON_F_SHORT: - gui_solderingMode(0); // enter soldering mode - buttonLockout = true; - break; - case BUTTON_B_SHORT: - enterSettingsMenu(); // enter the settings menu - buttonLockout = true; - break; - default: - break; - } - - currentTempTargetDegC = 0; // ensure tip is off - getInputVoltageX10(systemSettings.voltageDiv, 0); - uint16_t tipTemp = TipThermoModel::getTipInC(); - - // Preemptively turn the display on. Turn it off if and only if - // the tip temperature is below 50 degrees C *and* motion sleep - // detection is enabled *and* there has been no activity (movement or - // button presses) in a while. - OLED::setDisplayState(OLED::DisplayState::ON); - - if ((tipTemp < 50) && systemSettings.sensitivity - && (((xTaskGetTickCount() - lastMovementTime) - > MOVEMENT_INACTIVITY_TIME) - && ((xTaskGetTickCount() - lastButtonTime) - > BUTTON_INACTIVITY_TIME))) { - OLED::setDisplayState(OLED::DisplayState::OFF); - } - - // Clear the lcd buffer - OLED::clearScreen(); - OLED::setCursor(0, 0); - if (systemSettings.detailedIDLE) { - OLED::setFont(1); - if (tipTemp > 470) { - OLED::print(TipDisconnectedString); - } else { - OLED::print(IdleTipString); - gui_drawTipTemp(false); - OLED::print(IdleSetString); - OLED::printNumber(systemSettings.SolderingTemp, 3); - } - OLED::setCursor(0, 8); - - OLED::print(InputVoltageString); - printVoltage(); - - } else { - OLED::setFont(0); -#ifdef MODEL_TS80 - if (!OLED::getRotation()) { -#else - if (OLED::getRotation()) { -#endif - OLED::drawArea(12, 0, 84, 16, idleScreenBG); - OLED::setCursor(0, 0); - gui_drawBatteryIcon(); - } else { - OLED::drawArea(0, 0, 84, 16, idleScreenBGF); // Needs to be flipped so button ends up - // on right side of screen - OLED::setCursor(84, 0); - gui_drawBatteryIcon(); - } - if (tipTemp > 55) - tempOnDisplay = true; - else if (tipTemp < 45) - tempOnDisplay = false; - if (tempOnDisplay) { - // draw temp over the start soldering button - // Location changes on screen rotation -#ifdef MODEL_TS80 - if (!OLED::getRotation()) { -#else - if (OLED::getRotation()) { -#endif - // in right handed mode we want to draw over the first part - OLED::fillArea(55, 0, 41, 16, 0); // clear the area for the temp - OLED::setCursor(56, 0); - - } else { - OLED::fillArea(0, 0, 41, 16, 0); // clear the area - OLED::setCursor(0, 0); - } - // draw in the temp - if (!(systemSettings.coolingTempBlink - && (xTaskGetTickCount() % 25 < 16))) - gui_drawTipTemp(false); // draw in the temp - } - } - OLED::refresh(); - GUIDelay(); - } -} diff --git a/workspace/TS100/Core/Src/LIS2DH12.cpp b/workspace/TS100/Core/Src/LIS2DH12.cpp deleted file mode 100644 index b1d25703..00000000 --- a/workspace/TS100/Core/Src/LIS2DH12.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - * LIS2DH12.cpp - * - * Created on: 27Feb.,2018 - * Author: Ralim - */ - -#include <array> - -#include "LIS2DH12.hpp" -#include "cmsis_os.h" - -typedef struct { - const uint8_t reg; - const uint8_t value; -} LIS_REG; - -static const LIS_REG i2c_registers[] = { - {LIS_CTRL_REG1, 0x17}, // 25Hz - {LIS_CTRL_REG2, 0b00001000}, // Highpass filter off - {LIS_CTRL_REG3, 0b01100000}, // Setup interrupt pins - {LIS_CTRL_REG4, 0b00001000}, // Block update mode off, HR on - {LIS_CTRL_REG5, 0b00000010}, - {LIS_CTRL_REG6, 0b01100010}, - //Basically setup the unit to run, and enable 4D orientation detection - {LIS_INT2_CFG, 0b01111110}, //setup for movement detection - {LIS_INT2_THS, 0x28}, - {LIS_INT2_DURATION, 64}, - {LIS_INT1_CFG, 0b01111110}, - {LIS_INT1_THS, 0x28}, - {LIS_INT1_DURATION, 64} -}; - -void LIS2DH12::initalize() { - for (size_t index = 0; index < (sizeof(i2c_registers) / sizeof(i2c_registers[0])); index++) { - FRToSI2C::I2C_RegisterWrite(LIS2DH_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].value); - } -} - -void LIS2DH12::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) { - std::array<int16_t, 3> sensorData; - - FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, - reinterpret_cast<uint8_t*>(sensorData.begin()), - sensorData.size() * sizeof(int16_t)); - - x = sensorData[0]; - y = sensorData[1]; - z = sensorData[2]; -} diff --git a/workspace/TS100/Core/Src/QC3.c b/workspace/TS100/Core/Src/QC3.c new file mode 100644 index 00000000..43cff776 --- /dev/null +++ b/workspace/TS100/Core/Src/QC3.c @@ -0,0 +1,157 @@ +/*
+ * QC3.c
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+// Quick charge 3.0 supporting functions
+#include "QC3.h"
+
+#include "BSP.h"
+#include "cmsis_os.h"
+#include "stdint.h"
+
+void QC_Seek9V() {
+ QC_DNegZero_Six();
+ QC_DPlusThree_Three();
+}
+void QC_Seek12V() {
+ QC_DNegZero_Six();
+ QC_DPlusZero_Six();
+}
+void QC_Seek20V() {
+ QC_DNegThree_Three();
+ QC_DPlusThree_Three();
+}
+void QC_SeekContMode() {
+ QC_DNegThree_Three();
+ QC_DPlusZero_Six();
+}
+void QC_SeekContPlus() {
+ QC_SeekContMode();
+ vTaskDelay(3);
+ QC_Seek20V();
+ vTaskDelay(1);
+ QC_SeekContMode();
+}
+void QC_SeekContNeg() {
+ QC_SeekContMode();
+ vTaskDelay(3);
+ QC_Seek12V();
+ vTaskDelay(1);
+ QC_SeekContMode();
+}
+uint8_t QCMode = 0;
+uint8_t QCTries = 0;
+void seekQC(int16_t Vx10, uint16_t divisor) {
+ if (QCMode == 5) startQC(divisor);
+ if (QCMode == 0) return; // NOT connected to a QC Charger
+
+ if (Vx10 < 45) return;
+ if (xTaskGetTickCount() < 100) return;
+ if (Vx10 > 130) Vx10 = 130; // Cap max value at 13V
+ // Seek the QC to the Voltage given if this adapter supports continuous mode
+ // try and step towards the wanted value
+
+ // 1. Measure current voltage
+ int16_t vStart = getInputVoltageX10(divisor, 1);
+ int difference = Vx10 - vStart;
+
+ // 2. calculate ideal steps (0.2V changes)
+
+ int steps = difference / 2;
+ if (QCMode == 3) {
+ if (steps > -2 && steps < 2) return; // dont bother with small steps
+ while (steps < 0) {
+ QC_SeekContNeg();
+ vTaskDelay(3);
+ steps++;
+ }
+ while (steps > 0) {
+ QC_SeekContPlus();
+ vTaskDelay(3);
+ steps--;
+ }
+ vTaskDelay(10);
+ }
+#ifdef ENABLE_QC2
+ // Re-measure
+ /* Disabled due to nothing to test and code space of around 1k*/
+ steps = vStart - getInputVoltageX10(divisor, 1);
+ if (steps < 0) steps = -steps;
+ if (steps > 4) {
+ // No continuous mode, so QC2
+ QCMode = 2;
+ // Goto nearest
+ if (Vx10 > 110) {
+ // request 12V
+ // D- = 0.6V, D+ = 0.6V
+ // Clamp PB3
+ QC_Seek12V();
+
+ } else {
+ // request 9V
+ QC_Seek9V();
+ }
+ }
+#endif
+}
+// Must be called after FreeRToS Starts
+void startQC(uint16_t divisor) {
+ // Pre check that the input could be >5V already, and if so, dont both
+ // negotiating as someone is feeding in hv
+ uint16_t vin = getInputVoltageX10(divisor, 1);
+ if (vin > 100) {
+ QCMode = 1; // Already at 12V, user has probably over-ridden this
+ return;
+ }
+ QC_Init_GPIO();
+
+ // Tries to negotiate QC for 9V
+ // This is a multiple step process.
+ // 1. Set around 0.6V on D+ for 1.25 Seconds or so
+ // 2. After this It should un-short D+->D- and instead add a 20k pulldown on
+ // D-
+ QC_DPlusZero_Six();
+
+ // Delay 1.25 seconds
+ uint8_t enteredQC = 0;
+ for (uint16_t i = 0; i < 200 && enteredQC == 0; i++) {
+ vTaskDelay(1); // 10mS pause
+ if (i > 130) {
+ if (QC_DM_PulledDown()) {
+ enteredQC = 1;
+ }
+ if (i == 140) {
+ // For some marginal QC chargers, we try adding a pulldown
+ QC_DM_PullDown();
+ }
+ }
+ }
+ QC_DM_No_PullDown();
+ if (enteredQC) {
+ // We have a QC capable charger
+ QC_Seek9V();
+ QC_Post_Probe_En();
+ QC_Seek9V();
+ // Wait for frontend ADC to stabilise
+ QCMode = 4;
+ for (uint8_t i = 0; i < 10; i++) {
+ if (getInputVoltageX10(divisor, 1) > 80) {
+ // yay we have at least QC2.0 or QC3.0
+ QCMode = 3; // We have at least QC2, pray for 3
+ return;
+ }
+ vTaskDelay(10); // 100mS
+ }
+ QCMode = 5;
+ QCTries++;
+ if (QCTries > 10) // 10 goes to get it going
+ QCMode = 0;
+ } else {
+ // no QC
+ QCMode = 0;
+ }
+ if (QCTries > 10) QCMode = 0;
+}
diff --git a/workspace/TS100/Core/Src/Settings.cpp b/workspace/TS100/Core/Src/Settings.cpp index 70bb74eb..716d7c9c 100644 --- a/workspace/TS100/Core/Src/Settings.cpp +++ b/workspace/TS100/Core/Src/Settings.cpp @@ -11,6 +11,7 @@ #include "Settings.h" #include "Setup.h" #include "../../configuration.h" +#include "BSP.h" #define FLASH_ADDR \ (0x8000000 | \ 0xFC00) /*Flash start OR'ed with the maximum amount of flash - 1024 bytes*/ @@ -19,39 +20,12 @@ volatile systemSettingsType systemSettings; void saveSettings() { // First we erase the flash - FLASH_EraseInitTypeDef pEraseInit; - pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES; - pEraseInit.Banks = FLASH_BANK_1; - pEraseInit.NbPages = 1; - pEraseInit.PageAddress = FLASH_ADDR; - uint32_t failingAddress = 0; - HAL_IWDG_Refresh(&hiwdg); - __HAL_FLASH_CLEAR_FLAG( - FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY); - HAL_FLASH_Unlock(); - HAL_Delay(10); - HAL_IWDG_Refresh(&hiwdg); - HAL_FLASHEx_Erase(&pEraseInit, &failingAddress); - //^ Erase the page of flash (1024 bytes on this stm32) - // erased the chunk - // now we program it - uint16_t *data = (uint16_t*) &systemSettings; - HAL_FLASH_Unlock(); - - for (uint8_t i = 0; i < (sizeof(systemSettingsType) / 2); i++) { - HAL_IWDG_Refresh(&hiwdg); - HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_ADDR + (i * 2), - data[i]); - } - HAL_FLASH_Lock(); + flash_save_buffer((uint8_t*) &systemSettings, sizeof(systemSettingsType)); } bool restoreSettings() { // We read the flash - uint16_t *data = (uint16_t*) &systemSettings; - for (uint8_t i = 0; i < (sizeof(systemSettingsType) / 2); i++) { - data[i] = *((uint16_t*) (FLASH_ADDR + (i * 2))); - } + flash_read_buffer((uint8_t*) &systemSettings, sizeof(systemSettingsType)); // if the version is correct were done // if not we reset and save @@ -80,12 +54,12 @@ void resetSettings() { memset((void*) &systemSettings, 0, sizeof(systemSettingsType)); systemSettings.SleepTemp = SLEEP_TEMP; // Temperature the iron sleeps at - default 150.0 C systemSettings.SleepTime = SLEEP_TIME; // How many seconds/minutes we wait until going - // to sleep - default 1 min - systemSettings.SolderingTemp = SOLDERING_TEMP; // Default soldering temp is 320.0 C + // to sleep - default 1 min + systemSettings.SolderingTemp = SOLDERING_TEMP; // Default soldering temp is 320.0 C systemSettings.cutoutSetting = CUT_OUT_SETTING; // default to no cut-off voltage (or 18W for TS80) systemSettings.version = SETTINGSVERSION; // Store the version number to allow for easier upgrades - systemSettings.detailedSoldering = DETAILED_SOLDERING; // Detailed soldering screen + systemSettings.detailedSoldering = DETAILED_SOLDERING; // Detailed soldering screen systemSettings.detailedIDLE = DETAILED_IDLE; // Detailed idle screen (off for first time users) systemSettings.OrientationMode = ORIENTATION_MODE; // Default to automatic systemSettings.sensitivity = SENSITIVITY; // Default high sensitivity @@ -93,19 +67,19 @@ void resetSettings() { systemSettings.ShutdownTime = SHUTDOWN_TIME; // How many minutes until the unit turns itself off systemSettings.boostModeEnabled = BOOST_MODE_ENABLED; // Default to having boost mode on as most people prefer it systemSettings.BoostTemp = BOOST_TEMP; // default to 400C - systemSettings.autoStartMode = AUTO_START_MODE; // Auto start off for safety + systemSettings.autoStartMode = AUTO_START_MODE; // Auto start off for safety systemSettings.coolingTempBlink = COOLING_TEMP_BLINK; // Blink the temperature on the cooling screen when its > 50C #ifdef ENABLED_FAHRENHEIT_SUPPORT systemSettings.temperatureInF = TEMPERATURE_INF; // default to 0 #endif - systemSettings.descriptionScrollSpeed = DESCRIPTION_SCROLL_SPEED; // default to slow + systemSettings.descriptionScrollSpeed = DESCRIPTION_SCROLL_SPEED; // default to slow systemSettings.powerLimitEnable = POWER_LIMIT_ENABLE; // Default to no power limit - systemSettings.CalibrationOffset = CALIBRATION_OFFSET; // the adc offset in uV + systemSettings.CalibrationOffset = CALIBRATION_OFFSET; // the adc offset in uV systemSettings.powerLimit = POWER_LIMIT; // 30 watts default limit systemSettings.ReverseButtonTempChangeEnabled = REVERSE_BUTTON_TEMP_CHANGE; // systemSettings.TempChangeShortStep = TEMP_CHANGE_SHORT_STEP; // systemSettings.TempChangeLongStep = TEMP_CHANGE_LONG_STEP; // - systemSettings.KeepAwakePulse= POWER_PULSE_DEFAULT; + systemSettings.KeepAwakePulse = POWER_PULSE_DEFAULT; systemSettings.TipGain = TIP_GAIN; saveSettings(); // Save defaults } diff --git a/workspace/TS100/Core/Src/gui.cpp b/workspace/TS100/Core/Src/gui.cpp index ca4e92c1..2fe91a24 100644 --- a/workspace/TS100/Core/Src/gui.cpp +++ b/workspace/TS100/Core/Src/gui.cpp @@ -13,8 +13,8 @@ #include "string.h" #include "unit.h" #include "../../configuration.h" +#include "Buttons.hpp" -extern uint32_t lastButtonTime; void gui_Menu(const menuitem *menu); #ifdef MODEL_TS100 diff --git a/workspace/TS100/Core/Src/hardware.cpp b/workspace/TS100/Core/Src/hardware.cpp deleted file mode 100644 index 7deb1380..00000000 --- a/workspace/TS100/Core/Src/hardware.cpp +++ /dev/null @@ -1,393 +0,0 @@ -/* - * hardware.c - * - * Created on: 2Sep.,2017 - * Author: Ben V. Brown - */ - -// These are all the functions for interacting with the hardware -#include "hardware.h" -#include "history.hpp" -volatile uint16_t PWMSafetyTimer = 0; - -uint16_t getHandleTemperature() { - // We return the current handle temperature in X10 C - // TMP36 in handle, 0.5V offset and then 10mV per deg C (0.75V @ 25C for - // example) STM32 = 4096 count @ 3.3V input -> But We oversample by 32/(2^2) = - // 8 times oversampling Therefore 32768 is the 3.3V input, so 0.1007080078125 - // mV per count So we need to subtract an offset of 0.5V to center on 0C - // (4964.8 counts) - // - int32_t result = getADC(0); - result -= 4965; // remove 0.5V offset - // 10mV per C - // 99.29 counts per Deg C above 0C - result *= 100; - result /= 993; - return result; -} - -uint16_t getTipInstantTemperature() { - uint16_t sum = 0; // 12 bit readings * 8 -> 15 bits - uint16_t readings[8]; - //Looking to reject the highest outlier readings. - //As on some hardware these samples can run into the op-amp recovery time - //Once this time is up the signal stabilises quickly, so no need to reject minimums - readings[0] = hadc1.Instance->JDR1; - readings[1] = hadc1.Instance->JDR2; - readings[2] = hadc1.Instance->JDR3; - readings[3] = hadc1.Instance->JDR4; - readings[4] = hadc2.Instance->JDR1; - readings[5] = hadc2.Instance->JDR2; - readings[6] = hadc2.Instance->JDR3; - readings[7] = hadc2.Instance->JDR4; - - for (int i = 0; i < 8; i++) { - sum += readings[i]; - } - return sum; // 8x over sample -} - -//2 second filter (ADC is PID_TIM_HZ Hz) -history<uint16_t, PID_TIM_HZ> rawTempFilter = { { 0 }, 0, 0 }; - -uint16_t getTipRawTemp(uint8_t refresh) { - if (refresh) { - uint16_t lastSample = getTipInstantTemperature(); - rawTempFilter.update(lastSample); - return lastSample; - } else { - return rawTempFilter.average(); - } -} - -uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) { - // ADC maximum is 32767 == 3.3V at input == 28.05V at VIN - // Therefore we can divide down from there - // Multiplying ADC max by 4 for additional calibration options, - // ideal term is 467 -#ifdef MODEL_TS100 -#define BATTFILTERDEPTH 32 -#else -#define BATTFILTERDEPTH 8 - -#endif - static uint8_t preFillneeded = 10; - static uint32_t samples[BATTFILTERDEPTH]; - static uint8_t index = 0; - if (preFillneeded) { - for (uint8_t i = 0; i < BATTFILTERDEPTH; i++) - samples[i] = getADC(1); - preFillneeded--; - } - if (sample) { - samples[index] = getADC(1); - index = (index + 1) % BATTFILTERDEPTH; - } - uint32_t sum = 0; - - for (uint8_t i = 0; i < BATTFILTERDEPTH; i++) - sum += samples[i]; - - sum /= BATTFILTERDEPTH; - return sum * 4 / divisor; -} -#ifdef MODEL_TS80 -void DPlusZero_Six() { - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // pull down D+ -} -void DNegZero_Six() { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); -} -void DPlusThree_Three() { - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); // pull up D+ -} -void DNegThree_Three() { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); -} - -void QC_Seek9V() { - DNegZero_Six(); - DPlusThree_Three(); -} -void QC_Seek12V() { - DNegZero_Six(); - DPlusZero_Six(); -} -void QC_Seek20V() { - DNegThree_Three(); - DPlusThree_Three(); -} -void QC_SeekContMode() { - DNegThree_Three(); - DPlusZero_Six(); -} -void QC_SeekContPlus() { - QC_SeekContMode(); - vTaskDelay(3); - QC_Seek20V(); - vTaskDelay(1); - QC_SeekContMode(); -} -void QC_SeekContNeg() { - QC_SeekContMode(); - vTaskDelay(3); - QC_Seek12V(); - vTaskDelay(1); - QC_SeekContMode(); -} -uint8_t QCMode = 0; -uint8_t QCTries = 0; -void seekQC(int16_t Vx10, uint16_t divisor) { - if (QCMode == 5) - startQC(divisor); - if (QCMode == 0) - return; // NOT connected to a QC Charger - - if (Vx10 < 45) - return; - if (xTaskGetTickCount() < 100) - return; - if (Vx10 > 130) - Vx10 = 130; //Cap max value at 13V - // Seek the QC to the Voltage given if this adapter supports continuous mode - // try and step towards the wanted value - - // 1. Measure current voltage - int16_t vStart = getInputVoltageX10(divisor, 1); - int difference = Vx10 - vStart; - - // 2. calculate ideal steps (0.2V changes) - - int steps = difference / 2; - if (QCMode == 3) { - if (steps > -2 && steps < 2) - return; // dont bother with small steps - while (steps < 0) { - QC_SeekContNeg(); - vTaskDelay(3); - steps++; - } - while (steps > 0) { - QC_SeekContPlus(); - vTaskDelay(3); - steps--; - } - vTaskDelay(10); - } -#ifdef ENABLE_QC2 - // Re-measure - /* Disabled due to nothing to test and code space of around 1k*/ - steps = vStart - getInputVoltageX10(divisor, 1); - if (steps < 0) - steps = -steps; - if (steps > 4) { - // No continuous mode, so QC2 - QCMode = 2; - // Goto nearest - if (Vx10 > 110) { - // request 12V - // D- = 0.6V, D+ = 0.6V - // Clamp PB3 - QC_Seek12V(); - - } else { - // request 9V - QC_Seek9V(); - } - } -#endif -} -// Must be called after FreeRToS Starts -void startQC(uint16_t divisor) { - // Pre check that the input could be >5V already, and if so, dont both - // negotiating as someone is feeding in hv - uint16_t vin = getInputVoltageX10(divisor, 1); - if (vin > 100) { - QCMode = 1; // Already at 12V, user has probably over-ridden this - return; - } - GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Pin = GPIO_PIN_3; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - //Turn off output mode on pins that we can - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_13; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - // Tries to negotiate QC for 9V - // This is a multiple step process. - // 1. Set around 0.6V on D+ for 1.25 Seconds or so - // 2. After this It should un-short D+->D- and instead add a 20k pulldown on - // D- - DPlusZero_Six(); - - // Delay 1.25 seconds - uint8_t enteredQC = 0; - for (uint16_t i = 0; i < 200 && enteredQC == 0; i++) { - vTaskDelay(1); //10mS pause - if (i > 130) { - if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET) { - enteredQC = 1; - } - if (i == 140) { - //For some marginal QC chargers, we try adding a pulldown - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Pin = GPIO_PIN_11; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - } - } - } - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Pin = GPIO_PIN_11; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - if (enteredQC) { - // We have a QC capable charger - QC_Seek9V(); - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - QC_Seek9V(); - // Wait for frontend ADC to stabilise - QCMode = 4; - for (uint8_t i = 0; i < 10; i++) { - if (getInputVoltageX10(divisor, 1) > 80) { - // yay we have at least QC2.0 or QC3.0 - QCMode = 3; // We have at least QC2, pray for 3 - return; - } - vTaskDelay(10); // 100mS - } - QCMode = 5; - QCTries++; - if (QCTries > 10) // 10 goes to get it going - QCMode = 0; - } else { - // no QC - QCMode = 0; - } - if (QCTries > 10) - QCMode = 0; -} - -static unsigned int sqrt32(unsigned long n) { - unsigned int c = 0x8000; - unsigned int g = 0x8000; - - for (;;) { - if (g * g > n) - g ^= c; - c >>= 1; - if (c == 0) - return g; - g |= c; - } -} -int16_t calculateMaxVoltage(uint8_t useHP) { -// This measures the tip resistance, then it calculates the appropriate -// voltage To stay under ~18W. Mosfet is "9A", so no issues there -// QC3.0 supports up to 18W, which is 2A @9V and 1.5A @12V - uint32_t milliOhms = 4500; -// Check no tip - if (milliOhms > 10000) - return -1; -//Because of tolerance, if a user has asked for the higher power mode, then just goto 12V and call it a day - if (useHP) - return 120; -// -// V = sqrt(18W*R) -// Convert this to sqrt(18W)*sqrt(milli ohms)*sqrt(1/1000) - - uint32_t Vx = sqrt32(milliOhms); - if (useHP) - Vx *= 1549; //sqrt(24)*sqrt(1/1000)*10000 - else - Vx *= 1342; // sqrt(18) * sqrt(1/1000)*10000 - -// Round to nearest 200mV, -// So divide by 100 to start, to get in Vxx - Vx /= 100; - if (Vx % 10 >= 5) - Vx += 10; - Vx /= 10; -// Round to nearest increment of 2 - if (Vx % 2 == 1) - Vx++; -//Because of how bad the tolerance is on detecting the tip resistance is -//Its more functional to bin this - if (Vx < 90) - Vx = 90; - else if (Vx >= 105) - Vx = 120; - return Vx; -} - -#endif -volatile uint8_t pendingPWM = 0; - -void setTipPWM(uint8_t pulse) { - PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is - // disabled if the PID task is not scheduled often enough. - - pendingPWM = pulse; -} - -// These are called by the HAL after the corresponding events from the system -// timers. - -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { -// Period has elapsed - if (htim->Instance == TIM2) { - // we want to turn on the output again - PWMSafetyTimer--; - // We decrement this safety value so that lockups in the - // scheduler will not cause the PWM to become locked in an - // active driving state. - // While we could assume this could never happen, its a small price for - // increased safety - htim2.Instance->CCR4 = pendingPWM; - if (htim2.Instance->CCR4 && PWMSafetyTimer) { - HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); - } else { - HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1); - } - } else if (htim->Instance == TIM1) { - // STM uses this for internal functions as a counter for timeouts - HAL_IncTick(); - } -} - -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { -// This was a when the PWM for the output has timed out - if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4) { - HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1); - } -} - -void vApplicationIdleHook(void) { - HAL_IWDG_Refresh(&hiwdg); -} - -/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ -static StaticTask_t xIdleTaskTCBBuffer; -static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; - -void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, - StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) { - *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; - *ppxIdleTaskStackBuffer = &xIdleStack[0]; - *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; - /* place for user code */ -} -/* USER CODE END GET_IDLE_TASK_MEMORY */ diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index ad952611..9d5e19f4 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -1,22 +1,18 @@ // By Ben V. Brown - V2.0 of the TS100 firmware -#include <MMA8652FC.hpp> -#include <gui.hpp> + +/* + * Main.cpp bootstraps the device and then hands over to FreeRTOS and the threads + */ + +#include "BSP.h" #include <main.hpp> #include "LIS2DH12.hpp" -#include <history.hpp> +#include <MMA8652FC.hpp> #include <power.hpp> #include "Settings.h" -#include "Translation.h" #include "cmsis_os.h" -#include "stdlib.h" -#include "stm32f1xx_hal.h" -#include "string.h" -#include "TipThermoModel.h" uint8_t PCBVersion = 0; // File local variables -uint32_t currentTempTargetDegC = 0; // Current temperature target in C -uint8_t accelInit = 0; -uint32_t lastMovementTime = 0; bool settingsWereReset = false; // FreeRTOS variables @@ -35,34 +31,23 @@ static const size_t MOVTaskStackSize = 512 / 4; uint32_t MOVTaskBuffer[MOVTaskStackSize]; osStaticThreadDef_t MOVTaskControlBlock; -static TaskHandle_t pidTaskNotification = NULL; -static TickType_t powerPulseRate = 1000; -static TickType_t powerPulseDuration = 50; -void startGUITask(void const *argument); -void startPIDTask(void const *argument); -void startMOVTask(void const *argument); // End FreeRTOS // Main sets up the hardware then hands over to the FreeRTOS kernel int main(void) { - /* Reset of all peripherals, Initializes the Flash interface and the Systick. - */ - HAL_Init(); - Setup_HAL(); // Setup all the HAL objects - HAL_IWDG_Refresh(&hiwdg); + preRToSInit(); + setTipX10Watts(0); // force tip off - FRToSI2C::init(&hi2c1); OLED::initialize(); // start up the LCD OLED::setFont(0); // default to bigger font // Testing for which accelerometer is mounted - uint8_t buffer[1]; - HAL_IWDG_Refresh(&hiwdg); - if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, - 1000) == HAL_OK) { + resetWatchdog(); + resetWatchdog(); + settingsWereReset = restoreSettings(); // load the settings from flash + if (MMA8652FC::detect()) { PCBVersion = 1; MMA8652FC::initalize(); // this sets up the I2C registers - } else if (HAL_I2C_Mem_Read(&hi2c1, 25 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, - buffer, 1, 1000) == HAL_OK) { + } else if (LIS2DH12::detect()) { PCBVersion = 2; // Setup the ST Accelerometer LIS2DH12::initalize(); // startup the accelerometer @@ -72,10 +57,8 @@ int main(void) { systemSettings.ShutdownTime = 0; // No accel -> disable sleep systemSettings.sensitivity = 0; } - HAL_IWDG_Refresh(&hiwdg); - settingsWereReset = restoreSettings(); // load the settings from flash - HAL_IWDG_Refresh(&hiwdg); + resetWatchdog(); /* Create the thread(s) */ /* definition and creation of GUITask */ @@ -97,263 +80,7 @@ int main(void) { /* Start scheduler */ osKernelStart(); - /* We should never get here as control is now taken by the scheduler */ - while (1) { - } -} - -/* StartPIDTask function */ -void startPIDTask(void const *argument __unused) { - /* - * We take the current tip temperature & evaluate the next step for the tip - * control PWM. - */ - setTipX10Watts(0); // disable the output driver if the output is set to be off - TickType_t lastPowerPulseStart = 0; - TickType_t lastPowerPulseEnd = 0; - - history<int32_t, PID_TIM_HZ> tempError = { { 0 }, 0, 0 }; - currentTempTargetDegC = 0; // Force start with no output (off). If in sleep / soldering this will - // be over-ridden rapidly - pidTaskNotification = xTaskGetCurrentTaskHandle(); - uint32_t PIDTempTarget = 0; for (;;) { - - if (ulTaskNotifyTake(pdTRUE, 2000)) { - // This is a call to block this thread until the ADC does its samples - int32_t x10WattsOut = 0; - // Do the reading here to keep the temp calculations churning along - uint32_t currentTipTempInC = TipThermoModel::getTipInC(true); - PIDTempTarget = currentTempTargetDegC; - if (PIDTempTarget) { - // Cap the max set point to 450C - if (PIDTempTarget > (450)) { - //Maximum allowed output - PIDTempTarget = (450); - } - //Safety check that not aiming higher than current tip can measure - if (PIDTempTarget > TipThermoModel::getTipMaxInC()) { - PIDTempTarget = TipThermoModel::getTipMaxInC(); - } - // Convert the current tip to degree's C - - // As we get close to our target, temp noise causes the system - // to be unstable. Use a rolling average to dampen it. - // We overshoot by roughly 1 degree C. - // This helps stabilize the display. - int32_t tError = PIDTempTarget - currentTipTempInC + 1; - tError = tError > INT16_MAX ? INT16_MAX : tError; - tError = tError < INT16_MIN ? INT16_MIN : tError; - tempError.update(tError); - - // Now for the PID! - - // P term - total power needed to hit target temp next cycle. - // thermal mass = 1690 milliJ/*C for my tip. - // = Watts*Seconds to raise Temp from room temp to +100*C, divided by 100*C. - // we divide milliWattsNeeded by 20 to let the I term dominate near the set point. - // This is necessary because of the temp noise and thermal lag in the system. - // Once we have feed-forward temp estimation we should be able to better tune this. - - int32_t x10WattsNeeded = tempToX10Watts(tError); -// tempError.average()); - // note that milliWattsNeeded is sometimes negative, this counters overshoot - // from I term's inertia. - x10WattsOut += x10WattsNeeded; - - // I term - energy needed to compensate for heat loss. - // We track energy put into the system over some window. - // Assuming the temp is stable, energy in = energy transfered. - // (If it isn't, P will dominate). - x10WattsOut += x10WattHistory.average(); - - // D term - use sudden temp change to counter fast cooling/heating. - // In practice, this provides an early boost if temp is dropping - // and counters extra power if the iron is no longer losing temp. - // basically: temp - lastTemp - // Unfortunately, our temp signal is too noisy to really help. - - } - //If the user turns on the option of using an occasional pulse to keep the power bank on - if (systemSettings.KeepAwakePulse) { - - if (xTaskGetTickCount() - lastPowerPulseStart - > powerPulseRate) { - lastPowerPulseStart = xTaskGetTickCount(); - lastPowerPulseEnd = lastPowerPulseStart - + powerPulseDuration; - } - - //If current PID is less than the pulse level, check if we want to constrain to the pulse as the floor - if (x10WattsOut < systemSettings.KeepAwakePulse - && xTaskGetTickCount() < lastPowerPulseEnd) { - x10WattsOut = systemSettings.KeepAwakePulse; - } - } - - //Secondary safety check to forcefully disable header when within ADC noise of top of ADC - if (getTipRawTemp(0) > (0x7FFF - 150)) { - x10WattsOut = 0; - } - if (systemSettings.powerLimitEnable - && x10WattsOut > (systemSettings.powerLimit * 10)) { - setTipX10Watts(systemSettings.powerLimit * 10); - } else { - setTipX10Watts(x10WattsOut); - } - - HAL_IWDG_Refresh(&hiwdg); - } else { - //ADC interrupt timeout - setTipPWM(0); - } } } - -#define MOVFilter 8 -void startMOVTask(void const *argument __unused) { - OLED::setRotation(true); - -#ifdef MODEL_TS80 - startQC(systemSettings.voltageDiv); - while (pidTaskNotification == 0) - osDelay(30); // To ensure we return after idealQCVoltage/tip resistance - - seekQC((systemSettings.cutoutSetting) ? 120 : 90, - systemSettings.voltageDiv); // this will move the QC output to the preferred voltage to start with - -#else - osDelay(250); // wait for accelerometer to stabilize -#endif - - OLED::setRotation(systemSettings.OrientationMode & 1); - lastMovementTime = 0; - int16_t datax[MOVFilter] = { 0 }; - int16_t datay[MOVFilter] = { 0 }; - int16_t dataz[MOVFilter] = { 0 }; - uint8_t currentPointer = 0; - int16_t tx = 0, ty = 0, tz = 0; - int32_t avgx = 0, avgy = 0, avgz = 0; - if (systemSettings.sensitivity > 9) - systemSettings.sensitivity = 9; -#ifdef ACCELDEBUG - uint32_t max = 0; -#endif - Orientation rotation = ORIENTATION_FLAT; - for (;;) { - int32_t threshold = 1500 + (9 * 200); - threshold -= systemSettings.sensitivity * 200; // 200 is the step size - - if (PCBVersion == 2) { - LIS2DH12::getAxisReadings(tx, ty, tz); - rotation = LIS2DH12::getOrientation(); - } else if (PCBVersion == 1) { - MMA8652FC::getAxisReadings(tx, ty, tz); - rotation = MMA8652FC::getOrientation(); - } - if (systemSettings.OrientationMode == 2) { - if (rotation != ORIENTATION_FLAT) { - OLED::setRotation(rotation == ORIENTATION_LEFT_HAND); // link the data through - } - } - datax[currentPointer] = (int32_t) tx; - datay[currentPointer] = (int32_t) ty; - dataz[currentPointer] = (int32_t) tz; - if (!accelInit) { - for (uint8_t i = currentPointer + 1; i < MOVFilter; i++) { - datax[i] = (int32_t) tx; - datay[i] = (int32_t) ty; - dataz[i] = (int32_t) tz; - } - accelInit = 1; - } - currentPointer = (currentPointer + 1) % MOVFilter; - avgx = avgy = avgz = 0; - // calculate averages - for (uint8_t i = 0; i < MOVFilter; i++) { - avgx += datax[i]; - avgy += datay[i]; - avgz += dataz[i]; - } - avgx /= MOVFilter; - avgy /= MOVFilter; - avgz /= MOVFilter; - - // Sum the deltas - int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz)); - // So now we have averages, we want to look if these are different by more - // than the threshold - - // If error has occurred then we update the tick timer - if (error > threshold) { - lastMovementTime = xTaskGetTickCount(); - } - - osDelay(100); // Slow down update rate -#ifdef MODEL_TS80 - seekQC((systemSettings.cutoutSetting) ? 120 : 90, - systemSettings.voltageDiv); // Run the QC seek again if we have drifted too much -#endif - } -} - -// Second last page of flash set aside for logo image. -#define FLASH_LOGOADDR (0x8000000 | 0xF800) - -// Logo header signature. -#define LOGO_HEADER_VALUE 0xF00DAA55 - -bool showBootLogoIfavailable() { -// Do not show logo data if signature is not found. - if (LOGO_HEADER_VALUE - != *(reinterpret_cast<const uint32_t*>(FLASH_LOGOADDR))) { - return false; - } - - OLED::drawAreaSwapped(0, 0, 96, 16, (uint8_t*) (FLASH_LOGOADDR + 4)); - OLED::refresh(); - return true; -} - -/* - * Catch the IRQ that says that the conversion is done on the temperature - * readings coming in Once these have come in we can unblock the PID so that it - * runs again - */ -void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - if (hadc == &hadc1) { - if (pidTaskNotification) { - vTaskNotifyGiveFromISR(pidTaskNotification, - &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - } -} -void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c __unused) { - FRToSI2C::CpltCallback(); -} -void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c __unused) { - FRToSI2C::CpltCallback(); -} -void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c __unused) { - FRToSI2C::CpltCallback(); -} -void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c __unused) { - - FRToSI2C::CpltCallback(); -} -void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c __unused) { - - FRToSI2C::CpltCallback(); -} -void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c __unused) { - FRToSI2C::CpltCallback(); -} -void vApplicationStackOverflowHook(xTaskHandle *pxTask __unused, - signed portCHAR *pcTaskName __unused) { - -// We dont have a good way to handle a stack overflow at this point in time - NVIC_SystemReset(); -} diff --git a/workspace/TS100/Core/Src/power.cpp b/workspace/TS100/Core/Src/power.cpp index 99887079..4cceb9c5 100644 --- a/workspace/TS100/Core/Src/power.cpp +++ b/workspace/TS100/Core/Src/power.cpp @@ -2,12 +2,12 @@ * power.cpp * * Created on: 28 Oct, 2018 - * Authors: Ben V. Brown, David Hilton + * Authors: Ben V. Brown, David Hilton <- Mostly David */ #include <power.hpp> #include <Settings.h> -#include <hardware.h> +#include <BSP.h> const uint16_t powerPWM = 255; const uint16_t totalPWM = 255 + 17; //htim2.Init.Period, the full PWM cycle diff --git a/workspace/TS100/Core/Src/syscalls.c b/workspace/TS100/Core/Src/syscalls.c new file mode 100644 index 00000000..1a0f4f8e --- /dev/null +++ b/workspace/TS100/Core/Src/syscalls.c @@ -0,0 +1,114 @@ +/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char *stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+/* Functions */
+void initialise_monitor_handles() {
+}
+
+int _getpid(void) {
+ return 1;
+}
+
+int _kill(int pid, int sig) {
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit(int status) {
+ _kill(status, -1);
+ while (1) {
+ } /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len) {
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++) {
+ *ptr++ = __io_getchar();
+ }
+
+ return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len) {
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++) {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+int _close(int file) {
+ return -1;
+}
+
+int _fstat(int file, struct stat *st) {
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file) {
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir) {
+ return 0;
+}
+
+int _open(char *path, int flags, ...) {
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status) {
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name) {
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf) {
+ return -1;
+}
+
+int _stat(char *file, struct stat *st) {
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new) {
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void) {
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env) {
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/workspace/TS100/Core/Src/sysmem.c b/workspace/TS100/Core/Src/sysmem.c new file mode 100644 index 00000000..fc88ed94 --- /dev/null +++ b/workspace/TS100/Core/Src/sysmem.c @@ -0,0 +1,18 @@ +/* Includes */
+#include <errno.h>
+#include <stdio.h>
+
+/* Variables */
+extern int errno;
+register char *stack_ptr asm("sp");
+
+/* Functions */
+
+/**
+ _sbrk
+ Increase program data space. Malloc and related functions depend on this
+ **/
+caddr_t _sbrk(int incr) {
+ return (void*) -1;
+}
+
diff --git a/workspace/TS100/Core/Threads/GUIThread.cpp b/workspace/TS100/Core/Threads/GUIThread.cpp new file mode 100644 index 00000000..668b60b7 --- /dev/null +++ b/workspace/TS100/Core/Threads/GUIThread.cpp @@ -0,0 +1,756 @@ +/* + * GUIThread.cpp + * + * Created on: 19 Aug 2019 + * Author: ralim + */ +extern "C" { +#include "FreeRTOSConfig.h" +} +#include <MMA8652FC.hpp> +#include <gui.hpp> +#include <history.hpp> +#include <main.hpp> +#include <power.hpp> + +#include "../../configuration.h" +#include "Buttons.hpp" +#include "LIS2DH12.hpp" +#include "Settings.h" +#include "TipThermoModel.h" +#include "Translation.h" +#include "cmsis_os.h" +#include "stdlib.h" +#include "string.h" +#include "unit.h" +extern uint8_t PCBVersion; +// File local variables +extern uint32_t currentTempTargetDegC; +extern uint8_t accelInit; +extern uint32_t lastMovementTime; +extern int16_t idealQCVoltage; +extern osThreadId GUITaskHandle; +extern osThreadId MOVTaskHandle; +extern osThreadId PIDTaskHandle; + +#define MOVEMENT_INACTIVITY_TIME (60 * configTICK_RATE_HZ) +#define BUTTON_INACTIVITY_TIME (60 * configTICK_RATE_HZ) + +static uint16_t min(uint16_t a, uint16_t b) { + if (a > b) + return b; + else + return a; +} + +void printVoltage() { + uint32_t volt = getInputVoltageX10(systemSettings.voltageDiv, 0); + OLED::printNumber(volt / 10, 2); + OLED::print(SymbolDot); + OLED::printNumber(volt % 10, 1); +} +void GUIDelay() { + // Called in all UI looping tasks, + // This limits the re-draw rate to the LCD and also lets the DMA run + // As the gui task can very easily fill this bus with transactions, which will + // prevent the movement detection from running + osDelay(50); +} +void gui_drawTipTemp(bool symbol) { + // Draw tip temp handling unit conversion & tolerance near setpoint + uint16_t Temp = 0; +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + Temp = TipThermoModel::getTipInF(); + else +#endif + Temp = TipThermoModel::getTipInC(); + + OLED::printNumber(Temp, 3); // Draw the tip temp out finally + if (symbol) { + if (OLED::getFont() == 0) { + // Big font, can draw nice symbols +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + OLED::drawSymbol(0); + else +#endif + OLED::drawSymbol(1); + } else { + // Otherwise fall back to chars +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + OLED::print(SymbolDegF); + else +#endif + OLED::print(SymbolDegC); + } + } +} + +#ifdef MODEL_TS100 +// returns true if undervoltage has occured +static bool checkVoltageForExit() { + uint16_t v = getInputVoltageX10(systemSettings.voltageDiv, 0); + + // Dont check for first 1.5 seconds while the ADC stabilizes and the DMA fills the buffer + if (xTaskGetTickCount() > 150) { + if ((v < lookupVoltageLevel(systemSettings.cutoutSetting))) { + GUIDelay(); + OLED::clearScreen(); + OLED::setCursor(0, 0); + if (systemSettings.detailedSoldering) { + OLED::setFont(1); + OLED::print(UndervoltageString); + OLED::setCursor(0, 8); + OLED::print(InputVoltageString); + printVoltage(); + OLED::print(SymbolVolts); + + } else { + OLED::setFont(0); + OLED::print(UVLOWarningString); + } + + OLED::refresh(); + currentTempTargetDegC = 0; + waitForButtonPress(); + return true; + } + } + return false; +} +#endif +static void gui_drawBatteryIcon() { +#ifdef MODEL_TS100 + if (systemSettings.cutoutSetting) { + // User is on a lithium battery + // we need to calculate which of the 10 levels they are on + uint8_t cellCount = systemSettings.cutoutSetting + 2; + uint32_t cellV = getInputVoltageX10(systemSettings.voltageDiv, 0) / cellCount; + // Should give us approx cell voltage X10 + // Range is 42 -> 33 = 9 steps therefore we will use battery 1-10 + if (cellV < 33) cellV = 33; + cellV -= 33; // Should leave us a number of 0-9 + if (cellV > 9) cellV = 9; + OLED::drawBattery(cellV + 1); + } else + OLED::drawSymbol(15); // Draw the DC Logo +#else + // On TS80 we replace this symbol with the voltage we are operating on + // If <9V then show single digit, if not show duals + uint8_t V = getInputVoltageX10(systemSettings.voltageDiv, 0); + if (V % 10 >= 5) + V = V / 10 + 1; // round up + else + V = V / 10; + if (V >= 10) { + int16_t xPos = OLED::getCursorX(); + OLED::setFont(1); + OLED::printNumber(1, 1); + OLED::setCursor(xPos, 8); + OLED::printNumber(V % 10, 1); + OLED::setFont(0); + OLED::setCursor(xPos + 12, 0); // need to reset this as if we drew a wide char + } else { + OLED::printNumber(V, 1); + } +#endif +} +static void gui_solderingTempAdjust() { + uint32_t lastChange = xTaskGetTickCount(); + currentTempTargetDegC = 0; + uint32_t autoRepeatTimer = 0; + uint8_t autoRepeatAcceleration = 0; + for (;;) { + OLED::setCursor(0, 0); + OLED::clearScreen(); + OLED::setFont(0); + ButtonState buttons = getButtonState(); + if (buttons) lastChange = xTaskGetTickCount(); + switch (buttons) { + case BUTTON_NONE: + // stay + break; + case BUTTON_BOTH: + // exit + return; + break; + case BUTTON_B_LONG: + if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration > PRESS_ACCEL_INTERVAL_MAX) { + if (systemSettings.ReverseButtonTempChangeEnabled) { + systemSettings.SolderingTemp += systemSettings.TempChangeLongStep; + } else + systemSettings.SolderingTemp -= systemSettings.TempChangeLongStep; + + autoRepeatTimer = xTaskGetTickCount(); + autoRepeatAcceleration += PRESS_ACCEL_STEP; + } + break; + case BUTTON_B_SHORT: + if (systemSettings.ReverseButtonTempChangeEnabled) { + systemSettings.SolderingTemp += systemSettings.TempChangeShortStep; + } else + systemSettings.SolderingTemp -= systemSettings.TempChangeShortStep; + break; + case BUTTON_F_LONG: + if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration > PRESS_ACCEL_INTERVAL_MAX) { + if (systemSettings.ReverseButtonTempChangeEnabled) { + systemSettings.SolderingTemp -= systemSettings.TempChangeLongStep; + } else + systemSettings.SolderingTemp += systemSettings.TempChangeLongStep; + autoRepeatTimer = xTaskGetTickCount(); + autoRepeatAcceleration += PRESS_ACCEL_STEP; + } + break; + case BUTTON_F_SHORT: + if (systemSettings.ReverseButtonTempChangeEnabled) { + systemSettings.SolderingTemp -= systemSettings.TempChangeShortStep; // add 10 + } else + systemSettings.SolderingTemp += systemSettings.TempChangeShortStep; // add 10 + break; + default: + break; + } + if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration) < PRESS_ACCEL_INTERVAL_MIN) { + autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX - PRESS_ACCEL_INTERVAL_MIN; + } + // constrain between 10-450 C +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) { + if (systemSettings.SolderingTemp > 850) systemSettings.SolderingTemp = 850; + if (systemSettings.SolderingTemp < 60) systemSettings.SolderingTemp = 60; + } else +#endif + { + if (systemSettings.SolderingTemp > 450) systemSettings.SolderingTemp = 450; + if (systemSettings.SolderingTemp < 10) systemSettings.SolderingTemp = 10; + } + + if (xTaskGetTickCount() - lastChange > 200) return; // exit if user just doesn't press anything for a bit + +#ifdef MODEL_TS80 + if (!OLED::getRotation()) { +#else + if (OLED::getRotation()) { +#endif + OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus : SymbolMinus); + } else { + OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus : SymbolPlus); + } + + OLED::print(SymbolSpace); + OLED::printNumber(systemSettings.SolderingTemp, 3); +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + OLED::drawSymbol(0); + else +#endif + { + OLED::drawSymbol(1); + } + OLED::print(SymbolSpace); +#ifdef MODEL_TS80 + if (!OLED::getRotation()) { +#else + if (OLED::getRotation()) { +#endif + OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus : SymbolPlus); + } else { + OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus : SymbolMinus); + } + OLED::refresh(); + GUIDelay(); + } +} + +static int gui_SolderingSleepingMode(bool stayOff) { + // Drop to sleep temperature and display until movement or button press + + for (;;) { + ButtonState buttons = getButtonState(); + if (buttons) return 0; + if ((xTaskGetTickCount() > 100) && ((accelInit && (xTaskGetTickCount() - lastMovementTime < 100)) || (xTaskGetTickCount() - lastButtonTime < 100))) return 0; // user moved or pressed a button, go back to soldering +#ifdef MODEL_TS100 + if (checkVoltageForExit()) return 1; // return non-zero on error +#endif +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) { + currentTempTargetDegC = stayOff ? 0 : TipThermoModel::convertFtoC(min(systemSettings.SleepTemp, systemSettings.SolderingTemp)); + } else +#endif + { + currentTempTargetDegC = stayOff ? 0 : min(systemSettings.SleepTemp, systemSettings.SolderingTemp); + } + // draw the lcd + uint16_t tipTemp; +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + tipTemp = TipThermoModel::getTipInF(); + else +#endif + { + tipTemp = TipThermoModel::getTipInC(); + } + + OLED::clearScreen(); + OLED::setCursor(0, 0); + if (systemSettings.detailedSoldering) { + OLED::setFont(1); + OLED::print(SleepingAdvancedString); + OLED::setCursor(0, 8); + OLED::print(SleepingTipAdvancedString); + OLED::printNumber(tipTemp, 3); +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + OLED::print(SymbolDegF); + else +#endif + { + OLED::print(SymbolDegC); + } + + OLED::print(SymbolSpace); + printVoltage(); + OLED::print(SymbolVolts); + } else { + OLED::setFont(0); + OLED::print(SleepingSimpleString); + OLED::printNumber(tipTemp, 3); +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + OLED::drawSymbol(0); + else +#endif + { + OLED::drawSymbol(1); + } + } + if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0 + if (lastMovementTime) + if (((uint32_t)(xTaskGetTickCount() - lastMovementTime)) > (uint32_t)(systemSettings.ShutdownTime * 60 * 100)) { + // shutdown + currentTempTargetDegC = 0; + return 1; // we want to exit soldering mode + } + OLED::refresh(); + GUIDelay(); + } + return 0; +} + +static void display_countdown(int sleepThres) { + /* + * Print seconds or minutes (if > 99 seconds) until sleep + * mode is triggered. + */ + int lastEventTime = lastButtonTime < lastMovementTime ? lastMovementTime : lastButtonTime; + int downCount = sleepThres - xTaskGetTickCount() + lastEventTime; + if (downCount > 9900) { + OLED::printNumber(downCount / 6000 + 1, 2); + OLED::print(SymbolMinutes); + } else { + OLED::printNumber(downCount / 100 + 1, 2); + OLED::print(SymbolSeconds); + } +} + +static void gui_solderingMode(uint8_t jumpToSleep) { + /* + * * Soldering (gui_solderingMode) + * -> Main loop where we draw temp, and animations + * --> User presses buttons and they goto the temperature adjust screen + * ---> Display the current setpoint temperature + * ---> Use buttons to change forward and back on temperature + * ---> Both buttons or timeout for exiting + * --> Long hold front button to enter boost mode + * ---> Just temporarily sets the system into the alternate temperature for + * PID control + * --> Long hold back button to exit + * --> Double button to exit + */ + bool boostModeOn = false; + + uint32_t sleepThres = 0; + if (systemSettings.SleepTime < 6) + sleepThres = systemSettings.SleepTime * 10 * 100; + else + sleepThres = (systemSettings.SleepTime - 5) * 60 * 100; + if (jumpToSleep) { + if (gui_SolderingSleepingMode(jumpToSleep == 2)) { + lastButtonTime = xTaskGetTickCount(); + return; // If the function returns non-0 then exit + } + } + for (;;) { + ButtonState buttons = getButtonState(); + switch (buttons) { + case BUTTON_NONE: + // stay + boostModeOn = false; + break; + case BUTTON_BOTH: + // exit + return; + break; + case BUTTON_B_LONG: + return; // exit on back long hold + break; + case BUTTON_F_LONG: + // if boost mode is enabled turn it on + if (systemSettings.boostModeEnabled) boostModeOn = true; + break; + case BUTTON_F_SHORT: + case BUTTON_B_SHORT: { + uint16_t oldTemp = systemSettings.SolderingTemp; + gui_solderingTempAdjust(); // goto adjust temp mode + if (oldTemp != systemSettings.SolderingTemp) { + saveSettings(); // only save on change + } + } break; + default: + break; + } + // else we update the screen information + OLED::setCursor(0, 0); + OLED::clearScreen(); + OLED::setFont(0); + // Draw in the screen details + if (systemSettings.detailedSoldering) { + OLED::setFont(1); + OLED::print(SolderingAdvancedPowerPrompt); // Power: + OLED::printNumber(x10WattHistory.average() / 10, 2); + OLED::print(SymbolDot); + OLED::printNumber(x10WattHistory.average() % 10, 1); + OLED::print(SymbolWatts); + + if (systemSettings.sensitivity && systemSettings.SleepTime) { + OLED::print(SymbolSpace); + display_countdown(sleepThres); + } + + OLED::setCursor(0, 8); + OLED::print(SleepingTipAdvancedString); + // OLED::printNumber( + // TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0)), 5); // Draw the tip temp out finally + + gui_drawTipTemp(true); + OLED::print(SymbolSpace); + printVoltage(); + OLED::print(SymbolVolts); + } else { + // We switch the layout direction depending on the orientation of the + // OLED:: + if (OLED::getRotation()) { + // battery + gui_drawBatteryIcon(); + OLED::print(SymbolSpace); // Space out gap between battery <-> temp + gui_drawTipTemp(true); // Draw current tip temp + + // We draw boost arrow if boosting, or else gap temp <-> heat + // indicator + if (boostModeOn) + OLED::drawSymbol(2); + else + OLED::print(SymbolSpace); + + // Draw heating/cooling symbols + OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); + } else { + // Draw heating/cooling symbols + OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average())); + // We draw boost arrow if boosting, or else gap temp <-> heat + // indicator + if (boostModeOn) + OLED::drawSymbol(2); + else + OLED::print(SymbolSpace); + gui_drawTipTemp(true); // Draw current tip temp + + OLED::print(SymbolSpace); // Space out gap between battery <-> temp + + gui_drawBatteryIcon(); + } + } + OLED::refresh(); + + // Update the setpoints for the temperature + if (boostModeOn) { +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.BoostTemp); + else +#endif + { + currentTempTargetDegC = (systemSettings.BoostTemp); + } + } else { +#ifdef ENABLED_FAHRENHEIT_SUPPORT + if (systemSettings.temperatureInF) + currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.SolderingTemp); + else +#endif + { + currentTempTargetDegC = (systemSettings.SolderingTemp); + } + } + +#ifdef MODEL_TS100 + // Undervoltage test + if (checkVoltageForExit()) { + lastButtonTime = xTaskGetTickCount(); + return; + } +#else + // on the TS80 we only want to check for over voltage to prevent tip damage + /*if (getInputVoltageX10(systemSettings.voltageDiv, 1) > 150) { + lastButtonTime = xTaskGetTickCount(); + currentlyActiveTemperatureTarget = 0; + return; // Over voltage + }*/ +#endif + + if (systemSettings.sensitivity && systemSettings.SleepTime) + if (xTaskGetTickCount() - lastMovementTime > sleepThres && xTaskGetTickCount() - lastButtonTime > sleepThres) { + if (gui_SolderingSleepingMode(false)) { + return; // If the function returns non-0 then exit + } + } + // slow down ui update rate + GUIDelay(); + } +} + +void showDebugMenu(void) { + uint8_t screen = 0; + ButtonState b; + for (;;) { + OLED::clearScreen(); // Ensure the buffer starts clean + OLED::setCursor(0, 0); // Position the cursor at the 0,0 (top left) + OLED::setFont(1); // small font + OLED::print(SymbolVersionNumber); // Print version number + OLED::setCursor(0, 8); // second line + OLED::print(DebugMenu[screen]); + switch (screen) { + case 0: // Just prints date + break; + case 1: + // High water mark for GUI + OLED::printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5); + break; + case 2: + // High water mark for the Movement task + OLED::printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5); + break; + case 3: + // High water mark for the PID task + OLED::printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5); + break; + case 4: + // system up time stamp + OLED::printNumber(xTaskGetTickCount() / 100, 5); + break; + case 5: + // Movement time stamp + OLED::printNumber(lastMovementTime / 100, 5); + break; + case 6: + // Raw Tip + { + uint32_t temp = systemSettings.CalibrationOffset; + systemSettings.CalibrationOffset = 0; + OLED::printNumber(TipThermoModel::convertTipRawADCTouV(getTipRawTemp(1)), 6); + systemSettings.CalibrationOffset = temp; + } + break; + case 7: + // Temp in C + OLED::printNumber(TipThermoModel::getTipInC(1), 5); + break; + case 8: + // Handle Temp + OLED::printNumber(getHandleTemperature(), 3); + break; + case 9: + // Voltage input + printVoltage(); + break; + case 10: + // Print PCB ID number + OLED::printNumber(PCBVersion, 1); + break; + default: + break; + } + + OLED::refresh(); + b = getButtonState(); + if (b == BUTTON_B_SHORT) + return; + else if (b == BUTTON_F_SHORT) { + screen++; + screen = screen % 11; + } + GUIDelay(); + } +} + +/* StartGUITask function */ +void startGUITask(void const *argument __unused) { + FRToSI2C::FRToSInit(); + uint8_t tempWarningState = 0; + bool buttonLockout = false; + bool tempOnDisplay = false; + getTipRawTemp(1); // reset filter + OLED::setRotation(systemSettings.OrientationMode & 1); + uint32_t ticks = xTaskGetTickCount(); + ticks += 400; // 4 seconds from now + while (xTaskGetTickCount() < ticks) { + if (showBootLogoIfavailable() == false) ticks = xTaskGetTickCount(); + ButtonState buttons = getButtonState(); + if (buttons) ticks = xTaskGetTickCount(); // make timeout now so we will exit + GUIDelay(); + } + + if (settingsWereReset) { + // Display alert settings were reset + OLED::clearScreen(); + OLED::setFont(1); + OLED::setCursor(0, 0); + OLED::print(SettingsResetMessage); + OLED::refresh(); + waitForButtonPressOrTimeout(1000); + } + + if (systemSettings.autoStartMode) { + // jump directly to the autostart mode + if (systemSettings.autoStartMode == 1) { + gui_solderingMode(0); + buttonLockout = true; + } else if (systemSettings.autoStartMode == 2) { + gui_solderingMode(1); + buttonLockout = true; + } else if (systemSettings.autoStartMode == 3) { + gui_solderingMode(2); + buttonLockout = true; + } + } + + for (;;) { + ButtonState buttons = getButtonState(); + if (buttons != BUTTON_NONE) { + OLED::setDisplayState(OLED::DisplayState::ON); + OLED::setFont(0); + } + if (tempWarningState == 2) buttons = BUTTON_F_SHORT; + if (buttons != BUTTON_NONE && buttonLockout) + buttons = BUTTON_NONE; + else + buttonLockout = false; + + switch (buttons) { + case BUTTON_NONE: + // Do nothing + break; + case BUTTON_BOTH: + // Not used yet + // In multi-language this might be used to reset language on a long hold + // or some such + break; + + case BUTTON_B_LONG: + // Show the version information + showDebugMenu(); + break; + case BUTTON_F_LONG: + gui_solderingTempAdjust(); + saveSettings(); + break; + case BUTTON_F_SHORT: + gui_solderingMode(0); // enter soldering mode + buttonLockout = true; + break; + case BUTTON_B_SHORT: + enterSettingsMenu(); // enter the settings menu + buttonLockout = true; + break; + default: + break; + } + + currentTempTargetDegC = 0; // ensure tip is off + getInputVoltageX10(systemSettings.voltageDiv, 0); + uint16_t tipTemp = TipThermoModel::getTipInC(); + + // Preemptively turn the display on. Turn it off if and only if + // the tip temperature is below 50 degrees C *and* motion sleep + // detection is enabled *and* there has been no activity (movement or + // button presses) in a while. + OLED::setDisplayState(OLED::DisplayState::ON); + + if ((tipTemp < 50) && systemSettings.sensitivity && (((xTaskGetTickCount() - lastMovementTime) > MOVEMENT_INACTIVITY_TIME) && ((xTaskGetTickCount() - lastButtonTime) > BUTTON_INACTIVITY_TIME))) { + OLED::setDisplayState(OLED::DisplayState::OFF); + } + + // Clear the lcd buffer + OLED::clearScreen(); + OLED::setCursor(0, 0); + if (systemSettings.detailedIDLE) { + OLED::setFont(1); + if (tipTemp > 470) { + OLED::print(TipDisconnectedString); + } else { + OLED::print(IdleTipString); + gui_drawTipTemp(false); + OLED::print(IdleSetString); + OLED::printNumber(systemSettings.SolderingTemp, 3); + } + OLED::setCursor(0, 8); + + OLED::print(InputVoltageString); + printVoltage(); + + } else { + OLED::setFont(0); +#ifdef MODEL_TS80 + if (!OLED::getRotation()) { +#else + if (OLED::getRotation()) { +#endif + OLED::drawArea(12, 0, 84, 16, idleScreenBG); + OLED::setCursor(0, 0); + gui_drawBatteryIcon(); + } else { + OLED::drawArea(0, 0, 84, 16, idleScreenBGF); // Needs to be flipped so button ends up + // on right side of screen + OLED::setCursor(84, 0); + gui_drawBatteryIcon(); + } + if (tipTemp > 55) + tempOnDisplay = true; + else if (tipTemp < 45) + tempOnDisplay = false; + if (tempOnDisplay) { + // draw temp over the start soldering button + // Location changes on screen rotation +#ifdef MODEL_TS80 + if (!OLED::getRotation()) { +#else + if (OLED::getRotation()) { +#endif + // in right handed mode we want to draw over the first part + OLED::fillArea(55, 0, 41, 16, 0); // clear the area for the temp + OLED::setCursor(56, 0); + + } else { + OLED::fillArea(0, 0, 41, 16, 0); // clear the area + OLED::setCursor(0, 0); + } + // draw in the temp + if (!(systemSettings.coolingTempBlink && (xTaskGetTickCount() % 25 < 16))) gui_drawTipTemp(false); // draw in the temp + } + } + OLED::refresh(); + GUIDelay(); + } +} diff --git a/workspace/TS100/Core/Threads/MOVThread.cpp b/workspace/TS100/Core/Threads/MOVThread.cpp new file mode 100644 index 00000000..e88cefce --- /dev/null +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -0,0 +1,93 @@ +/*
+ * MOVThread.cpp
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#include "BSP.h"
+#include "FreeRTOS.h"
+#include "I2C_Wrapper.hpp"
+#include "LIS2DH12.hpp"
+#include "MMA8652FC.hpp"
+#include "QC3.h"
+#include "Settings.h"
+#include "TipThermoModel.h"
+#include "cmsis_os.h"
+#include "history.hpp"
+#include "main.hpp"
+#include "power.hpp"
+#include "stdlib.h"
+#include "task.h"
+#define MOVFilter 8
+uint8_t accelInit = 0;
+uint32_t lastMovementTime = 0;
+void startMOVTask(void const *argument __unused) {
+ OLED::setRotation(true);
+ postRToSInit();
+ power_probe();
+ while (pidTaskNotification == 0) osDelay(30); // Wait for PID to start
+
+ OLED::setRotation(systemSettings.OrientationMode & 1);
+ lastMovementTime = 0;
+ int16_t datax[MOVFilter] = {0};
+ int16_t datay[MOVFilter] = {0};
+ int16_t dataz[MOVFilter] = {0};
+ uint8_t currentPointer = 0;
+ int16_t tx = 0, ty = 0, tz = 0;
+ int32_t avgx, avgy, avgz;
+ if (systemSettings.sensitivity > 9) systemSettings.sensitivity = 9;
+ Orientation rotation = ORIENTATION_FLAT;
+ for (;;) {
+ int32_t threshold = 1500 + (9 * 200);
+ threshold -= systemSettings.sensitivity * 200; // 200 is the step size
+
+ if (PCBVersion == 2) {
+ LIS2DH12::getAxisReadings(tx, ty, tz);
+ rotation = LIS2DH12::getOrientation();
+ } else if (PCBVersion == 1) {
+ MMA8652FC::getAxisReadings(tx, ty, tz);
+ rotation = MMA8652FC::getOrientation();
+ }
+ if (systemSettings.OrientationMode == 2) {
+ if (rotation != ORIENTATION_FLAT) {
+ OLED::setRotation(rotation == ORIENTATION_LEFT_HAND); // link the data through
+ }
+ }
+ datax[currentPointer] = (int32_t)tx;
+ datay[currentPointer] = (int32_t)ty;
+ dataz[currentPointer] = (int32_t)tz;
+ if (!accelInit) {
+ for (uint8_t i = currentPointer + 1; i < MOVFilter; i++) {
+ datax[i] = (int32_t)tx;
+ datay[i] = (int32_t)ty;
+ dataz[i] = (int32_t)tz;
+ }
+ accelInit = 1;
+ }
+ currentPointer = (currentPointer + 1) % MOVFilter;
+ avgx = avgy = avgz = 0;
+ // calculate averages
+ for (uint8_t i = 0; i < MOVFilter; i++) {
+ avgx += datax[i];
+ avgy += datay[i];
+ avgz += dataz[i];
+ }
+ avgx /= MOVFilter;
+ avgy /= MOVFilter;
+ avgz /= MOVFilter;
+
+ // Sum the deltas
+ int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
+ // So now we have averages, we want to look if these are different by more
+ // than the threshold
+
+ // If error has occurred then we update the tick timer
+ if (error > threshold) {
+ lastMovementTime = xTaskGetTickCount();
+ }
+
+ osDelay(100); // Slow down update rate
+ power_check();
+ }
+}
diff --git a/workspace/TS100/Core/Threads/PIDThread.cpp b/workspace/TS100/Core/Threads/PIDThread.cpp new file mode 100644 index 00000000..844e3617 --- /dev/null +++ b/workspace/TS100/Core/Threads/PIDThread.cpp @@ -0,0 +1,128 @@ +/*
+ * PIDThread.cpp
+ *
+ * Created on: 29 May 2020
+ * Author: Ralim
+ */
+
+#include "main.hpp"
+#include "BSP.h"
+#include "power.hpp"
+#include "history.hpp"
+#include "TipThermoModel.h"
+#include "cmsis_os.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include "Settings.h"
+static TickType_t powerPulseRate = 1000;
+static TickType_t powerPulseDuration = 50;
+TaskHandle_t pidTaskNotification = NULL;
+uint32_t currentTempTargetDegC = 0; // Current temperature target in C
+
+/* StartPIDTask function */
+void startPIDTask(void const *argument __unused) {
+ /*
+ * We take the current tip temperature & evaluate the next step for the tip
+ * control PWM.
+ */
+ setTipX10Watts(0); // disable the output driver if the output is set to be off
+ TickType_t lastPowerPulseStart = 0;
+ TickType_t lastPowerPulseEnd = 0;
+
+ history<int32_t, PID_TIM_HZ> tempError = { { 0 }, 0, 0 };
+ currentTempTargetDegC = 0; // Force start with no output (off). If in sleep / soldering this will
+ // be over-ridden rapidly
+ pidTaskNotification = xTaskGetCurrentTaskHandle();
+ uint32_t PIDTempTarget = 0;
+ for (;;) {
+
+ if (ulTaskNotifyTake(pdTRUE, 2000)) {
+ // This is a call to block this thread until the ADC does its samples
+ int32_t x10WattsOut = 0;
+ // Do the reading here to keep the temp calculations churning along
+ uint32_t currentTipTempInC = TipThermoModel::getTipInC(true);
+ PIDTempTarget = currentTempTargetDegC;
+ if (PIDTempTarget) {
+ // Cap the max set point to 450C
+ if (PIDTempTarget > (450)) {
+ //Maximum allowed output
+ PIDTempTarget = (450);
+ }
+ //Safety check that not aiming higher than current tip can measure
+ if (PIDTempTarget > TipThermoModel::getTipMaxInC()) {
+ PIDTempTarget = TipThermoModel::getTipMaxInC();
+ }
+ // Convert the current tip to degree's C
+
+ // As we get close to our target, temp noise causes the system
+ // to be unstable. Use a rolling average to dampen it.
+ // We overshoot by roughly 1 degree C.
+ // This helps stabilize the display.
+ int32_t tError = PIDTempTarget - currentTipTempInC + 1;
+ tError = tError > INT16_MAX ? INT16_MAX : tError;
+ tError = tError < INT16_MIN ? INT16_MIN : tError;
+ tempError.update(tError);
+
+ // Now for the PID!
+
+ // P term - total power needed to hit target temp next cycle.
+ // thermal mass = 1690 milliJ/*C for my tip.
+ // = Watts*Seconds to raise Temp from room temp to +100*C, divided by 100*C.
+ // we divide milliWattsNeeded by 20 to let the I term dominate near the set point.
+ // This is necessary because of the temp noise and thermal lag in the system.
+ // Once we have feed-forward temp estimation we should be able to better tune this.
+
+ int32_t x10WattsNeeded = tempToX10Watts(tError);
+// tempError.average());
+ // note that milliWattsNeeded is sometimes negative, this counters overshoot
+ // from I term's inertia.
+ x10WattsOut += x10WattsNeeded;
+
+ // I term - energy needed to compensate for heat loss.
+ // We track energy put into the system over some window.
+ // Assuming the temp is stable, energy in = energy transfered.
+ // (If it isn't, P will dominate).
+ x10WattsOut += x10WattHistory.average();
+
+ // D term - use sudden temp change to counter fast cooling/heating.
+ // In practice, this provides an early boost if temp is dropping
+ // and counters extra power if the iron is no longer losing temp.
+ // basically: temp - lastTemp
+ // Unfortunately, our temp signal is too noisy to really help.
+
+ }
+ //If the user turns on the option of using an occasional pulse to keep the power bank on
+ if (systemSettings.KeepAwakePulse) {
+
+ if (xTaskGetTickCount() - lastPowerPulseStart
+ > powerPulseRate) {
+ lastPowerPulseStart = xTaskGetTickCount();
+ lastPowerPulseEnd = lastPowerPulseStart
+ + powerPulseDuration;
+ }
+
+ //If current PID is less than the pulse level, check if we want to constrain to the pulse as the floor
+ if (x10WattsOut < systemSettings.KeepAwakePulse
+ && xTaskGetTickCount() < lastPowerPulseEnd) {
+ x10WattsOut = systemSettings.KeepAwakePulse;
+ }
+ }
+
+ //Secondary safety check to forcefully disable header when within ADC noise of top of ADC
+ if (getTipRawTemp(0) > (0x7FFF - 150)) {
+ x10WattsOut = 0;
+ }
+ if (systemSettings.powerLimitEnable
+ && x10WattsOut > (systemSettings.powerLimit * 10)) {
+ setTipX10Watts(systemSettings.powerLimit * 10);
+ } else {
+ setTipX10Watts(x10WattsOut);
+ }
+
+ HAL_IWDG_Refresh(&hiwdg);
+ } else {
+ //ADC interrupt timeout
+ setTipPWM(0);
+ }
+ }
+}
diff --git a/workspace/TS100/Makefile b/workspace/TS100/Makefile index 4413f2cb..a9868318 100644 --- a/workspace/TS100/Makefile +++ b/workspace/TS100/Makefile @@ -1,238 +1,248 @@ - -ifndef model -model:=TS100 -endif -OUTPUT_EXE=$(model)_$(lang) -ifndef lang -lang:= EN -endif - -# Discover the source files to build -SOURCE := $(shell find . -type f -name '*.c') -SOURCE_CPP := $(shell find . -type f -name '*.cpp') -SOURCES := $(shell find . -type f -name '*.c*') -S_SRCS := $(shell find . -type f -name '*.s') - -APP_INC_DIR = ./Core/Inc -CMSIS_DEVICE_INC_DIR = ./Drivers/CMSIS/Device/ST/STM32F1xx/Include -CMSIS_CORE_INC_DIR = ./Drivers/CMSIS/Include -HAL_INC_DIR = ./Drivers/STM32F1xx_HAL_Driver/Inc -HAL_LEGACY_INC_DIR = ./Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -FRTOS_CMIS_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -FRTOS_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/include -FRTOS_GCC_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3 - -INCLUDES = -I$(APP_INC_DIR) \ - -I$(CMSIS_DEVICE_INC_DIR)\ - -I$(CMSIS_CORE_INC_DIR) \ - -I$(HAL_INC_DIR) \ - -I$(HAL_LEGACY_INC_DIR) \ - -I$(FRTOS_CMIS_INC_DIR) \ - -I$(FRTOS_INC_DIR) \ - -I$(FRTOS_GCC_INC_DIR) -# output folder -HEXFILE_DIR=Hexfile - -# temporary objects folder -OUTPUT_DIR=Objects - -# code optimisation ------------------------------------------------------------ -OPTIM=-Os -flto -ffat-lto-objects -finline-small-functions -findirect-inlining -fdiagnostics-color -ffunction-sections -fdata-sections - - -# global defines --------------------------------------------------------------- -GLOBAL_DEFINES += -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D LANG_$(lang) -D LANG -D MODEL_$(model) - -# Enable debug code generation -DEBUG=-g3 -# Without debug code -#DEBUG= - - -# libs ------------------------------------------------------------------------- -LIBS= - -# linker script ---------------------------------------------------------------- -LDSCRIPT=LinkerScript.ld - -# ------------------------------------------------------------------------------ -COMPILER=gcc -# arm-none is the general ARM compiler, -# arm-atollic is the atollic customised compilers if you have them setup -COMPILER_PREFIX=arm-none -# programs --------------------------------------------------------------------- -CC=$(COMPILER_PREFIX)-eabi-gcc -CPP=$(COMPILER_PREFIX)-eabi-g++ -AS=$(COMPILER_PREFIX)-eabi-as -GCOV=$(COMPILER_PREFIX)-eabi-gcov -OBJCOPY=$(COMPILER_PREFIX)-eabi-objcopy -OBJDUMP=$(COMPILER_PREFIX)-eabi-objdump -SIZE=$(COMPILER_PREFIX)-eabi-size -SREC=srec_cat -SREC_INFO=srec_info - - - - -# linker flags ----------------------------------------------------------------- -LINKER_FLAGS=-Wl,--gc-sections \ - -o$(OUT_HEXFILE).elf \ - -Wl,-Map=$(OUT_HEXFILE).map \ - -mcpu=cortex-m3 \ - -mthumb \ - -mfloat-abi=soft \ - -lm -Os -flto -Wl,--undefined=vTaskSwitchContext \ - --specs=nano.specs - -# compiler flags --------------------------------------------------------------- -CPUFLAGS=-D GCC_ARMCM3 \ - -D ARM_MATH_CM3 \ - -D STM32F10X_MD \ - -mthumb \ - -mcpu=cortex-m3 \ - -mfloat-abi=soft - - - -CHECKOPTIONS= -Wall \ - -Wextra \ - -Wunused \ - -Wcomment \ - -Wtrigraphs \ - -Wuninitialized \ - -Wmissing-braces \ - -Wfloat-equal \ - -Wunreachable-code \ - -Wswitch-default \ - -Wreturn-type \ - -Wundef \ - -Wparentheses \ - -Wnonnull \ - -Winit-self \ - -Wmissing-include-dirs \ - -Wsequence-point \ - -Wswitch \ - -Wformat \ - -Wsign-compare \ - -Waddress \ - -Waggregate-return \ - -Wmissing-field-initializers \ - -Winline \ - -Wshadow \ - -Wno-unused-parameter \ - -Wdouble-promotion - - -CHECKOPTIONS_C= -Wbad-function-cast - - -CXXFLAGS=$(CPUFLAGS) \ - $(DEBUG) \ - $(INCLUDES) \ - $(GLOBAL_DEFINES) \ - -D${COMPILER} \ - -MMD \ - $(CHECKOPTIONS) \ - -std=c++11 \ - $(OPTIM) \ - -fno-common \ - -ffreestanding \ - -fno-rtti \ - -fno-exceptions \ - -fno-non-call-exceptions \ - -fno-use-cxa-atexit \ - -fno-strict-aliasing \ - -fno-rtti \ - -fno-exceptions \ - -fno-threadsafe-statics \ - -T$(LDSCRIPT) - - -CFLAGS=$(CPUFLAGS) \ - $(DEBUG) \ - $(INCLUDES) \ - $(CHECKOPTIONS_C) \ - $(GLOBAL_DEFINES) \ - -D${COMPILER} \ - -MMD \ - -std=gnu99 \ - $(OPTIM) \ - -fno-common \ - -ffreestanding \ - -T$(LDSCRIPT) \ - -c - - -AFLAGS=$(CPUFLAGS) \ - $(DEBUG) \ - $(INCLUDES) - - -ifeq (${COMPILER}, gcc) -AFLAGS += -ffunction-sections -fdata-sections -CFLAGS += -ffunction-sections -fdata-sections -endif - - - -OBJS = $(SOURCE:.c=.o) -OBJS_CPP = $(SOURCE_CPP:.cpp=.o) -OBJS_S = $(S_SRCS:.s=.o) - - - -OUT_OBJS=$(addprefix $(OUTPUT_DIR)/,$(OBJS)) -OUT_OBJS_CPP=$(addprefix $(OUTPUT_DIR)/,$(OBJS_CPP)) -OUT_OBJS_S=$(addprefix $(OUTPUT_DIR)/,$(OBJS_S)) -OUT_HEXFILE=$(addprefix $(HEXFILE_DIR)/,$(OUTPUT_EXE)) - -all: $(OUT_HEXFILE).hex $(OUT_HEXFILE).bin - -# -# The rule to create the target directory -# - -# Create hexfile -%.hex : %.elf - $(SIZE) $^ - $(OBJCOPY) $^ -O ihex $@ - -%.bin : %.elf - $(SIZE) $^ - $(OBJCOPY) $^ -O binary $@ - -$(OUT_HEXFILE).elf : $(OUT_OBJS) $(OUT_OBJS_CPP) $(OUT_OBJS_S) Makefile $(LDSCRIPT) - @test -d $(@D) || mkdir -p $(@D) - @echo Linking $(OUTPUT_EXE).elf - @$(CPP) $(CXXFLAGS) $(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) $(LIBS) $(LINKER_FLAGS) - -$(OUT_OBJS): $(OUTPUT_DIR)/%.o : %.c Makefile - @test -d $(@D) || mkdir -p $(@D) - @echo Compiling ${<} -# @echo $(CFLAGS) - @$(CC) -c $(CFLAGS) $< -o $@ - @$(OBJDUMP) -d -S $@ > [email protected] - -$(OUT_OBJS_CPP): $(OUTPUT_DIR)/%.o : %.cpp Makefile - @test -d $(@D) || mkdir -p $(@D) - @echo Compiling ${<} - @$(CPP) -c $(CXXFLAGS) $< -o $@ - @$(OBJDUMP) -d -S $@ > [email protected] - -$(OUT_OBJS_S): $(OUTPUT_DIR)/%.o: %.s Makefile - @test -d $(@D) || mkdir -p $(@D) - @echo 'Building file: $<' - @echo 'Invoking: MCU GCC Assembler' - @$(AS) -mcpu=cortex-m3 -mthumb -mfloat-abi=soft $(INCLUDES) -g $< -o $@ - @echo 'Finished building: $<' - @echo ' ' - - -clean : - rm -Rf $(OUTPUT_DIR) - rm -Rf $(HEXFILE_DIR) - -# pull in dependency info for *existing* .o files --include $(OUT_OBJS:.o=.d) --include $(OUT_OBJS_CPP:.o=.d) - +
+ifndef model
+model:=TS100
+endif
+OUTPUT_EXE=$(model)_$(lang)
+ifndef lang
+lang:= EN
+endif
+
+# Discover the source files to build
+SOURCE := $(shell find . -type f -name '*.c')
+SOURCE_CPP := $(shell find . -type f -name '*.cpp')
+SOURCES := $(shell find . -type f -name '*.c*')
+S_SRCS := $(shell find . -type f -name '*.s')
+
+APP_INC_DIR = ./Core/Inc
+CMSIS_DEVICE_INC_DIR = ./Core/BSP/Miniware/Vendor/CMSIS/Device/ST/STM32F1xx/Include
+CMSIS_CORE_INC_DIR = ./Core/BSP/Miniware/Vendor/CMSIS/Include
+HAL_INC_DIR = ./Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc
+HAL_LEGACY_INC_DIR = ./Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/Legacy
+FRTOS_CMIS_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS
+FRTOS_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/include
+FRTOS_GCC_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3
+DRIVER_INC_DIR =./Core/Drivers
+BSP_INC_DIR = ./Core/BSP
+MINIWARE_INC_DIR = ./Core/BSP/Miniware
+THREADS_INC_DIR = ./Core/Threads
+
+INCLUDES = -I$(APP_INC_DIR) \
+ -I$(CMSIS_DEVICE_INC_DIR)\
+ -I$(CMSIS_CORE_INC_DIR) \
+ -I$(HAL_INC_DIR) \
+ -I$(HAL_LEGACY_INC_DIR) \
+ -I$(FRTOS_CMIS_INC_DIR) \
+ -I$(FRTOS_INC_DIR) \
+ -I$(FRTOS_GCC_INC_DIR) \
+ -I$(DRIVER_INC_DIR) \
+ -I$(BSP_INC_DIR) \
+ -I$(MINIWARE_INC_DIR) \
+ -I$(THREADS_INC_DIR)
+# output folder
+HEXFILE_DIR=Hexfile
+
+# temporary objects folder
+OUTPUT_DIR=Objects
+
+# code optimisation ------------------------------------------------------------
+OPTIM=-Os -flto -ffat-lto-objects -finline-small-functions -findirect-inlining -fdiagnostics-color -ffunction-sections -fdata-sections
+
+
+# global defines ---------------------------------------------------------------
+GLOBAL_DEFINES += -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D LANG_$(lang) -D LANG -D MODEL_$(model)
+
+# Enable debug code generation
+DEBUG=-g3
+# Without debug code
+#DEBUG=
+
+
+# libs -------------------------------------------------------------------------
+LIBS=
+
+# linker script ----------------------------------------------------------------
+LDSCRIPT=LinkerScript.ld
+
+# ------------------------------------------------------------------------------
+COMPILER=gcc
+# arm-none is the general ARM compiler,
+COMPILER_PREFIX=arm-none
+# programs ---------------------------------------------------------------------
+CC=$(COMPILER_PREFIX)-eabi-gcc
+CPP=$(COMPILER_PREFIX)-eabi-g++
+AS=$(COMPILER_PREFIX)-eabi-as
+GCOV=$(COMPILER_PREFIX)-eabi-gcov
+OBJCOPY=$(COMPILER_PREFIX)-eabi-objcopy
+OBJDUMP=$(COMPILER_PREFIX)-eabi-objdump
+SIZE=$(COMPILER_PREFIX)-eabi-size
+SREC=srec_cat
+SREC_INFO=srec_info
+
+
+
+
+# linker flags -----------------------------------------------------------------
+LINKER_FLAGS=-Wl,--gc-sections \
+ -Wl,--wrap=malloc \
+ -Wl,--wrap=free \
+ -o$(OUT_HEXFILE).elf \
+ -Wl,-Map=$(OUT_HEXFILE).map \
+ -mcpu=cortex-m3 \
+ -mthumb \
+ -mfloat-abi=soft \
+ -lm -Os -flto -Wl,--undefined=vTaskSwitchContext \
+ --specs=nano.specs
+
+# compiler flags ---------------------------------------------------------------
+CPUFLAGS=-D GCC_ARMCM3 \
+ -D ARM_MATH_CM3 \
+ -D STM32F10X_MD \
+ -mthumb \
+ -mcpu=cortex-m3 \
+ -mfloat-abi=soft
+
+
+
+CHECKOPTIONS= -Wall \
+ -Wextra \
+ -Wunused \
+ -Wcomment \
+ -Wtrigraphs \
+ -Wuninitialized \
+ -Wmissing-braces \
+ -Wfloat-equal \
+ -Wunreachable-code \
+ -Wswitch-default \
+ -Wreturn-type \
+ -Wundef \
+ -Wparentheses \
+ -Wnonnull \
+ -Winit-self \
+ -Wmissing-include-dirs \
+ -Wsequence-point \
+ -Wswitch \
+ -Wformat \
+ -Wsign-compare \
+ -Waddress \
+ -Waggregate-return \
+ -Wmissing-field-initializers \
+ -Winline \
+ -Wshadow \
+ -Wno-unused-parameter \
+ -Wdouble-promotion \
+ -Werror
+
+
+CHECKOPTIONS_C= -Wbad-function-cast
+
+
+CXXFLAGS=$(CPUFLAGS) \
+ $(DEBUG) \
+ $(INCLUDES) \
+ $(GLOBAL_DEFINES) \
+ -D${COMPILER} \
+ -MMD \
+ $(CHECKOPTIONS) \
+ -std=c++11 \
+ $(OPTIM) \
+ -fno-common \
+ -ffreestanding \
+ -fno-rtti \
+ -fno-exceptions \
+ -fno-non-call-exceptions \
+ -fno-use-cxa-atexit \
+ -fno-strict-aliasing \
+ -fno-rtti \
+ -fno-exceptions \
+ -fno-threadsafe-statics \
+ -T$(LDSCRIPT)
+
+
+CFLAGS=$(CPUFLAGS) \
+ $(DEBUG) \
+ $(INCLUDES) \
+ $(CHECKOPTIONS_C) \
+ $(GLOBAL_DEFINES) \
+ -D${COMPILER} \
+ -MMD \
+ -std=gnu99 \
+ $(OPTIM) \
+ -fno-common \
+ -ffreestanding \
+ -T$(LDSCRIPT) \
+ -c
+
+
+AFLAGS=$(CPUFLAGS) \
+ $(DEBUG) \
+ $(INCLUDES)
+
+
+ifeq (${COMPILER}, gcc)
+AFLAGS += -ffunction-sections -fdata-sections
+CFLAGS += -ffunction-sections -fdata-sections
+endif
+
+
+
+OBJS = $(SOURCE:.c=.o)
+OBJS_CPP = $(SOURCE_CPP:.cpp=.o)
+OBJS_S = $(S_SRCS:.s=.o)
+
+
+
+OUT_OBJS=$(addprefix $(OUTPUT_DIR)/,$(OBJS))
+OUT_OBJS_CPP=$(addprefix $(OUTPUT_DIR)/,$(OBJS_CPP))
+OUT_OBJS_S=$(addprefix $(OUTPUT_DIR)/,$(OBJS_S))
+OUT_HEXFILE=$(addprefix $(HEXFILE_DIR)/,$(OUTPUT_EXE))
+
+all: $(OUT_HEXFILE).hex $(OUT_HEXFILE).bin
+
+#
+# The rule to create the target directory
+#
+
+# Create hexfile
+%.hex : %.elf
+ $(SIZE) $^
+ $(OBJCOPY) $^ -O ihex $@
+
+%.bin : %.elf
+ $(SIZE) $^
+ $(OBJCOPY) $^ -O binary $@
+
+$(OUT_HEXFILE).elf : $(OUT_OBJS) $(OUT_OBJS_CPP) $(OUT_OBJS_S) Makefile $(LDSCRIPT)
+ @test -d $(@D) || mkdir -p $(@D)
+ @echo Linking $(OUTPUT_EXE).elf
+ @$(CPP) $(CXXFLAGS) $(OUT_OBJS_S) $(OUT_OBJS) $(OUT_OBJS_CPP) $(LIBS) $(LINKER_FLAGS)
+
+$(OUT_OBJS): $(OUTPUT_DIR)/%.o : %.c Makefile
+ @test -d $(@D) || mkdir -p $(@D)
+ @echo Compiling ${<}
+# @echo $(CFLAGS)
+ @$(CC) -c $(CFLAGS) $< -o $@
+ @$(OBJDUMP) -d -S $@ > [email protected]
+
+$(OUT_OBJS_CPP): $(OUTPUT_DIR)/%.o : %.cpp Makefile
+ @test -d $(@D) || mkdir -p $(@D)
+ @echo Compiling ${<}
+ @$(CPP) -c $(CXXFLAGS) $< -o $@
+ @$(OBJDUMP) -d -S $@ > [email protected]
+
+$(OUT_OBJS_S): $(OUTPUT_DIR)/%.o: %.s Makefile
+ @test -d $(@D) || mkdir -p $(@D)
+ @echo 'Building file: $<'
+ @echo 'Invoking: MCU GCC Assembler'
+ @$(AS) -mcpu=cortex-m3 -mthumb -mfloat-abi=soft $(INCLUDES) -g $< -o $@
+ @echo 'Finished building: $<'
+ @echo ' '
+
+
+clean :
+ rm -Rf $(OUTPUT_DIR)
+ rm -Rf $(HEXFILE_DIR)
+
+# pull in dependency info for *existing* .o files
+-include $(OUT_OBJS:.o=.d)
+-include $(OUT_OBJS_CPP:.o=.d)
+
diff --git a/workspace/TS100/Src/syscalls.c b/workspace/TS100/Src/syscalls.c deleted file mode 100644 index 9f32dad0..00000000 --- a/workspace/TS100/Src/syscalls.c +++ /dev/null @@ -1,184 +0,0 @@ -/** -***************************************************************************** -** -** File : syscalls.c -** -** Author : Auto-generated by STM32CubeIDE -** -** Abstract : STM32CubeIDE Minimal System calls file -** -** For more information about which c-functions -** need which of these lowlevel functions -** please consult the Newlib libc-manual -** -** Environment : STM32CubeIDE MCU -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** -** <h2><center>© COPYRIGHT(c) 2018 STMicroelectronics</center></h2> -** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -** -***************************************************************************** -*/ - -/* Includes */ -#include <sys/stat.h> -#include <stdlib.h> -#include <errno.h> -#include <stdio.h> -#include <signal.h> -#include <time.h> -#include <sys/time.h> -#include <sys/times.h> - - -/* Variables */ -//#undef errno -extern int errno; -extern int __io_putchar(int ch) __attribute__((weak)); -extern int __io_getchar(void) __attribute__((weak)); - -register char * stack_ptr asm("sp"); - -char *__env[1] = { 0 }; -char **environ = __env; - - -/* Functions */ -void initialise_monitor_handles() -{ -} - -int _getpid(void) -{ - return 1; -} - -int _kill(int pid, int sig) -{ - errno = EINVAL; - return -1; -} - -void _exit (int status) -{ - _kill(status, -1); - while (1) {} /* Make sure we hang here */ -} - -__attribute__((weak)) int _read(int file, char *ptr, int len) -{ - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - *ptr++ = __io_getchar(); - } - -return len; -} - -__attribute__((weak)) int _write(int file, char *ptr, int len) -{ - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - __io_putchar(*ptr++); - } - return len; -} - -int _close(int file) -{ - return -1; -} - - -int _fstat(int file, struct stat *st) -{ - st->st_mode = S_IFCHR; - return 0; -} - -int _isatty(int file) -{ - return 1; -} - -int _lseek(int file, int ptr, int dir) -{ - return 0; -} - -int _open(char *path, int flags, ...) -{ - /* Pretend like we always fail */ - return -1; -} - -int _wait(int *status) -{ - errno = ECHILD; - return -1; -} - -int _unlink(char *name) -{ - errno = ENOENT; - return -1; -} - -int _times(struct tms *buf) -{ - return -1; -} - -int _stat(char *file, struct stat *st) -{ - st->st_mode = S_IFCHR; - return 0; -} - -int _link(char *old, char *new) -{ - errno = EMLINK; - return -1; -} - -int _fork(void) -{ - errno = EAGAIN; - return -1; -} - -int _execve(char *name, char **argv, char **env) -{ - errno = ENOMEM; - return -1; -} diff --git a/workspace/TS100/Src/sysmem.c b/workspace/TS100/Src/sysmem.c deleted file mode 100644 index e5e1bc2d..00000000 --- a/workspace/TS100/Src/sysmem.c +++ /dev/null @@ -1,83 +0,0 @@ -/** -***************************************************************************** -** -** File : sysmem.c -** -** Author : Auto-generated by STM32CubeIDE -** -** Abstract : STM32CubeIDE Minimal System Memory calls file -** -** For more information about which c-functions -** need which of these lowlevel functions -** please consult the Newlib libc-manual -** -** Environment : STM32CubeIDE MCU -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** -** <h2><center>© COPYRIGHT(c) 2018 STMicroelectronics</center></h2> -** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -** -***************************************************************************** -*/ - -/* Includes */ -#include <errno.h> -#include <stdio.h> - -/* Variables */ -extern int errno; -register char * stack_ptr asm("sp"); - -/* Functions */ - -/** - _sbrk - Increase program data space. Malloc and related functions depend on this -**/ -caddr_t _sbrk(int incr) -{ - extern char end asm("end"); - static char *heap_end; - char *prev_heap_end; - - if (heap_end == 0) - heap_end = &end; - - prev_heap_end = heap_end; - if (heap_end + incr > stack_ptr) - { - errno = ENOMEM; - return (caddr_t) -1; - } - - heap_end += incr; - - return (caddr_t) prev_heap_end; -} - diff --git a/workspace/TS100/build.sh b/workspace/TS100/build.sh index 77181aed..2fd28523 100755 --- a/workspace/TS100/build.sh +++ b/workspace/TS100/build.sh @@ -9,9 +9,8 @@ BUILD_LANGUAGES=() AVAILABLE_MODELS=("TS100" "TS80") BUILD_MODELS=() -usage () -{ - echo "Usage : $(basename "$0") [-l <LANG_CODE>] [-m <TS100|TS80>] [-h] +usage() { + echo "Usage : $(basename "$0") [-l <LANG_CODE>] [-m <TS100|TS80>] [-h] Parameters : -l LANG_CODE : Force a specific language (E.g. : EN, FR, NL_BE, ...) @@ -19,59 +18,53 @@ Parameters : -h : Show this help message INFO : By default, without parameters, the build is for all platforms and all languages" 1>&2 - exit 1 + exit 1 } -checkLastCommand () -{ - if [ $? -eq 0 ] - then +checkLastCommand() { + if [ $? -eq 0 ]; then echo " [Success]" echo "*********************************************" else forceExit -fi + fi } -forceExit () -{ +forceExit() { echo " [Error]" echo "*********************************************" echo " -- Stop on error --" exit 1 } -isInArray () -{ +isInArray() { local value="$1" # Save first argument in a variable shift # Shift all arguments to the left (original $1 gets lost) local array=("$@") # Rebuild the array with rest of arguments - for item in "${array[@]}" - do + for item in "${array[@]}"; do [[ $value == "$item" ]] && return 0 done return 1 } -while getopts h:l:m: option -do +while getopts h:l:m: option; do case "${option}" in - h) - usage - ;; - l) - LANGUAGEREQ=${OPTARG} - ;; - m) - MODEL=${OPTARG} - ;; - *) - usage - ;; + h) + usage + ;; + l) + LANGUAGEREQ=${OPTARG} + ;; + m) + MODEL=${OPTARG} + ;; + *) + usage + ;; esac done -shift $((OPTIND-1)) +shift $((OPTIND - 1)) echo "*********************************************" echo " Builder for the" @@ -82,27 +75,24 @@ echo " " echo "*********************************************" # Calculate available languages -for f in "$TRANSLATION_DIR"/translation_*.json -do - AVAILABLE_LANGUAGES+=(`echo $f | tr "[:lower:]" "[:upper:]" | sed "s/[^_]*_//" | sed "s/\.JSON//g"`) -done +for f in "$TRANSLATION_DIR"/translation_*.json; do + AVAILABLE_LANGUAGES+=($(echo $f | tr "[:lower:]" "[:upper:]" | sed "s/[^_]*_//" | sed "s/\.JSON//g")) +done # Checking requested language echo "Available languages :" echo " ${AVAILABLE_LANGUAGES[*]}" echo "Requested languages :" -if [ -n "$LANGUAGEREQ" ] -then - if isInArray "$LANGUAGEREQ" "${AVAILABLE_LANGUAGES[@]}" - then - echo " $LANGUAGEREQ" +if [ -n "$LANGUAGEREQ" ]; then + if isInArray "$LANGUAGEREQ" "${AVAILABLE_LANGUAGES[@]}"; then + echo " $LANGUAGEREQ" BUILD_LANGUAGES+=("$LANGUAGEREQ") else - echo " $LANGUAGEREQ doesn't exist" + echo " $LANGUAGEREQ doesn't exist" forceExit fi else - echo " [ALL LANGUAGES]" + echo " [ALL LANGUAGES]" BUILD_LANGUAGES+=("${AVAILABLE_LANGUAGES[@]}") fi echo "*********************************************" @@ -111,26 +101,23 @@ echo "*********************************************" echo "Available models :" echo " ${AVAILABLE_MODELS[*]}" echo "Requested models :" -if [ -n "$MODEL" ] -then - if isInArray "$MODEL" "${AVAILABLE_MODELS[@]}" - then - echo " $MODEL" +if [ -n "$MODEL" ]; then + if isInArray "$MODEL" "${AVAILABLE_MODELS[@]}"; then + echo " $MODEL" BUILD_MODELS+=("$MODEL") else - echo " $MODEL doesn't exist" + echo " $MODEL doesn't exist" forceExit fi else - echo " [ALL MODELS]" + echo " [ALL MODELS]" BUILD_MODELS+=("${AVAILABLE_MODELS[@]}") fi echo "*********************************************" -if [ ${#BUILD_LANGUAGES[@]} -gt 0 ] && [ ${#BUILD_MODELS[@]} -gt 0 ] -then +if [ ${#BUILD_LANGUAGES[@]} -gt 0 ] && [ ${#BUILD_MODELS[@]} -gt 0 ]; then echo "Generating Translation.cpp" - python3 "$TRANSLATION_DIR/$TRANSLATION_SCRIPT" "$TRANSLATION_DIR" + python3 "$TRANSLATION_DIR/$TRANSLATION_SCRIPT" "$TRANSLATION_DIR" checkLastCommand echo "Cleaning previous builds" @@ -139,20 +126,18 @@ then make clean >/dev/null checkLastCommand - for model in "${BUILD_MODELS[@]}" - do - for lang in "${BUILD_LANGUAGES[@]}" - do + for model in "${BUILD_MODELS[@]}"; do + for lang in "${BUILD_LANGUAGES[@]}"; do echo "Building firmware for $model in $lang" make -j lang="$lang" model="$model" >/dev/null - checkLastCommand - echo "Cleanup Temp files 1 for $model in $lang" - rm -rf Objects/Core >/dev/null checkLastCommand - echo "Cleanup Temp files 2 for $model in $lang" - rm -rf Objects/Src >/dev/null + echo "Cleanup Temp files for $model in $lang" + rm -rf Objects/Core/ >/dev/null checkLastCommand done + echo "Cleanup model change" + rm -rf Objects/ >/dev/null + checkLastCommand done else echo "Nothing to build. (no model or language specified)" |