From 3b0fc9c6f838e845677190aaaab360192a16df8c Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 20:13:18 +1000 Subject: [PATCH 01/26] Clean up file locations --- workspace/TS100/{ => Core}/Src/syscalls.c | 368 +++++++++++----------- workspace/TS100/{ => Core}/Src/sysmem.c | 166 +++++----- 2 files changed, 267 insertions(+), 267 deletions(-) rename workspace/TS100/{ => Core}/Src/syscalls.c (95%) rename workspace/TS100/{ => Core}/Src/sysmem.c (97%) diff --git a/workspace/TS100/Src/syscalls.c b/workspace/TS100/Core/Src/syscalls.c similarity index 95% rename from workspace/TS100/Src/syscalls.c rename to workspace/TS100/Core/Src/syscalls.c index 9f32dad0..c3de5d66 100644 --- a/workspace/TS100/Src/syscalls.c +++ b/workspace/TS100/Core/Src/syscalls.c @@ -1,184 +1,184 @@ -/** -***************************************************************************** -** -** 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. -** -***************************************************************************** -** -**

© COPYRIGHT(c) 2018 STMicroelectronics

-** -** 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 -#include -#include -#include -#include -#include -#include -#include - - -/* 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; -} +/** +***************************************************************************** +** +** 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. +** +***************************************************************************** +** +**

© COPYRIGHT(c) 2018 STMicroelectronics

+** +** 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 +#include +#include +#include +#include +#include +#include +#include + + +/* 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/Core/Src/sysmem.c similarity index 97% rename from workspace/TS100/Src/sysmem.c rename to workspace/TS100/Core/Src/sysmem.c index e5e1bc2d..847daf4c 100644 --- a/workspace/TS100/Src/sysmem.c +++ b/workspace/TS100/Core/Src/sysmem.c @@ -1,83 +1,83 @@ -/** -***************************************************************************** -** -** 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. -** -***************************************************************************** -** -**

© COPYRIGHT(c) 2018 STMicroelectronics

-** -** 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 -#include - -/* 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; -} - +/** +***************************************************************************** +** +** 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. +** +***************************************************************************** +** +**

© COPYRIGHT(c) 2018 STMicroelectronics

+** +** 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 +#include + +/* 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; +} + From ef5ba8b65086e3b12891c28068be0c7ceb3af507 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 20:46:19 +1000 Subject: [PATCH 02/26] Move Accel probe into class --- workspace/TS100/Core/Inc/LIS2DH12.hpp | 88 +++++++------ workspace/TS100/Core/Inc/MMA8652FC.hpp | 55 ++++---- workspace/TS100/Core/Src/LIS2DH12.cpp | 110 +++++++++------- workspace/TS100/Core/Src/MMA8652FC.cpp | 173 ++++++++++++++----------- workspace/TS100/Core/Src/main.cpp | 9 +- 5 files changed, 232 insertions(+), 203 deletions(-) diff --git a/workspace/TS100/Core/Inc/LIS2DH12.hpp b/workspace/TS100/Core/Inc/LIS2DH12.hpp index 5a30288f..ed9d844a 100644 --- a/workspace/TS100/Core/Inc/LIS2DH12.hpp +++ b/workspace/TS100/Core/Inc/LIS2DH12.hpp @@ -1,42 +1,46 @@ -/* - * 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(val); -#endif -#ifdef MODEL_TS100 - return static_cast((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 "stm32f1xx_hal.h" +#include "FRToSI2C.hpp" +#include "LIS2DH12_defines.hpp" +#include "hardware.h" + +#ifdef MODEL_TS80 +#define LIS_ORI_FLIP +#endif +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(val); +#endif +#ifdef MODEL_TS100 + return static_cast((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/MMA8652FC.hpp b/workspace/TS100/Core/Inc/MMA8652FC.hpp index b6d2938e..7a3ec037 100644 --- a/workspace/TS100/Core/Inc/MMA8652FC.hpp +++ b/workspace/TS100/Core/Inc/MMA8652FC.hpp @@ -1,27 +1,28 @@ -/* - * 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_ */ +/* + * 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: + //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/Src/LIS2DH12.cpp b/workspace/TS100/Core/Src/LIS2DH12.cpp index b1d25703..f4fcbbfe 100644 --- a/workspace/TS100/Core/Src/LIS2DH12.cpp +++ b/workspace/TS100/Core/Src/LIS2DH12.cpp @@ -1,50 +1,60 @@ -/* - * LIS2DH12.cpp - * - * Created on: 27Feb.,2018 - * Author: Ralim - */ - -#include - -#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 sensorData; - - FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, - reinterpret_cast(sensorData.begin()), - sensorData.size() * sizeof(int16_t)); - - x = sensorData[0]; - y = sensorData[1]; - z = sensorData[2]; -} +/* + * LIS2DH12.cpp + * + * Created on: 27Feb.,2018 + * Author: Ralim + */ + +#include + +#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 sensorData; + + FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, + reinterpret_cast(sensorData.begin()), + sensorData.size() * sizeof(int16_t)); + + x = sensorData[0]; + y = sensorData[1]; + z = sensorData[2]; +} + +bool LIS2DH12::detect() { + uint8_t buffer[1]; + if (HAL_I2C_Mem_Read(&hi2c1, 25 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, + 1000) == HAL_OK) { + //ACK'd + return true; + } + //NAK'd + return false; +} diff --git a/workspace/TS100/Core/Src/MMA8652FC.cpp b/workspace/TS100/Core/Src/MMA8652FC.cpp index ebe10568..bec2fcef 100644 --- a/workspace/TS100/Core/Src/MMA8652FC.cpp +++ b/workspace/TS100/Core/Src/MMA8652FC.cpp @@ -1,78 +1,95 @@ -/* - * MMA8652FC.cpp - * - * Created on: 31Aug.,2017 - * Author: Ben V. Brown - */ - -#include - -#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(plStatus); - } - - return ORIENTATION_FLAT; -} - -void MMA8652FC::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) { - std::array sensorData; - - FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, I2C_MEMADD_SIZE_8BIT, - reinterpret_cast(sensorData.begin()), - sensorData.size() * sizeof(int16_t)); - - x = static_cast(__builtin_bswap16(*reinterpret_cast(&sensorData[0]))); - y = static_cast(__builtin_bswap16(*reinterpret_cast(&sensorData[1]))); - z = static_cast(__builtin_bswap16(*reinterpret_cast(&sensorData[2]))); -} +/* + * MMA8652FC.cpp + * + * Created on: 31Aug.,2017 + * Author: Ben V. Brown + */ + +#include + +#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(plStatus); + } + + return ORIENTATION_FLAT; +} + +void MMA8652FC::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { + std::array sensorData; + + FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, + I2C_MEMADD_SIZE_8BIT, reinterpret_cast(sensorData.begin()), + sensorData.size() * sizeof(int16_t)); + + x = static_cast(__builtin_bswap16( + *reinterpret_cast(&sensorData[0]))); + y = static_cast(__builtin_bswap16( + *reinterpret_cast(&sensorData[1]))); + z = static_cast(__builtin_bswap16( + *reinterpret_cast(&sensorData[2]))); +} + +bool MMA8652FC::detect() { + uint8_t buffer[1]; + if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, + 1000) == HAL_OK) { + //The device ACK'd + return true; + } + //NAK'd + return false; +} diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index ad952611..d845c7ea 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -55,14 +55,11 @@ int main(void) { 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(); + 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 From fd700aecb9f629f75d4a2c3b4ecb278728ce7362 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 21:39:06 +1000 Subject: [PATCH 03/26] Beginnings of the shuffle --- workspace/TS100/Core/BSP/Defines.h | 19 + workspace/TS100/Core/BSP/Miniware/BSP.cpp | 212 ++++++++++ .../{Inc/hardware.h => BSP/Miniware/Pins.h} | 231 ++++------ .../TS100/Core/BSP/Miniware/UnitSettings.h | 18 + workspace/TS100/Core/Inc/Buttons.hpp | 35 ++ workspace/TS100/Core/Inc/FRToSI2C.hpp | 90 ++-- workspace/TS100/Core/Inc/FreeRTOSHooks.h | 28 ++ workspace/TS100/Core/Inc/LIS2DH12.hpp | 5 +- workspace/TS100/Core/Inc/MMA8652FC.hpp | 2 +- workspace/TS100/Core/Inc/OLED.hpp | 2 +- workspace/TS100/Core/Inc/QC3.h | 21 + .../TS100/Core/{Src => Inc}/TipThermoModel.h | 2 +- workspace/TS100/Core/Inc/gui.hpp | 76 ++-- workspace/TS100/Core/Inc/main.hpp | 18 - workspace/TS100/Core/Inc/power.hpp | 2 +- workspace/TS100/Core/Src/Buttons.cpp | 115 +++++ workspace/TS100/Core/Src/FRToSI2C.cpp | 331 +++++++-------- workspace/TS100/Core/Src/FreeRTOSHooks.c | 24 ++ workspace/TS100/Core/Src/GUIThread.cpp | 108 +---- workspace/TS100/Core/Src/LIS2DH12.cpp | 30 +- workspace/TS100/Core/Src/MMA8652FC.cpp | 9 +- workspace/TS100/Core/Src/OLED.cpp | 4 - workspace/TS100/Core/Src/QC3.c | 203 +++++++++ workspace/TS100/Core/Src/TipThermoModel.cpp | 2 +- workspace/TS100/Core/Src/gui.cpp | 2 +- workspace/TS100/Core/Src/hardware.cpp | 393 ------------------ workspace/TS100/Core/Src/power.cpp | 2 +- 27 files changed, 1005 insertions(+), 979 deletions(-) create mode 100644 workspace/TS100/Core/BSP/Defines.h create mode 100644 workspace/TS100/Core/BSP/Miniware/BSP.cpp rename workspace/TS100/Core/{Inc/hardware.h => BSP/Miniware/Pins.h} (53%) create mode 100644 workspace/TS100/Core/BSP/Miniware/UnitSettings.h create mode 100644 workspace/TS100/Core/Inc/Buttons.hpp create mode 100644 workspace/TS100/Core/Inc/FreeRTOSHooks.h create mode 100644 workspace/TS100/Core/Inc/QC3.h rename workspace/TS100/Core/{Src => Inc}/TipThermoModel.h (98%) create mode 100644 workspace/TS100/Core/Src/Buttons.cpp create mode 100644 workspace/TS100/Core/Src/FreeRTOSHooks.c create mode 100644 workspace/TS100/Core/Src/QC3.c delete mode 100644 workspace/TS100/Core/Src/hardware.cpp 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..21eaa3cb --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/BSP.cpp @@ -0,0 +1,212 @@ +//BSP mapping functions + +#include "BSP.h" +#include "Setup.h" +#include "history.hpp" +#include "Pins.h" +#include "history.hpp" +volatile uint16_t PWMSafetyTimer = 0; +volatile uint8_t pendingPWM = 0; + + +//2 second filter (ADC is PID_TIM_HZ Hz) +history 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; +} diff --git a/workspace/TS100/Core/Inc/hardware.h b/workspace/TS100/Core/BSP/Miniware/Pins.h similarity index 53% rename from workspace/TS100/Core/Inc/hardware.h rename to 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/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/Core/Inc/Buttons.hpp b/workspace/TS100/Core/Inc/Buttons.hpp new file mode 100644 index 00000000..fb4b1991 --- /dev/null +++ b/workspace/TS100/Core/Inc/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/FRToSI2C.hpp b/workspace/TS100/Core/Inc/FRToSI2C.hpp index f1515929..efc11d74 100644 --- a/workspace/TS100/Core/Inc/FRToSI2C.hpp +++ b/workspace/TS100/Core/Inc/FRToSI2C.hpp @@ -1,44 +1,46 @@ -/* - * 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 "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 bool 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); + //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 I2C_HandleTypeDef *i2c; + static void I2C1_ClearBusyFlagErratum(); + static SemaphoreHandle_t I2CSemaphore; + static StaticSemaphore_t xSemaphoreBuffer; +}; + +#endif /* FRTOSI2C_HPP_ */ 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/LIS2DH12.hpp b/workspace/TS100/Core/Inc/LIS2DH12.hpp index ed9d844a..3400130d 100644 --- a/workspace/TS100/Core/Inc/LIS2DH12.hpp +++ b/workspace/TS100/Core/Inc/LIS2DH12.hpp @@ -10,11 +10,8 @@ #include "stm32f1xx_hal.h" #include "FRToSI2C.hpp" #include "LIS2DH12_defines.hpp" -#include "hardware.h" +#include "BSP.h" -#ifdef MODEL_TS80 -#define LIS_ORI_FLIP -#endif class LIS2DH12 { public: static bool detect(); diff --git a/workspace/TS100/Core/Inc/MMA8652FC.hpp b/workspace/TS100/Core/Inc/MMA8652FC.hpp index 7a3ec037..2654e903 100644 --- a/workspace/TS100/Core/Inc/MMA8652FC.hpp +++ b/workspace/TS100/Core/Inc/MMA8652FC.hpp @@ -10,7 +10,7 @@ #include "stm32f1xx_hal.h" #include "MMA8652FC_defines.h" #include "FRToSI2C.hpp" -#include "hardware.h" +#include "BSP.h" class MMA8652FC { diff --git a/workspace/TS100/Core/Inc/OLED.hpp b/workspace/TS100/Core/Inc/OLED.hpp index 5994e9f6..efb5aee2 100644 --- a/workspace/TS100/Core/Inc/OLED.hpp +++ b/workspace/TS100/Core/Inc/OLED.hpp @@ -9,7 +9,7 @@ #ifndef OLED_HPP_ #define OLED_HPP_ -#include +#include #include "stm32f1xx_hal.h" #include #include diff --git a/workspace/TS100/Core/Inc/QC3.h b/workspace/TS100/Core/Inc/QC3.h new file mode 100644 index 00000000..98bfa0f5 --- /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_ + +#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/Src/TipThermoModel.h b/workspace/TS100/Core/Inc/TipThermoModel.h similarity index 98% rename from workspace/TS100/Core/Src/TipThermoModel.h rename to workspace/TS100/Core/Inc/TipThermoModel.h index 6c31f6bd..a4b0b368 100644 --- a/workspace/TS100/Core/Src/TipThermoModel.h +++ b/workspace/TS100/Core/Inc/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/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..f2f2e808 100644 --- a/workspace/TS100/Core/Inc/main.hpp +++ b/workspace/TS100/Core/Inc/main.hpp @@ -7,25 +7,7 @@ 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 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 -#include "hardware.h" +#include "BSP.h" #include "expMovingAverage.h" #ifndef POWER_HPP_ #define POWER_HPP_ diff --git a/workspace/TS100/Core/Src/Buttons.cpp b/workspace/TS100/Core/Src/Buttons.cpp new file mode 100644 index 00000000..beca08b1 --- /dev/null +++ b/workspace/TS100/Core/Src/Buttons.cpp @@ -0,0 +1,115 @@ +/* + * Buttons.c + * + * Created on: 29 May 2020 + * Author: Ralim + */ +#include +#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/Src/FRToSI2C.cpp b/workspace/TS100/Core/Src/FRToSI2C.cpp index aabd6906..a562e6fa 100644 --- a/workspace/TS100/Core/Src/FRToSI2C.cpp +++ b/workspace/TS100/Core/Src/FRToSI2C.cpp @@ -1,189 +1,142 @@ -/* - * 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); -} +/* + * FRToSI2C.cpp + * + * Created on: 14Apr.,2018 + * Author: Ralim + */ +#include "BSP.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); + } +} + +bool 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); + 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(i2c, DevAddress, MemAddress, MemAddSize, pData, + Size, 500) != HAL_OK) { + + I2C1_ClearBusyFlagErratum(); + xSemaphoreGive(I2CSemaphore); + return false; + } else { + xSemaphoreGive(I2CSemaphore); + return true; + } +#else + + if (HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, 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, 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 { + } + } + +} + +bool FRToSI2C::probe(uint16_t DevAddress) { + uint8_t buffer[1]; + if (Mem_Read(DevAddress, 0, I2C_MEMADD_SIZE_8BIT, buffer, 1)) { + //ACK'd + return true; + } + return false; +} + +void FRToSI2C::I2C1_ClearBusyFlagErratum() { + unstick_I2C(); +} diff --git a/workspace/TS100/Core/Src/FreeRTOSHooks.c b/workspace/TS100/Core/Src/FreeRTOSHooks.c new file mode 100644 index 00000000..d5a15dd7 --- /dev/null +++ b/workspace/TS100/Core/Src/FreeRTOSHooks.c @@ -0,0 +1,24 @@ +/* + * 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 */ +} diff --git a/workspace/TS100/Core/Src/GUIThread.cpp b/workspace/TS100/Core/Src/GUIThread.cpp index 28e0f88b..19bf4650 100644 --- a/workspace/TS100/Core/Src/GUIThread.cpp +++ b/workspace/TS100/Core/Src/GUIThread.cpp @@ -19,14 +19,13 @@ #include "TipThermoModel.h" #include "unit.h" #include "../../configuration.h" - +#include "Buttons.hpp" 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; @@ -87,113 +86,8 @@ void gui_drawTipTemp(bool symbol) { } } } -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() { diff --git a/workspace/TS100/Core/Src/LIS2DH12.cpp b/workspace/TS100/Core/Src/LIS2DH12.cpp index f4fcbbfe..3557f0d9 100644 --- a/workspace/TS100/Core/Src/LIS2DH12.cpp +++ b/workspace/TS100/Core/Src/LIS2DH12.cpp @@ -15,17 +15,16 @@ typedef struct { 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 } }; +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; @@ -49,12 +48,5 @@ void LIS2DH12::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { } bool LIS2DH12::detect() { - uint8_t buffer[1]; - if (HAL_I2C_Mem_Read(&hi2c1, 25 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, - 1000) == HAL_OK) { - //ACK'd - return true; - } - //NAK'd - return false; + return FRToSI2C::probe(LIS2DH_I2C_ADDRESS); } diff --git a/workspace/TS100/Core/Src/MMA8652FC.cpp b/workspace/TS100/Core/Src/MMA8652FC.cpp index bec2fcef..cfa4775e 100644 --- a/workspace/TS100/Core/Src/MMA8652FC.cpp +++ b/workspace/TS100/Core/Src/MMA8652FC.cpp @@ -84,12 +84,5 @@ void MMA8652FC::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { } bool MMA8652FC::detect() { - uint8_t buffer[1]; - if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, - 1000) == HAL_OK) { - //The device ACK'd - return true; - } - //NAK'd - return false; + return FRToSI2C::probe(MMA8652FC_I2C_ADDRESS); } diff --git a/workspace/TS100/Core/Src/OLED.cpp b/workspace/TS100/Core/Src/OLED.cpp index 3949b17a..93390973 100644 --- a/workspace/TS100/Core/Src/OLED.cpp +++ b/workspace/TS100/Core/Src/OLED.cpp @@ -95,10 +95,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. diff --git a/workspace/TS100/Core/Src/QC3.c b/workspace/TS100/Core/Src/QC3.c new file mode 100644 index 00000000..6e47b7c1 --- /dev/null +++ b/workspace/TS100/Core/Src/QC3.c @@ -0,0 +1,203 @@ +/* + * QC3.c + * + * Created on: 29 May 2020 + * Author: Ralim + */ + + +//Quick charge 3.0 supporting functions + + + +#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; +} + + +#endif diff --git a/workspace/TS100/Core/Src/TipThermoModel.cpp b/workspace/TS100/Core/Src/TipThermoModel.cpp index e35b2915..ac1c9389 100644 --- a/workspace/TS100/Core/Src/TipThermoModel.cpp +++ b/workspace/TS100/Core/Src/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/gui.cpp b/workspace/TS100/Core/Src/gui.cpp index ca4e92c1..4de6b484 100644 --- a/workspace/TS100/Core/Src/gui.cpp +++ b/workspace/TS100/Core/Src/gui.cpp @@ -13,7 +13,7 @@ #include "string.h" #include "unit.h" #include "../../configuration.h" - +#include "Buttons.hpp" extern uint32_t lastButtonTime; void gui_Menu(const menuitem *menu); 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 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/power.cpp b/workspace/TS100/Core/Src/power.cpp index 99887079..87507d15 100644 --- a/workspace/TS100/Core/Src/power.cpp +++ b/workspace/TS100/Core/Src/power.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include const uint16_t powerPWM = 255; const uint16_t totalPWM = 255 + 17; //htim2.Init.Period, the full PWM cycle From 8d59b072ef83b613145e52298d8f108b4579e7f3 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 21:39:12 +1000 Subject: [PATCH 04/26] More shuffle --- workspace/TS100/Core/BSP/BSP.h | 44 +++ workspace/TS100/Core/BSP/Miniware/README.md | 12 + .../TS100/Core/{Src => BSP/Miniware}/Setup.c | 11 +- .../TS100/Core/{Inc => BSP/Miniware}/Setup.h | 76 ++--- workspace/TS100/Core/BSP/Miniware/preRTOS.c | 19 ++ .../{Src => BSP/Miniware}/stm32f1xx_hal_msp.c | 272 +++++++-------- .../Miniware}/stm32f1xx_hal_timebase_TIM.c | 316 +++++++++--------- .../Core/{Src => BSP/Miniware}/stm32f1xx_it.c | 168 +++++----- workspace/TS100/Core/Src/main.cpp | 18 +- 9 files changed, 504 insertions(+), 432 deletions(-) create mode 100644 workspace/TS100/Core/BSP/BSP.h create mode 100644 workspace/TS100/Core/BSP/Miniware/README.md rename workspace/TS100/Core/{Src => BSP/Miniware}/Setup.c (98%) rename workspace/TS100/Core/{Inc => BSP/Miniware}/Setup.h (80%) create mode 100644 workspace/TS100/Core/BSP/Miniware/preRTOS.c rename workspace/TS100/Core/{Src => BSP/Miniware}/stm32f1xx_hal_msp.c (96%) rename workspace/TS100/Core/{Src => BSP/Miniware}/stm32f1xx_hal_timebase_TIM.c (97%) rename workspace/TS100/Core/{Src => BSP/Miniware}/stm32f1xx_it.c (96%) diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h new file mode 100644 index 00000000..2efaeeac --- /dev/null +++ b/workspace/TS100/Core/BSP/BSP.h @@ -0,0 +1,44 @@ +#include "defines.h" +#include "stdint.h" +#include "UnitSettings.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(); + +#ifdef __cplusplus +} +#endif +#endif /* BSP_BSP_H_ */ 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 similarity index 98% rename from workspace/TS100/Core/Src/Setup.c rename to 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 similarity index 80% rename from workspace/TS100/Core/Inc/Setup.h rename to 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 -#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/preRTOS.c b/workspace/TS100/Core/BSP/Miniware/preRTOS.c new file mode 100644 index 00000000..384ec9ad --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/preRTOS.c @@ -0,0 +1,19 @@ +/* + * preRTOS.c + * + * Created on: 29 May 2020 + * Author: Ralim + */ + +#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 + 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 similarity index 96% rename from workspace/TS100/Core/Src/stm32f1xx_hal_msp.c rename to 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 -#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 similarity index 97% rename from workspace/TS100/Core/Src/stm32f1xx_hal_timebase_TIM.c rename to 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 similarity index 96% rename from workspace/TS100/Core/Src/stm32f1xx_it.c rename to 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/main.cpp b/workspace/TS100/Core/Src/main.cpp index d845c7ea..a4232784 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -1,4 +1,7 @@ // By Ben V. Brown - V2.0 of the TS100 firmware + +#include "BSP.h" + #include #include #include @@ -45,13 +48,10 @@ void startMOVTask(void const *argument); // 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); + FRToSI2C::init (&hi2c1); OLED::initialize(); // start up the LCD OLED::setFont(0); // default to bigger font // Testing for which accelerometer is mounted @@ -69,10 +69,10 @@ int main(void) { systemSettings.ShutdownTime = 0; // No accel -> disable sleep systemSettings.sensitivity = 0; } - HAL_IWDG_Refresh(&hiwdg); + resetWatchdog(); settingsWereReset = restoreSettings(); // load the settings from flash - HAL_IWDG_Refresh(&hiwdg); + resetWatchdog(); /* Create the thread(s) */ /* definition and creation of GUITask */ @@ -200,7 +200,7 @@ void startPIDTask(void const *argument __unused) { setTipX10Watts(x10WattsOut); } - HAL_IWDG_Refresh(&hiwdg); + HAL_IWDG_Refresh (&hiwdg); } else { //ADC interrupt timeout setTipPWM(0); From 6bb56c28ba753b91626ec032527fdf629e1ab75a Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 21:49:13 +1000 Subject: [PATCH 05/26] Drivers + Threads --- .../TS100/Core/{Src => Drivers}/Buttons.cpp | 0 .../TS100/Core/{Inc => Drivers}/Buttons.hpp | 0 workspace/TS100/Core/{Inc => Drivers}/Font.h | 384 +++++++++--------- .../TS100/Core/{Src => Drivers}/LIS2DH12.cpp | 0 .../TS100/Core/{Inc => Drivers}/LIS2DH12.hpp | 0 .../{Inc => Drivers}/LIS2DH12_defines.hpp | 56 +-- .../TS100/Core/{Src => Drivers}/MMA8652FC.cpp | 0 .../TS100/Core/{Inc => Drivers}/MMA8652FC.hpp | 0 .../Core/{Inc => Drivers}/MMA8652FC_defines.h | 248 +++++------ .../TS100/Core/{Src => Drivers}/OLED.cpp | 0 .../TS100/Core/{Inc => Drivers}/OLED.hpp | 0 workspace/TS100/Core/Drivers/README.md | 10 + .../Core/{Src => Drivers}/TipThermoModel.cpp | 0 .../Core/{Inc => Drivers}/TipThermoModel.h | 0 workspace/TS100/Core/Inc/main.hpp | 6 +- workspace/TS100/Core/Src/main.cpp | 116 +----- workspace/TS100/Core/Src/power.cpp | 2 +- .../TS100/Core/{Src => Threads}/GUIThread.cpp | 0 workspace/TS100/Core/Threads/PIDThread.cpp | 126 ++++++ 19 files changed, 487 insertions(+), 461 deletions(-) rename workspace/TS100/Core/{Src => Drivers}/Buttons.cpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/Buttons.hpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/Font.h (98%) rename workspace/TS100/Core/{Src => Drivers}/LIS2DH12.cpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/LIS2DH12.hpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/LIS2DH12_defines.hpp (95%) rename workspace/TS100/Core/{Src => Drivers}/MMA8652FC.cpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/MMA8652FC.hpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/MMA8652FC_defines.h (97%) rename workspace/TS100/Core/{Src => Drivers}/OLED.cpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/OLED.hpp (100%) create mode 100644 workspace/TS100/Core/Drivers/README.md rename workspace/TS100/Core/{Src => Drivers}/TipThermoModel.cpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/TipThermoModel.h (100%) rename workspace/TS100/Core/{Src => Threads}/GUIThread.cpp (100%) create mode 100644 workspace/TS100/Core/Threads/PIDThread.cpp diff --git a/workspace/TS100/Core/Src/Buttons.cpp b/workspace/TS100/Core/Drivers/Buttons.cpp similarity index 100% rename from workspace/TS100/Core/Src/Buttons.cpp rename to workspace/TS100/Core/Drivers/Buttons.cpp diff --git a/workspace/TS100/Core/Inc/Buttons.hpp b/workspace/TS100/Core/Drivers/Buttons.hpp similarity index 100% rename from workspace/TS100/Core/Inc/Buttons.hpp rename to workspace/TS100/Core/Drivers/Buttons.hpp diff --git a/workspace/TS100/Core/Inc/Font.h b/workspace/TS100/Core/Drivers/Font.h similarity index 98% rename from workspace/TS100/Core/Inc/Font.h rename to workspace/TS100/Core/Drivers/Font.h index 07139044..963ac71f 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 +// 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_ */ diff --git a/workspace/TS100/Core/Src/LIS2DH12.cpp b/workspace/TS100/Core/Drivers/LIS2DH12.cpp similarity index 100% rename from workspace/TS100/Core/Src/LIS2DH12.cpp rename to workspace/TS100/Core/Drivers/LIS2DH12.cpp diff --git a/workspace/TS100/Core/Inc/LIS2DH12.hpp b/workspace/TS100/Core/Drivers/LIS2DH12.hpp similarity index 100% rename from workspace/TS100/Core/Inc/LIS2DH12.hpp rename to workspace/TS100/Core/Drivers/LIS2DH12.hpp diff --git a/workspace/TS100/Core/Inc/LIS2DH12_defines.hpp b/workspace/TS100/Core/Drivers/LIS2DH12_defines.hpp similarity index 95% rename from workspace/TS100/Core/Inc/LIS2DH12_defines.hpp rename to 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 similarity index 100% rename from workspace/TS100/Core/Src/MMA8652FC.cpp rename to workspace/TS100/Core/Drivers/MMA8652FC.cpp diff --git a/workspace/TS100/Core/Inc/MMA8652FC.hpp b/workspace/TS100/Core/Drivers/MMA8652FC.hpp similarity index 100% rename from workspace/TS100/Core/Inc/MMA8652FC.hpp rename to workspace/TS100/Core/Drivers/MMA8652FC.hpp diff --git a/workspace/TS100/Core/Inc/MMA8652FC_defines.h b/workspace/TS100/Core/Drivers/MMA8652FC_defines.h similarity index 97% rename from workspace/TS100/Core/Inc/MMA8652FC_defines.h rename to 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 similarity index 100% rename from workspace/TS100/Core/Src/OLED.cpp rename to workspace/TS100/Core/Drivers/OLED.cpp diff --git a/workspace/TS100/Core/Inc/OLED.hpp b/workspace/TS100/Core/Drivers/OLED.hpp similarity index 100% rename from workspace/TS100/Core/Inc/OLED.hpp rename to workspace/TS100/Core/Drivers/OLED.hpp 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 similarity index 100% rename from workspace/TS100/Core/Src/TipThermoModel.cpp rename to workspace/TS100/Core/Drivers/TipThermoModel.cpp diff --git a/workspace/TS100/Core/Inc/TipThermoModel.h b/workspace/TS100/Core/Drivers/TipThermoModel.h similarity index 100% rename from workspace/TS100/Core/Inc/TipThermoModel.h rename to workspace/TS100/Core/Drivers/TipThermoModel.h diff --git a/workspace/TS100/Core/Inc/main.hpp b/workspace/TS100/Core/Inc/main.hpp index f2f2e808..6258bede 100644 --- a/workspace/TS100/Core/Inc/main.hpp +++ b/workspace/TS100/Core/Inc/main.hpp @@ -1,7 +1,6 @@ #ifndef __MAIN_H #define __MAIN_H -#include #include "OLED.hpp" #include "Setup.h" extern uint8_t PCBVersion; @@ -22,6 +21,11 @@ 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 ; #ifdef __cplusplus } #endif diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index a4232784..2694a4a8 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -38,12 +38,6 @@ 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 @@ -51,7 +45,7 @@ int main(void) { preRToSInit(); setTipX10Watts(0); // force tip off - FRToSI2C::init (&hi2c1); + FRToSI2C::init(&hi2c1); OLED::initialize(); // start up the LCD OLED::setFont(0); // default to bigger font // Testing for which accelerometer is mounted @@ -100,114 +94,6 @@ int main(void) { } } -/* 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 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); diff --git a/workspace/TS100/Core/Src/power.cpp b/workspace/TS100/Core/Src/power.cpp index 87507d15..4cceb9c5 100644 --- a/workspace/TS100/Core/Src/power.cpp +++ b/workspace/TS100/Core/Src/power.cpp @@ -2,7 +2,7 @@ * power.cpp * * Created on: 28 Oct, 2018 - * Authors: Ben V. Brown, David Hilton + * Authors: Ben V. Brown, David Hilton <- Mostly David */ #include diff --git a/workspace/TS100/Core/Src/GUIThread.cpp b/workspace/TS100/Core/Threads/GUIThread.cpp similarity index 100% rename from workspace/TS100/Core/Src/GUIThread.cpp rename to workspace/TS100/Core/Threads/GUIThread.cpp diff --git a/workspace/TS100/Core/Threads/PIDThread.cpp b/workspace/TS100/Core/Threads/PIDThread.cpp new file mode 100644 index 00000000..425aab5a --- /dev/null +++ b/workspace/TS100/Core/Threads/PIDThread.cpp @@ -0,0 +1,126 @@ +/* + * 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; +/* 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 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); + } + } +} From a13f501dfd219e6991603f0341912bda0550fa92 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 21:54:09 +1000 Subject: [PATCH 06/26] More refactoring for the movement thread --- workspace/TS100/Core/BSP/BSP.h | 2 + workspace/TS100/Core/BSP/Miniware/BSP.cpp | 42 ++++++- workspace/TS100/Core/Inc/main.hpp | 4 +- workspace/TS100/Core/Src/FreeRTOSHooks.c | 8 ++ workspace/TS100/Core/Src/main.cpp | 131 +-------------------- workspace/TS100/Core/Threads/MOVThread.cpp | 109 +++++++++++++++++ 6 files changed, 164 insertions(+), 132 deletions(-) create mode 100644 workspace/TS100/Core/Threads/MOVThread.cpp diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index 2efaeeac..fea1ee46 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -38,6 +38,8 @@ uint8_t getButtonB(); // 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(); #ifdef __cplusplus } #endif diff --git a/workspace/TS100/Core/BSP/Miniware/BSP.cpp b/workspace/TS100/Core/BSP/Miniware/BSP.cpp index 21eaa3cb..80abda39 100644 --- a/workspace/TS100/Core/BSP/Miniware/BSP.cpp +++ b/workspace/TS100/Core/BSP/Miniware/BSP.cpp @@ -4,11 +4,12 @@ #include "Setup.h" #include "history.hpp" #include "Pins.h" +#include "main.hpp" #include "history.hpp" +#include "FRToSI2C.hpp" volatile uint16_t PWMSafetyTimer = 0; volatile uint8_t pendingPWM = 0; - //2 second filter (ADC is PID_TIM_HZ Hz) history rawTempFilter = { { 0 }, 0, 0 }; void resetWatchdog() { @@ -210,3 +211,42 @@ 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(); +} diff --git a/workspace/TS100/Core/Inc/main.hpp b/workspace/TS100/Core/Inc/main.hpp index 6258bede..37bc9816 100644 --- a/workspace/TS100/Core/Inc/main.hpp +++ b/workspace/TS100/Core/Inc/main.hpp @@ -25,7 +25,9 @@ void vApplicationStackOverflowHook(xTaskHandle *pxTask, void startGUITask(void const *argument); void startPIDTask(void const *argument); void startMOVTask(void const *argument); -extern TaskHandle_t pidTaskNotification ; +extern TaskHandle_t pidTaskNotification; +extern uint8_t accelInit; +extern uint32_t lastMovementTime; #ifdef __cplusplus } #endif diff --git a/workspace/TS100/Core/Src/FreeRTOSHooks.c b/workspace/TS100/Core/Src/FreeRTOSHooks.c index d5a15dd7..1e9c3dc6 100644 --- a/workspace/TS100/Core/Src/FreeRTOSHooks.c +++ b/workspace/TS100/Core/Src/FreeRTOSHooks.c @@ -22,3 +22,11 @@ void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, *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/main.cpp b/workspace/TS100/Core/Src/main.cpp index 2694a4a8..ed12e0bf 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -2,10 +2,10 @@ #include "BSP.h" -#include #include #include #include "LIS2DH12.hpp" +#include #include #include #include "Settings.h" @@ -18,8 +18,6 @@ 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 @@ -94,92 +92,6 @@ int main(void) { } } -#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) @@ -199,44 +111,3 @@ bool showBootLogoIfavailable() { 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/Threads/MOVThread.cpp b/workspace/TS100/Core/Threads/MOVThread.cpp new file mode 100644 index 00000000..70c0727b --- /dev/null +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -0,0 +1,109 @@ +/* + * MOVThread.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" +#include "FRToSI2C.hpp" +#include "stdlib.h" +#include "LIS2DH12.hpp" +#include + +#define MOVFilter 8 +uint8_t accelInit = 0; +uint32_t lastMovementTime = 0; +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 + } +} From 7dbbdf348c4c6e9380f1d4f74794e82c21b1aecf Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 21:55:53 +1000 Subject: [PATCH 07/26] Update Makefile --- workspace/TS100/Makefile | 484 ++++++++++++++++++++------------------- 1 file changed, 246 insertions(+), 238 deletions(-) diff --git a/workspace/TS100/Makefile b/workspace/TS100/Makefile index 4413f2cb..13ae0a6d 100644 --- a/workspace/TS100/Makefile +++ b/workspace/TS100/Makefile @@ -1,238 +1,246 @@ - -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 $@ > $@.lst - -$(OUT_OBJS_CPP): $(OUTPUT_DIR)/%.o : %.cpp Makefile - @test -d $(@D) || mkdir -p $(@D) - @echo Compiling ${<} - @$(CPP) -c $(CXXFLAGS) $< -o $@ - @$(OBJDUMP) -d -S $@ > $@.lst - -$(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 = ./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 +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, +# 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 $@ > $@.lst + +$(OUT_OBJS_CPP): $(OUTPUT_DIR)/%.o : %.cpp Makefile + @test -d $(@D) || mkdir -p $(@D) + @echo Compiling ${<} + @$(CPP) -c $(CXXFLAGS) $< -o $@ + @$(OBJDUMP) -d -S $@ > $@.lst + +$(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) + From cd5d9df5edb38f95fd104755603d68cc6f15b8c2 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 22:00:24 +1000 Subject: [PATCH 08/26] Update BSP.h --- workspace/TS100/Core/BSP/BSP.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index fea1ee46..2c02eabc 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -1,4 +1,4 @@ -#include "defines.h" +#include "Defines.h" #include "stdint.h" #include "UnitSettings.h" /* From a01e79aa641d68ab195d74893ae6cb7ac8827442 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 22:25:43 +1000 Subject: [PATCH 09/26] Refactor QC logic for TS80 --- workspace/TS100/Core/BSP/BSP.h | 1 + workspace/TS100/Core/BSP/BSP_QC.h | 39 ++++++++++++ workspace/TS100/Core/BSP/Miniware/QC_GPIO.c | 68 +++++++++++++++++++++ workspace/TS100/Core/Inc/QC3.h | 2 +- workspace/TS100/Core/Src/QC3.c | 56 +++-------------- workspace/TS100/Core/Threads/MOVThread.cpp | 2 +- 6 files changed, 119 insertions(+), 49 deletions(-) create mode 100644 workspace/TS100/Core/BSP/BSP_QC.h create mode 100644 workspace/TS100/Core/BSP/Miniware/QC_GPIO.c diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index 2c02eabc..e86f941b 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -1,6 +1,7 @@ #include "Defines.h" #include "stdint.h" #include "UnitSettings.h" +#include "BSP_QC.h" /* * BSP.h -- Board Support * diff --git a/workspace/TS100/Core/BSP/BSP_QC.h b/workspace/TS100/Core/BSP/BSP_QC.h new file mode 100644 index 00000000..5ad58376 --- /dev/null +++ b/workspace/TS100/Core/BSP/BSP_QC.h @@ -0,0 +1,39 @@ +/* + * BSP_QC.h + * + * Created on: 29 May 2020 + * Author: Ralim + */ + +#ifndef BSP_BSP_QC_H_ +#define BSP_BSP_QC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//Init GPIO for QC neg +void QC_Init_GPIO(); +//Set the DP pin to 0.6V +void DPlusZero_Six(); +//Set the DM pin to 0.6V +void DNegZero_Six(); +//Set the DP pin to 3.3V +void DPlusThree_Three(); +//Set the DM pin to 3.3V +void 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(); +#ifdef __cplusplus +} +#endif + +#endif /* BSP_BSP_QC_H_ */ diff --git a/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c new file mode 100644 index 00000000..9b082788 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c @@ -0,0 +1,68 @@ +/* + * QC.c + * + * Created on: 29 May 2020 + * Author: Ralim + */ +#include "BSP.h" +#include "Pins.h" +#include "stm32f1xx_hal.h" +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_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; +} diff --git a/workspace/TS100/Core/Inc/QC3.h b/workspace/TS100/Core/Inc/QC3.h index 98bfa0f5..0ddf1b0f 100644 --- a/workspace/TS100/Core/Inc/QC3.h +++ b/workspace/TS100/Core/Inc/QC3.h @@ -7,7 +7,7 @@ #ifndef INC_QC3_H_ #define INC_QC3_H_ - +#include "stdint.h" #ifdef __cplusplus extern "C" { #endif diff --git a/workspace/TS100/Core/Src/QC3.c b/workspace/TS100/Core/Src/QC3.c index 6e47b7c1..bb773e1b 100644 --- a/workspace/TS100/Core/Src/QC3.c +++ b/workspace/TS100/Core/Src/QC3.c @@ -5,26 +5,11 @@ * Author: Ralim */ - //Quick charge 3.0 supporting functions - - - -#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); -} +#include "QC3.h" +#include "stdint.h" +#include "BSP.h" +#include "cmsis_os.h" void QC_Seek9V() { DNegZero_Six(); @@ -127,20 +112,7 @@ void startQC(uint16_t divisor) { 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); + QC_Init_GPIO(); // Tries to negotiate QC for 9V // This is a multiple step process. @@ -154,28 +126,20 @@ void startQC(uint16_t divisor) { 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) { + if (QC_DM_PulledDown()) { 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); + QC_DM_PullDown(); } } } - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Pin = GPIO_PIN_11; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + QC_DM_No_PullDown(); 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_Post_Probe_En(); QC_Seek9V(); // Wait for frontend ADC to stabilise QCMode = 4; @@ -199,5 +163,3 @@ void startQC(uint16_t divisor) { QCMode = 0; } - -#endif diff --git a/workspace/TS100/Core/Threads/MOVThread.cpp b/workspace/TS100/Core/Threads/MOVThread.cpp index 70c0727b..04220170 100644 --- a/workspace/TS100/Core/Threads/MOVThread.cpp +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -18,7 +18,7 @@ #include "stdlib.h" #include "LIS2DH12.hpp" #include - +#include "QC3.h" #define MOVFilter 8 uint8_t accelInit = 0; uint32_t lastMovementTime = 0; From d2dacf990c80335315764f393addd200c88fe18a Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 22:26:21 +1000 Subject: [PATCH 10/26] Move I2C to drivers --- workspace/TS100/Core/{Src => Drivers}/FRToSI2C.cpp | 0 workspace/TS100/Core/{Inc => Drivers}/FRToSI2C.hpp | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename workspace/TS100/Core/{Src => Drivers}/FRToSI2C.cpp (100%) rename workspace/TS100/Core/{Inc => Drivers}/FRToSI2C.hpp (100%) diff --git a/workspace/TS100/Core/Src/FRToSI2C.cpp b/workspace/TS100/Core/Drivers/FRToSI2C.cpp similarity index 100% rename from workspace/TS100/Core/Src/FRToSI2C.cpp rename to workspace/TS100/Core/Drivers/FRToSI2C.cpp diff --git a/workspace/TS100/Core/Inc/FRToSI2C.hpp b/workspace/TS100/Core/Drivers/FRToSI2C.hpp similarity index 100% rename from workspace/TS100/Core/Inc/FRToSI2C.hpp rename to workspace/TS100/Core/Drivers/FRToSI2C.hpp From a32e245789de59835ee13f2ed66716e5eab527df Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 23:07:59 +1000 Subject: [PATCH 11/26] Split I2C + startup logo --- workspace/TS100/Core/BSP/BSP.h | 4 +++ workspace/TS100/Core/BSP/Miniware/logo.cpp | 27 +++++++++++++++++++ .../BSP/Miniware/{preRTOS.c => preRTOS.cpp} | 3 +++ workspace/TS100/Core/Drivers/FRToSI2C.hpp | 8 ++++++ workspace/TS100/Core/Inc/Settings.h | 6 ++--- workspace/TS100/Core/Src/main.cpp | 24 ----------------- 6 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 workspace/TS100/Core/BSP/Miniware/logo.cpp rename workspace/TS100/Core/BSP/Miniware/{preRTOS.c => preRTOS.cpp} (84%) diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index e86f941b..82895a79 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -41,6 +41,10 @@ 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(); #ifdef __cplusplus } #endif 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(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/preRTOS.c b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp similarity index 84% rename from workspace/TS100/Core/BSP/Miniware/preRTOS.c rename to workspace/TS100/Core/BSP/Miniware/preRTOS.cpp index 384ec9ad..107eb6a5 100644 --- a/workspace/TS100/Core/BSP/Miniware/preRTOS.c +++ b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp @@ -8,12 +8,15 @@ #include "BSP.h" #include "Setup.h" #include "Pins.h" +#include "FRTosI2C.hpp" void preRToSInit() { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); Setup_HAL(); // Setup all the HAL objects + FRToSI2C::init(&hi2c1); 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/Drivers/FRToSI2C.hpp b/workspace/TS100/Core/Drivers/FRToSI2C.hpp index efc11d74..550ae076 100644 --- a/workspace/TS100/Core/Drivers/FRToSI2C.hpp +++ b/workspace/TS100/Core/Drivers/FRToSI2C.hpp @@ -10,6 +10,14 @@ #include "stm32f1xx_hal.h" #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: 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/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index ed12e0bf..539f4a61 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -43,7 +43,6 @@ int main(void) { 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 @@ -86,28 +85,5 @@ int main(void) { /* Start scheduler */ osKernelStart(); - /* We should never get here as control is now taken by the scheduler */ - while (1) { - } } - - -// 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(FLASH_LOGOADDR))) { - return false; - } - - OLED::drawAreaSwapped(0, 0, 96, 16, (uint8_t*) (FLASH_LOGOADDR + 4)); - OLED::refresh(); - return true; -} - From 2d8d1ad8da503c52fe73ac984005b58e9417b146 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 23:12:31 +1000 Subject: [PATCH 12/26] Move I2C --- .../{Drivers/FRToSI2C.cpp => BSP/Miniware/I2C_Wrapper.cpp} | 2 +- workspace/TS100/Core/BSP/Miniware/preRTOS.cpp | 2 +- .../TS100/Core/Drivers/{FRToSI2C.hpp => I2C_Wrapper.hpp} | 0 workspace/TS100/Core/Src/main.cpp | 4 ++++ 4 files changed, 6 insertions(+), 2 deletions(-) rename workspace/TS100/Core/{Drivers/FRToSI2C.cpp => BSP/Miniware/I2C_Wrapper.cpp} (95%) rename workspace/TS100/Core/Drivers/{FRToSI2C.hpp => I2C_Wrapper.hpp} (100%) diff --git a/workspace/TS100/Core/Drivers/FRToSI2C.cpp b/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp similarity index 95% rename from workspace/TS100/Core/Drivers/FRToSI2C.cpp rename to workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp index a562e6fa..f0f1ecdc 100644 --- a/workspace/TS100/Core/Drivers/FRToSI2C.cpp +++ b/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp @@ -4,8 +4,8 @@ * Created on: 14Apr.,2018 * Author: Ralim */ +#include #include "BSP.h" -#include "FRToSI2C.hpp" #define I2CUSESDMA I2C_HandleTypeDef *FRToSI2C::i2c; SemaphoreHandle_t FRToSI2C::I2CSemaphore; diff --git a/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp index 107eb6a5..a27078ad 100644 --- a/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp +++ b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp @@ -5,10 +5,10 @@ * Author: Ralim */ +#include #include "BSP.h" #include "Setup.h" #include "Pins.h" -#include "FRTosI2C.hpp" void preRToSInit() { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ diff --git a/workspace/TS100/Core/Drivers/FRToSI2C.hpp b/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp similarity index 100% rename from workspace/TS100/Core/Drivers/FRToSI2C.hpp rename to workspace/TS100/Core/Drivers/I2C_Wrapper.hpp diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index 539f4a61..eb8b9597 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -1,5 +1,9 @@ // By Ben V. Brown - V2.0 of the TS100 firmware +/* + * Main.cpp bootstraps the device and then hands over to FreeRTOS and the threads + */ + #include "BSP.h" #include From 7c45b679676fa1490acf6bc425a7edadacebec61 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 23:13:30 +1000 Subject: [PATCH 13/26] Update includes --- workspace/TS100/Core/BSP/Miniware/BSP.cpp | 2 +- workspace/TS100/Core/Drivers/LIS2DH12.hpp | 2 +- workspace/TS100/Core/Drivers/MMA8652FC.hpp | 2 +- workspace/TS100/Core/Drivers/OLED.hpp | 2 +- workspace/TS100/Core/Threads/MOVThread.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/workspace/TS100/Core/BSP/Miniware/BSP.cpp b/workspace/TS100/Core/BSP/Miniware/BSP.cpp index 80abda39..7556265c 100644 --- a/workspace/TS100/Core/BSP/Miniware/BSP.cpp +++ b/workspace/TS100/Core/BSP/Miniware/BSP.cpp @@ -6,7 +6,7 @@ #include "Pins.h" #include "main.hpp" #include "history.hpp" -#include "FRToSI2C.hpp" +#include "I2C_Wrapper.hpp" volatile uint16_t PWMSafetyTimer = 0; volatile uint8_t pendingPWM = 0; diff --git a/workspace/TS100/Core/Drivers/LIS2DH12.hpp b/workspace/TS100/Core/Drivers/LIS2DH12.hpp index 3400130d..252cbdee 100644 --- a/workspace/TS100/Core/Drivers/LIS2DH12.hpp +++ b/workspace/TS100/Core/Drivers/LIS2DH12.hpp @@ -8,7 +8,7 @@ #ifndef LIS2DH12_HPP_ #define LIS2DH12_HPP_ #include "stm32f1xx_hal.h" -#include "FRToSI2C.hpp" +#include "I2C_Wrapper.hpp" #include "LIS2DH12_defines.hpp" #include "BSP.h" diff --git a/workspace/TS100/Core/Drivers/MMA8652FC.hpp b/workspace/TS100/Core/Drivers/MMA8652FC.hpp index 2654e903..20dbf146 100644 --- a/workspace/TS100/Core/Drivers/MMA8652FC.hpp +++ b/workspace/TS100/Core/Drivers/MMA8652FC.hpp @@ -9,7 +9,7 @@ #define MMA8652FC_HPP_ #include "stm32f1xx_hal.h" #include "MMA8652FC_defines.h" -#include "FRToSI2C.hpp" +#include "I2C_Wrapper.hpp" #include "BSP.h" class MMA8652FC { diff --git a/workspace/TS100/Core/Drivers/OLED.hpp b/workspace/TS100/Core/Drivers/OLED.hpp index efb5aee2..7452e472 100644 --- a/workspace/TS100/Core/Drivers/OLED.hpp +++ b/workspace/TS100/Core/Drivers/OLED.hpp @@ -13,7 +13,7 @@ #include "stm32f1xx_hal.h" #include #include -#include "FRToSI2C.hpp" +#include "I2C_Wrapper.hpp" #include "Font.h" #ifdef __cplusplus extern "C" { diff --git a/workspace/TS100/Core/Threads/MOVThread.cpp b/workspace/TS100/Core/Threads/MOVThread.cpp index 04220170..f2d3dd82 100644 --- a/workspace/TS100/Core/Threads/MOVThread.cpp +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -14,7 +14,7 @@ #include "FreeRTOS.h" #include "task.h" #include "Settings.h" -#include "FRToSI2C.hpp" +#include "I2C_Wrapper.hpp" #include "stdlib.h" #include "LIS2DH12.hpp" #include From 22ac8d797b0c1fa95f3766bc8d50a8e8b7cfdef0 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Fri, 29 May 2020 23:17:23 +1000 Subject: [PATCH 14/26] Update main.cpp --- workspace/TS100/Core/Src/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index eb8b9597..72e550e9 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -90,4 +90,6 @@ int main(void) { /* Start scheduler */ osKernelStart(); /* We should never get here as control is now taken by the scheduler */ + for (;;) { + } } From 42ebd37bc87ffdc6452b6b29642cadb4ee596db0 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 00:05:28 +1000 Subject: [PATCH 15/26] Pull out settings flash calls --- workspace/TS100/Core/BSP/BSP.h | 1 + workspace/TS100/Core/BSP/BSP_Flash.h | 26 ++++++++++++ workspace/TS100/Core/BSP/Miniware/flash.c | 49 ++++++++++++++++++++++ workspace/TS100/Core/Src/Settings.cpp | 46 +++++--------------- workspace/TS100/Core/Src/gui.cpp | 2 +- workspace/TS100/Core/Src/main.cpp | 13 +----- workspace/TS100/Core/Threads/PIDThread.cpp | 2 + 7 files changed, 91 insertions(+), 48 deletions(-) create mode 100644 workspace/TS100/Core/BSP/BSP_Flash.h create mode 100644 workspace/TS100/Core/BSP/Miniware/flash.c diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index 82895a79..2c66cb2d 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -2,6 +2,7 @@ #include "stdint.h" #include "UnitSettings.h" #include "BSP_QC.h" +#include "BSP_Flash.h" /* * BSP.h -- Board Support * 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/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/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 4de6b484..2fe91a24 100644 --- a/workspace/TS100/Core/Src/gui.cpp +++ b/workspace/TS100/Core/Src/gui.cpp @@ -14,7 +14,7 @@ #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/main.cpp b/workspace/TS100/Core/Src/main.cpp index 72e550e9..9d5e19f4 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -5,23 +5,14 @@ */ #include "BSP.h" - -#include #include #include "LIS2DH12.hpp" #include -#include #include #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 bool settingsWereReset = false; // FreeRTOS variables @@ -51,6 +42,8 @@ int main(void) { OLED::setFont(0); // default to bigger font // Testing for which accelerometer is mounted resetWatchdog(); + resetWatchdog(); + settingsWereReset = restoreSettings(); // load the settings from flash if (MMA8652FC::detect()) { PCBVersion = 1; MMA8652FC::initalize(); // this sets up the I2C registers @@ -64,8 +57,6 @@ int main(void) { systemSettings.ShutdownTime = 0; // No accel -> disable sleep systemSettings.sensitivity = 0; } - resetWatchdog(); - settingsWereReset = restoreSettings(); // load the settings from flash resetWatchdog(); diff --git a/workspace/TS100/Core/Threads/PIDThread.cpp b/workspace/TS100/Core/Threads/PIDThread.cpp index 425aab5a..844e3617 100644 --- a/workspace/TS100/Core/Threads/PIDThread.cpp +++ b/workspace/TS100/Core/Threads/PIDThread.cpp @@ -17,6 +17,8 @@ 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) { /* From ed8e5232b64d3d3a55fe30e8678f7587a10d32a6 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 00:10:23 +1000 Subject: [PATCH 16/26] Finishing up file cleanup --- .../{Src => BSP/Miniware}/system_stm32f1xx.c | 634 +++++++++--------- workspace/TS100/Core/Src/syscalls.c | 118 +--- workspace/TS100/Core/Src/sysmem.c | 73 +- 3 files changed, 345 insertions(+), 480 deletions(-) rename workspace/TS100/Core/{Src => BSP/Miniware}/system_stm32f1xx.c (97%) diff --git a/workspace/TS100/Core/Src/system_stm32f1xx.c b/workspace/TS100/Core/BSP/Miniware/system_stm32f1xx.c similarity index 97% rename from workspace/TS100/Core/Src/system_stm32f1xx.c rename to 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/Src/syscalls.c b/workspace/TS100/Core/Src/syscalls.c index c3de5d66..1a0f4f8e 100644 --- a/workspace/TS100/Core/Src/syscalls.c +++ b/workspace/TS100/Core/Src/syscalls.c @@ -1,51 +1,3 @@ -/** -***************************************************************************** -** -** 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. -** -***************************************************************************** -** -**

© COPYRIGHT(c) 2018 STMicroelectronics

-** -** 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 #include @@ -56,129 +8,107 @@ #include #include - /* 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"); +register char *stack_ptr asm("sp"); char *__env[1] = { 0 }; char **environ = __env; - /* Functions */ -void initialise_monitor_handles() -{ +void initialise_monitor_handles() { } -int _getpid(void) -{ +int _getpid(void) { return 1; } -int _kill(int pid, int sig) -{ +int _kill(int pid, int sig) { errno = EINVAL; return -1; } -void _exit (int status) -{ +void _exit(int status) { _kill(status, -1); - while (1) {} /* Make sure we hang here */ + while (1) { + } /* Make sure we hang here */ } -__attribute__((weak)) int _read(int file, char *ptr, int len) -{ +__attribute__((weak)) int _read(int file, char *ptr, int len) { int DataIdx; - for (DataIdx = 0; DataIdx < len; DataIdx++) - { + for (DataIdx = 0; DataIdx < len; DataIdx++) { *ptr++ = __io_getchar(); } -return len; + return len; } -__attribute__((weak)) int _write(int file, char *ptr, int len) -{ +__attribute__((weak)) int _write(int file, char *ptr, int len) { int DataIdx; - for (DataIdx = 0; DataIdx < len; DataIdx++) - { + for (DataIdx = 0; DataIdx < len; DataIdx++) { __io_putchar(*ptr++); } return len; } -int _close(int file) -{ +int _close(int file) { return -1; } - -int _fstat(int file, struct stat *st) -{ +int _fstat(int file, struct stat *st) { st->st_mode = S_IFCHR; return 0; } -int _isatty(int file) -{ +int _isatty(int file) { return 1; } -int _lseek(int file, int ptr, int dir) -{ +int _lseek(int file, int ptr, int dir) { return 0; } -int _open(char *path, int flags, ...) -{ +int _open(char *path, int flags, ...) { /* Pretend like we always fail */ return -1; } -int _wait(int *status) -{ +int _wait(int *status) { errno = ECHILD; return -1; } -int _unlink(char *name) -{ +int _unlink(char *name) { errno = ENOENT; return -1; } -int _times(struct tms *buf) -{ +int _times(struct tms *buf) { return -1; } -int _stat(char *file, struct stat *st) -{ +int _stat(char *file, struct stat *st) { st->st_mode = S_IFCHR; return 0; } -int _link(char *old, char *new) -{ +int _link(char *old, char *new) { errno = EMLINK; return -1; } -int _fork(void) -{ +int _fork(void) { errno = EAGAIN; return -1; } -int _execve(char *name, char **argv, char **env) -{ +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 index 847daf4c..fc88ed94 100644 --- a/workspace/TS100/Core/Src/sysmem.c +++ b/workspace/TS100/Core/Src/sysmem.c @@ -1,83 +1,18 @@ -/** -***************************************************************************** -** -** 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. -** -***************************************************************************** -** -**

© COPYRIGHT(c) 2018 STMicroelectronics

-** -** 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 #include /* Variables */ extern int errno; -register char * stack_ptr asm("sp"); +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; + **/ +caddr_t _sbrk(int incr) { + return (void*) -1; } From 22aba0855deed2a7415c0ff1853f376eb9845206 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 00:23:07 +1000 Subject: [PATCH 17/26] Cleanup I2C and drivers --- workspace/TS100/Core/BSP/BSP.h | 2 + workspace/TS100/Core/BSP/Miniware/BSP.cpp | 4 + .../TS100/Core/BSP/Miniware/I2C_Wrapper.cpp | 48 +++---- workspace/TS100/Core/BSP/Miniware/preRTOS.cpp | 2 +- workspace/TS100/Core/Drivers/Font.h | 4 +- workspace/TS100/Core/Drivers/I2C_Wrapper.hpp | 12 +- workspace/TS100/Core/Drivers/LIS2DH12.cpp | 2 +- workspace/TS100/Core/Drivers/LIS2DH12.hpp | 1 - workspace/TS100/Core/Drivers/MMA8652FC.cpp | 4 +- workspace/TS100/Core/Drivers/MMA8652FC.hpp | 1 - workspace/TS100/Core/Drivers/OLED.cpp | 16 ++- workspace/TS100/Core/Drivers/OLED.hpp | 31 +++-- workspace/TS100/Core/Threads/GUIThread.cpp | 121 +++++++++--------- 13 files changed, 129 insertions(+), 119 deletions(-) diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index 2c66cb2d..e9e96d25 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -46,6 +46,8 @@ 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 diff --git a/workspace/TS100/Core/BSP/Miniware/BSP.cpp b/workspace/TS100/Core/BSP/Miniware/BSP.cpp index 7556265c..591f005c 100644 --- a/workspace/TS100/Core/BSP/Miniware/BSP.cpp +++ b/workspace/TS100/Core/BSP/Miniware/BSP.cpp @@ -250,3 +250,7 @@ void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c __unused) { 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 index f0f1ecdc..ad727723 100644 --- a/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp +++ b/workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp @@ -6,25 +6,25 @@ */ #include #include "BSP.h" +#include "Setup.h" #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) + 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, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size) { + 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); + HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, + pData, Size, 5000); return true; } else { // RToS is active, run threading @@ -32,10 +32,10 @@ bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, // 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) { + if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, + I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) { - I2C1_ClearBusyFlagErratum(); + I2C_Unstick(); xSemaphoreGive(I2CSemaphore); return false; } else { @@ -44,7 +44,7 @@ bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, } #else - if (HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, + if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, pData, Size, 5000)==HAL_OK){ xSemaphoreGive(I2CSemaphore); return true; @@ -59,36 +59,36 @@ bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, } void FRToSI2C::I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data) { - Mem_Write(address, reg, I2C_MEMADD_SIZE_8BIT, &data, 1); + 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, I2C_MEMADD_SIZE_8BIT, tx_data, 1); + Mem_Read(add, reg, 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) { + 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); + 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(i2c, DevAddress, MemAddress, MemAddSize, - pData, Size, 500) != HAL_OK) { + if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, + I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) { - I2C1_ClearBusyFlagErratum(); + I2C_Unstick(); xSemaphoreGive(I2CSemaphore); } xSemaphoreGive(I2CSemaphore); #else - if (HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, + if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, pData, Size, 5000) != HAL_OK) { } xSemaphoreGive(I2CSemaphore); @@ -102,7 +102,7 @@ void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, 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); + 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 @@ -110,15 +110,15 @@ void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) { if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) { #ifdef I2CUSESDMA - if (HAL_I2C_Master_Transmit_DMA(i2c, DevAddress, pData, Size) + if (HAL_I2C_Master_Transmit_DMA(&hi2c1, DevAddress, pData, Size) != HAL_OK) { - I2C1_ClearBusyFlagErratum(); + I2C_Unstick(); xSemaphoreGive(I2CSemaphore); } #else - HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000); + HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, 5000); xSemaphoreGive(I2CSemaphore); #endif @@ -130,13 +130,13 @@ void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) { bool FRToSI2C::probe(uint16_t DevAddress) { uint8_t buffer[1]; - if (Mem_Read(DevAddress, 0, I2C_MEMADD_SIZE_8BIT, buffer, 1)) { + if (Mem_Read(DevAddress, 0, buffer, 1)) { //ACK'd return true; } return false; } -void FRToSI2C::I2C1_ClearBusyFlagErratum() { +void FRToSI2C::I2C_Unstick() { unstick_I2C(); } diff --git a/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp index a27078ad..6a16c44f 100644 --- a/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp +++ b/workspace/TS100/Core/BSP/Miniware/preRTOS.cpp @@ -14,7 +14,7 @@ void preRToSInit() { */ HAL_Init(); Setup_HAL(); // Setup all the HAL objects - FRToSI2C::init(&hi2c1); + 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/Drivers/Font.h b/workspace/TS100/Core/Drivers/Font.h index 963ac71f..761b2723 100644 --- a/workspace/TS100/Core/Drivers/Font.h +++ b/workspace/TS100/Core/Drivers/Font.h @@ -12,8 +12,8 @@ #include "Translation.h" #define FONT_12_WIDTH 12 -// FONTS ARE NO LONGER HERE, MOVED TO PYTHON AUTO GEN - +// THE MAIN FONTS ARE NO LONGER HERE, MOVED TO PYTHON AUTO GEN +// THESE ARE ONLY THE SYMBOL FONTS const uint8_t ExtraFontChars[] = { //width = 12 diff --git a/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp b/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp index 550ae076..3753a481 100644 --- a/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp +++ b/workspace/TS100/Core/Drivers/I2C_Wrapper.hpp @@ -7,7 +7,7 @@ #ifndef FRTOSI2C_HPP_ #define FRTOSI2C_HPP_ -#include "stm32f1xx_hal.h" + #include "cmsis_os.h" /* @@ -21,8 +21,7 @@ class FRToSI2C { public: - static void init(I2C_HandleTypeDef *i2chandle) { - i2c = i2chandle; + static void init() { I2CSemaphore = nullptr; } @@ -34,9 +33,9 @@ public: static void CpltCallback(); //Normal Tx Callback static bool Mem_Read(uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size); + 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); + uint8_t *pData, uint16_t Size); //Returns true if device ACK's being addressed static bool probe(uint16_t DevAddress); @@ -45,8 +44,7 @@ public: static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg); private: - static I2C_HandleTypeDef *i2c; - static void I2C1_ClearBusyFlagErratum(); + static void I2C_Unstick(); static SemaphoreHandle_t I2CSemaphore; static StaticSemaphore_t xSemaphoreBuffer; }; diff --git a/workspace/TS100/Core/Drivers/LIS2DH12.cpp b/workspace/TS100/Core/Drivers/LIS2DH12.cpp index 3557f0d9..888e1231 100644 --- a/workspace/TS100/Core/Drivers/LIS2DH12.cpp +++ b/workspace/TS100/Core/Drivers/LIS2DH12.cpp @@ -38,7 +38,7 @@ void LIS2DH12::initalize() { void LIS2DH12::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { std::array sensorData; - FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, + FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, reinterpret_cast(sensorData.begin()), sensorData.size() * sizeof(int16_t)); diff --git a/workspace/TS100/Core/Drivers/LIS2DH12.hpp b/workspace/TS100/Core/Drivers/LIS2DH12.hpp index 252cbdee..79346e98 100644 --- a/workspace/TS100/Core/Drivers/LIS2DH12.hpp +++ b/workspace/TS100/Core/Drivers/LIS2DH12.hpp @@ -7,7 +7,6 @@ #ifndef LIS2DH12_HPP_ #define LIS2DH12_HPP_ -#include "stm32f1xx_hal.h" #include "I2C_Wrapper.hpp" #include "LIS2DH12_defines.hpp" #include "BSP.h" diff --git a/workspace/TS100/Core/Drivers/MMA8652FC.cpp b/workspace/TS100/Core/Drivers/MMA8652FC.cpp index cfa4775e..cd41488a 100644 --- a/workspace/TS100/Core/Drivers/MMA8652FC.cpp +++ b/workspace/TS100/Core/Drivers/MMA8652FC.cpp @@ -42,7 +42,7 @@ void MMA8652FC::initalize() { i2c_registers[index].val); index++; - HAL_Delay(2); // ~1ms delay + delay_ms(2); // ~1ms delay while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) { FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, @@ -72,7 +72,7 @@ void MMA8652FC::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { std::array sensorData; FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, - I2C_MEMADD_SIZE_8BIT, reinterpret_cast(sensorData.begin()), + reinterpret_cast(sensorData.begin()), sensorData.size() * sizeof(int16_t)); x = static_cast(__builtin_bswap16( diff --git a/workspace/TS100/Core/Drivers/MMA8652FC.hpp b/workspace/TS100/Core/Drivers/MMA8652FC.hpp index 20dbf146..ec160ab5 100644 --- a/workspace/TS100/Core/Drivers/MMA8652FC.hpp +++ b/workspace/TS100/Core/Drivers/MMA8652FC.hpp @@ -7,7 +7,6 @@ #ifndef MMA8652FC_HPP_ #define MMA8652FC_HPP_ -#include "stm32f1xx_hal.h" #include "MMA8652FC_defines.h" #include "I2C_Wrapper.hpp" #include "BSP.h" diff --git a/workspace/TS100/Core/Drivers/OLED.cpp b/workspace/TS100/Core/Drivers/OLED.cpp index 93390973..fc9867eb 100644 --- a/workspace/TS100/Core/Drivers/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] @@ -144,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]); @@ -191,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); @@ -271,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/Drivers/OLED.hpp b/workspace/TS100/Core/Drivers/OLED.hpp index 7452e472..5e3238a7 100644 --- a/workspace/TS100/Core/Drivers/OLED.hpp +++ b/workspace/TS100/Core/Drivers/OLED.hpp @@ -10,7 +10,6 @@ #ifndef OLED_HPP_ #define OLED_HPP_ #include -#include "stm32f1xx_hal.h" #include #include #include "I2C_Wrapper.hpp" @@ -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/Threads/GUIThread.cpp b/workspace/TS100/Core/Threads/GUIThread.cpp index 19bf4650..3724b76a 100644 --- a/workspace/TS100/Core/Threads/GUIThread.cpp +++ b/workspace/TS100/Core/Threads/GUIThread.cpp @@ -4,6 +4,9 @@ * Created on: 19 Aug 2019 * Author: ralim */ +extern "C" { +#include "FreeRTOSConfig.h" +} #include #include #include @@ -14,7 +17,6 @@ #include "Translation.h" #include "cmsis_os.h" #include "stdlib.h" -#include "stm32f1xx_hal.h" #include "string.h" #include "TipThermoModel.h" #include "unit.h" @@ -30,10 +32,8 @@ 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 +#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) @@ -58,36 +58,35 @@ void GUIDelay() { void gui_drawTipTemp(bool symbol) { // Draw tip temp handling unit conversion & tolerance near setpoint uint16_t Temp = 0; - #ifdef ENABLED_FAHRENHEIT_SUPPORT +#ifdef ENABLED_FAHRENHEIT_SUPPORT if (systemSettings.temperatureInF) Temp = TipThermoModel::getTipInF(); else #endif - Temp = TipThermoModel::getTipInC(); + 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 +#ifdef ENABLED_FAHRENHEIT_SUPPORT if (systemSettings.temperatureInF) OLED::drawSymbol(0); else #endif - OLED::drawSymbol(1); + OLED::drawSymbol(1); } else { //Otherwise fall back to chars - #ifdef ENABLED_FAHRENHEIT_SUPPORT +#ifdef ENABLED_FAHRENHEIT_SUPPORT if (systemSettings.temperatureInF) OLED::print(SymbolDegF); else #endif - OLED::print(SymbolDegC); + OLED::print(SymbolDegC); } } } - #ifdef MODEL_TS100 // returns true if undervoltage has occured static bool checkVoltageForExit() { @@ -180,36 +179,48 @@ static void gui_solderingTempAdjust() { // exit return; break; -case BUTTON_B_LONG: + case BUTTON_B_LONG: if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration> PRESS_ACCEL_INTERVAL_MAX) { - if(systemSettings.ReverseButtonTempChangeEnabled) { - systemSettings.SolderingTemp += systemSettings.TempChangeLongStep; - } else systemSettings.SolderingTemp -= systemSettings.TempChangeLongStep; - + 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_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; + 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 + if (systemSettings.ReverseButtonTempChangeEnabled) { + systemSettings.SolderingTemp -= + systemSettings.TempChangeShortStep; // add 10 + } else + systemSettings.SolderingTemp += + systemSettings.TempChangeShortStep; // add 10 break; default: break; @@ -220,7 +231,7 @@ case BUTTON_B_LONG: - PRESS_ACCEL_INTERVAL_MIN; } // constrain between 10-450 C - #ifdef ENABLED_FAHRENHEIT_SUPPORT +#ifdef ENABLED_FAHRENHEIT_SUPPORT if (systemSettings.temperatureInF) { if (systemSettings.SolderingTemp > 850) systemSettings.SolderingTemp = 850; @@ -244,15 +255,18 @@ case BUTTON_B_LONG: #else if (OLED::getRotation()) { #endif - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus:SymbolMinus); - } else { - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus:SymbolPlus); + 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 +#ifdef ENABLED_FAHRENHEIT_SUPPORT if (systemSettings.temperatureInF) OLED::drawSymbol(0); else @@ -266,9 +280,13 @@ case BUTTON_B_LONG: #else if (OLED::getRotation()) { #endif - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus:SymbolPlus); + OLED::print( + systemSettings.ReverseButtonTempChangeEnabled ? + SymbolMinus : SymbolPlus); } else { - OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus:SymbolMinus); + OLED::print( + systemSettings.ReverseButtonTempChangeEnabled ? + SymbolPlus : SymbolMinus); } OLED::refresh(); GUIDelay(); @@ -283,8 +301,8 @@ static int gui_SolderingSleepingMode(bool stayOff) { if (buttons) return 0; if ((xTaskGetTickCount() > 100) - && ((accelInit && (xTaskGetTickCount() - lastMovementTime < 100)) - || (xTaskGetTickCount() - lastButtonTime < 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()) @@ -298,8 +316,11 @@ static int gui_SolderingSleepingMode(bool stayOff) { } else #endif { - currentTempTargetDegC = stayOff ? 0 : min(systemSettings.SleepTemp, - systemSettings.SolderingTemp); + currentTempTargetDegC = + stayOff ? + 0 : + min(systemSettings.SleepTemp, + systemSettings.SolderingTemp); } // draw the lcd uint16_t tipTemp; @@ -656,32 +677,18 @@ void startGUITask(void const *argument __unused) { if (systemSettings.autoStartMode) { // jump directly to the autostart mode - if (systemSettings.autoStartMode == 1) - { + if (systemSettings.autoStartMode == 1) { gui_solderingMode(0); buttonLockout = true; - } - else if (systemSettings.autoStartMode == 2) - { + } else if (systemSettings.autoStartMode == 2) { gui_solderingMode(1); buttonLockout = true; - } - else if (systemSettings.autoStartMode == 3) - { + } 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) { From 1e420c8b01336347ee978f16f6bffe22d83310cc Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 00:25:23 +1000 Subject: [PATCH 18/26] Move Vendor drivers --- .../Vendor}/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h | 0 .../Vendor}/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h | 0 .../Vendor}/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/arm_common_tables.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/arm_const_structs.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/arm_math.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/cmsis_armcc.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/cmsis_armcc_V6.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/cmsis_gcc.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cm0.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cm0plus.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cm3.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cm4.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cm7.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cmFunc.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cmInstr.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_cmSimd.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_sc000.h | 0 .../BSP/Miniware/Vendor}/CMSIS/Include/core_sc300.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h | 0 .../BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h | 0 .../Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h | 0 .../BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c | 0 .../Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c | 0 .../Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c | 0 54 files changed, 0 insertions(+), 0 deletions(-) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/arm_common_tables.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/arm_const_structs.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/arm_math.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/cmsis_armcc.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/cmsis_armcc_V6.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/cmsis_gcc.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cm0.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cm0plus.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cm3.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cm4.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cm7.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cmFunc.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cmInstr.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_cmSimd.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_sc000.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/CMSIS/Include/core_sc300.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c (100%) rename workspace/TS100/{Drivers => Core/BSP/Miniware/Vendor}/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c (100%) 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/arm_common_tables.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/arm_const_structs.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/arm_math.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/cmsis_armcc.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/cmsis_armcc_V6.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/cmsis_gcc.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cm0.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cm0plus.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cm3.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cm4.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cm7.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cmFunc.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cmInstr.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_cmSimd.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_sc000.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/CMSIS/Include/core_sc300.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_i2c.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c rename to 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 similarity index 100% rename from workspace/TS100/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c rename to workspace/TS100/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c From 5ca0d6e670569b0610b206fdb05a41b878204d4f Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 00:29:18 +1000 Subject: [PATCH 19/26] Update Translation.h --- workspace/TS100/Core/Inc/Translation.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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, }; From a7a97e604f79fde7eb4fab78c9afc31f511826c9 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 00:29:44 +1000 Subject: [PATCH 20/26] Update Makefile --- workspace/TS100/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspace/TS100/Makefile b/workspace/TS100/Makefile index 13ae0a6d..3b38d4ac 100644 --- a/workspace/TS100/Makefile +++ b/workspace/TS100/Makefile @@ -14,10 +14,10 @@ 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 +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 From 341d7b1d5a98af8fc71970f10ad1c92ce7af7b60 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 11:39:28 +1000 Subject: [PATCH 21/26] Pin ubuntu version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e9e9b6ae..8e07117d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:rolling +FROM ubuntu:20.04 LABEL maintainer="Ben V. Brown " WORKDIR /build From e422fe28ae45dfca3bf4b443f0ec4ad6de5f62a1 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 11:39:58 +1000 Subject: [PATCH 22/26] Enable -werror & wrap malloc Preventing accidental use of dynamic memory --- workspace/TS100/Makefile | 6 ++- workspace/TS100/build.sh | 105 +++++++++++++++++---------------------- 2 files changed, 49 insertions(+), 62 deletions(-) diff --git a/workspace/TS100/Makefile b/workspace/TS100/Makefile index 3b38d4ac..a9868318 100644 --- a/workspace/TS100/Makefile +++ b/workspace/TS100/Makefile @@ -66,7 +66,6 @@ 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 @@ -84,6 +83,8 @@ 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 \ @@ -128,7 +129,8 @@ CHECKOPTIONS= -Wall \ -Winline \ -Wshadow \ -Wno-unused-parameter \ - -Wdouble-promotion + -Wdouble-promotion \ + -Werror CHECKOPTIONS_C= -Wbad-function-cast 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 ] [-m ] [-h] +usage() { + echo "Usage : $(basename "$0") [-l ] [-m ] [-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)" From 2bcebd473e9bdd383d708f3ffd7efb82714612af Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 11:46:13 +1000 Subject: [PATCH 23/26] Cleanup QC Names --- workspace/TS100/Core/BSP/BSP_QC.h | 32 +-- workspace/TS100/Core/BSP/Miniware/QC_GPIO.c | 89 ++++--- workspace/TS100/Core/Src/QC3.c | 244 ++++++++++---------- 3 files changed, 177 insertions(+), 188 deletions(-) diff --git a/workspace/TS100/Core/BSP/BSP_QC.h b/workspace/TS100/Core/BSP/BSP_QC.h index 5ad58376..b7aa0fc2 100644 --- a/workspace/TS100/Core/BSP/BSP_QC.h +++ b/workspace/TS100/Core/BSP/BSP_QC.h @@ -7,30 +7,30 @@ #ifndef BSP_BSP_QC_H_ #define BSP_BSP_QC_H_ - +#include "stdint.h" #ifdef __cplusplus extern "C" { #endif -//Init GPIO for QC neg +// Init GPIO for QC neg void QC_Init_GPIO(); -//Set the DP pin to 0.6V -void DPlusZero_Six(); -//Set the DM pin to 0.6V -void DNegZero_Six(); -//Set the DP pin to 3.3V -void DPlusThree_Three(); -//Set the DM pin to 3.3V -void DNegThree_Three(); -//Turn on weak pulldown on the DM pin -//This is used as a helper for some power banks +// 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 +// Turn off the pulldown void QC_DM_No_PullDown(); -//Turn on output drivers that were initally disabled to prevent spike through QC disable mode +// 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 +// Check if DM was pulled down +// 1=Pulled down, 0 == pulled high uint8_t QC_DM_PulledDown(); #ifdef __cplusplus } diff --git a/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c index 9b082788..d6b98077 100644 --- a/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c +++ b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c @@ -7,62 +7,59 @@ #include "BSP.h" #include "Pins.h" #include "stm32f1xx_hal.h" -void DPlusZero_Six() { - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // pull down D+ +void QC_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 QC_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 QC_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_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); + 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); - + 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); + // 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); + 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; -} +uint8_t QC_DM_PulledDown() { return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET ? 1 : 0; } diff --git a/workspace/TS100/Core/Src/QC3.c b/workspace/TS100/Core/Src/QC3.c index bb773e1b..43cff776 100644 --- a/workspace/TS100/Core/Src/QC3.c +++ b/workspace/TS100/Core/Src/QC3.c @@ -5,161 +5,153 @@ * Author: Ralim */ -//Quick charge 3.0 supporting functions +// Quick charge 3.0 supporting functions #include "QC3.h" -#include "stdint.h" + #include "BSP.h" #include "cmsis_os.h" +#include "stdint.h" void QC_Seek9V() { - DNegZero_Six(); - DPlusThree_Three(); + QC_DNegZero_Six(); + QC_DPlusThree_Three(); } void QC_Seek12V() { - DNegZero_Six(); - DPlusZero_Six(); + QC_DNegZero_Six(); + QC_DPlusZero_Six(); } void QC_Seek20V() { - DNegThree_Three(); - DPlusThree_Three(); + QC_DNegThree_Three(); + QC_DPlusThree_Three(); } void QC_SeekContMode() { - DNegThree_Three(); - DPlusZero_Six(); + QC_DNegThree_Three(); + QC_DPlusZero_Six(); } void QC_SeekContPlus() { - QC_SeekContMode(); - vTaskDelay(3); - QC_Seek20V(); - vTaskDelay(1); - QC_SeekContMode(); + QC_SeekContMode(); + vTaskDelay(3); + QC_Seek20V(); + vTaskDelay(1); + QC_SeekContMode(); } void QC_SeekContNeg() { - QC_SeekContMode(); - vTaskDelay(3); - QC_Seek12V(); - vTaskDelay(1); - QC_SeekContMode(); + 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 (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 + 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; + // 1. Measure current voltage + int16_t vStart = getInputVoltageX10(divisor, 1); + int difference = Vx10 - vStart; - // 2. calculate ideal steps (0.2V changes) + // 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); - } + 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(); + // 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(); - } - } + } 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(); + // 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- - DPlusZero_Six(); + // 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; + // 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; } - From 5bb85a4a325547cc5c1c884178759cd2e07a788e Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 12:05:11 +1000 Subject: [PATCH 24/26] Pull out more QC hooks --- workspace/TS100/Core/BSP/BSP.h | 26 +- workspace/TS100/Core/BSP/BSP_QC.h | 3 + .../BSP/Miniware/{QC_GPIO.c => QC_GPIO.cpp} | 9 + .../TS100/Core/BSP/Miniware/postRTOS.cpp | 23 + workspace/TS100/Core/Threads/GUIThread.cpp | 1302 ++++++++--------- workspace/TS100/Core/Threads/MOVThread.cpp | 158 +- 6 files changed, 739 insertions(+), 782 deletions(-) rename workspace/TS100/Core/BSP/Miniware/{QC_GPIO.c => QC_GPIO.cpp} (88%) create mode 100644 workspace/TS100/Core/BSP/Miniware/postRTOS.cpp diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index e9e96d25..cbf28ceb 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -1,8 +1,8 @@ -#include "Defines.h" -#include "stdint.h" -#include "UnitSettings.h" -#include "BSP_QC.h" #include "BSP_Flash.h" +#include "BSP_QC.h" +#include "Defines.h" +#include "UnitSettings.h" +#include "stdint.h" /* * BSP.h -- Board Support * @@ -15,20 +15,20 @@ extern "C" { #endif -//Called first thing in main() to init the hardware +// Called first thing in main() to init the hardware void preRToSInit(); -//Called once the RToS has started for any extra work +// 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 +// 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 +// Returns the Handle temp in C, X10 uint16_t getHandleTemperature(); -//Returns the Tip temperature ADC reading in raw units +// 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 +// 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 @@ -40,11 +40,11 @@ uint8_t getButtonB(); // 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 +// 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 +// 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); diff --git a/workspace/TS100/Core/BSP/BSP_QC.h b/workspace/TS100/Core/BSP/BSP_QC.h index b7aa0fc2..d1536a09 100644 --- a/workspace/TS100/Core/BSP/BSP_QC.h +++ b/workspace/TS100/Core/BSP/BSP_QC.h @@ -32,6 +32,9 @@ 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 diff --git a/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp similarity index 88% rename from workspace/TS100/Core/BSP/Miniware/QC_GPIO.c rename to workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp index d6b98077..bd3841c3 100644 --- a/workspace/TS100/Core/BSP/Miniware/QC_GPIO.c +++ b/workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp @@ -6,6 +6,8 @@ */ #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+ @@ -63,3 +65,10 @@ void QC_Post_Probe_En() { } 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/postRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp new file mode 100644 index 00000000..005b930a --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp @@ -0,0 +1,23 @@ +#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() { +#ifdef MODEL_TS80 + startQC(systemSettings.voltageDiv); + while (pidTaskNotification == 0) osDelay(30); // Wait for PID to start + + seekQC((systemSettings.cutoutSetting) ? 120 : 90, + systemSettings.voltageDiv); // this will move the QC output to the preferred voltage to start with + +#else + while (pidTaskNotification == 0) osDelay(30); // Wait for PID to start + osDelay(200); // wait for accelerometer to stabilize +#endif +} diff --git a/workspace/TS100/Core/Threads/GUIThread.cpp b/workspace/TS100/Core/Threads/GUIThread.cpp index 3724b76a..668b60b7 100644 --- a/workspace/TS100/Core/Threads/GUIThread.cpp +++ b/workspace/TS100/Core/Threads/GUIThread.cpp @@ -9,19 +9,20 @@ extern "C" { } #include #include -#include -#include "LIS2DH12.hpp" #include +#include #include + +#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 "TipThermoModel.h" #include "unit.h" -#include "../../configuration.h" -#include "Buttons.hpp" extern uint8_t PCBVersion; // File local variables extern uint32_t currentTempTargetDegC; @@ -32,785 +33,724 @@ 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) +#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; + 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); + 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); + // 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; + // 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(); + 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 + 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 + 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); - } - } + 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); + 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); + // 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); - } + } else { + OLED::setFont(0); + OLED::print(UVLOWarningString); + } - OLED::refresh(); - currentTempTargetDegC = 0; - waitForButtonPress(); - return true; - } - } - return false; + 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 + 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); - } + // 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; + 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 + 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 (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 + if (xTaskGetTickCount() - lastChange > 200) return; // exit if user just doesn't press anything for a bit #ifdef MODEL_TS80 - if (!OLED::getRotation()) { + if (!OLED::getRotation()) { #else - if (OLED::getRotation()) { + if (OLED::getRotation()) { #endif - OLED::print( - systemSettings.ReverseButtonTempChangeEnabled ? - SymbolPlus : SymbolMinus); - } else { - OLED::print( - systemSettings.ReverseButtonTempChangeEnabled ? - SymbolMinus : SymbolPlus); - } + OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus : SymbolMinus); + } else { + OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus : SymbolPlus); + } - OLED::print(SymbolSpace); - OLED::printNumber(systemSettings.SolderingTemp, 3); + 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()) { + if (systemSettings.temperatureInF) + OLED::drawSymbol(0); + else #endif - OLED::print( - systemSettings.ReverseButtonTempChangeEnabled ? - SymbolMinus : SymbolPlus); - } else { - OLED::print( - systemSettings.ReverseButtonTempChangeEnabled ? - SymbolPlus : SymbolMinus); - } - OLED::refresh(); - GUIDelay(); - } + { + 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 + // 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 + 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 + 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 + 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; + { + 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 + if (systemSettings.temperatureInF) + tipTemp = TipThermoModel::getTipInF(); + else #endif - { - tipTemp = TipThermoModel::getTipInC(); - } + { + 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); + 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 + if (systemSettings.temperatureInF) + OLED::print(SymbolDegF); + else #endif - { - OLED::print(SymbolDegC); - } + { + OLED::print(SymbolDegC); + } - OLED::print(SymbolSpace); - printVoltage(); - OLED::print(SymbolVolts); - } else { - OLED::setFont(0); - OLED::print(SleepingSimpleString); - OLED::printNumber(tipTemp, 3); + 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 + 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; + { + 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); - } + /* + * 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; + /* + * * 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 (;;) { + 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); - 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); + } - 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 - 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 - 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); - // 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 - // 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 - OLED::print(SymbolSpace); // Space out gap between battery <-> temp + gui_drawBatteryIcon(); + } + } + OLED::refresh(); - gui_drawBatteryIcon(); - } - } - OLED::refresh(); - - // Update the setpoints for the temperature - if (boostModeOn) { + // Update the setpoints for the temperature + if (boostModeOn) { #ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - currentTempTargetDegC = TipThermoModel::convertFtoC( - systemSettings.BoostTemp); - else + if (systemSettings.temperatureInF) + currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.BoostTemp); + else #endif - { - currentTempTargetDegC = (systemSettings.BoostTemp); - } - } else { + { + currentTempTargetDegC = (systemSettings.BoostTemp); + } + } else { #ifdef ENABLED_FAHRENHEIT_SUPPORT - if (systemSettings.temperatureInF) - currentTempTargetDegC = TipThermoModel::convertFtoC( - systemSettings.SolderingTemp); - else + if (systemSettings.temperatureInF) + currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.SolderingTemp); + else #endif - { - currentTempTargetDegC = (systemSettings.SolderingTemp); - } - } + { + currentTempTargetDegC = (systemSettings.SolderingTemp); + } + } #ifdef MODEL_TS100 - // Undervoltage test - if (checkVoltageForExit()) { - lastButtonTime = xTaskGetTickCount(); - return; - } + // 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 - }*/ + // 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(); - } + 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; - } + 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(); - } + 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(); - } + 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 (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; + } + } - 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; - 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; - 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; + } - 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(); - 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); - // 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); + } - 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); - // 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(); - OLED::print(InputVoltageString); - printVoltage(); - - } else { - OLED::setFont(0); + } else { + OLED::setFont(0); #ifdef MODEL_TS80 - if (!OLED::getRotation()) { + if (!OLED::getRotation()) { #else - if (OLED::getRotation()) { + 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 + 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()) { + if (!OLED::getRotation()) { #else - if (OLED::getRotation()) { + 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); + // 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(); - } + } 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 index f2d3dd82..08fc89cd 100644 --- a/workspace/TS100/Core/Threads/MOVThread.cpp +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -5,105 +5,87 @@ * Author: Ralim */ -#include "main.hpp" #include "BSP.h" -#include "power.hpp" -#include "history.hpp" +#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 "FreeRTOS.h" -#include "task.h" -#include "Settings.h" -#include "I2C_Wrapper.hpp" +#include "history.hpp" +#include "main.hpp" +#include "power.hpp" #include "stdlib.h" -#include "LIS2DH12.hpp" -#include -#include "QC3.h" +#include "task.h" #define MOVFilter 8 uint8_t accelInit = 0; uint32_t lastMovementTime = 0; void startMOVTask(void const *argument __unused) { - OLED::setRotation(true); + OLED::setRotation(true); + postRToSInit(); -#ifdef MODEL_TS80 - startQC(systemSettings.voltageDiv); - while (pidTaskNotification == 0) - osDelay(30); // To ensure we return after idealQCVoltage/tip resistance + 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 - seekQC((systemSettings.cutoutSetting) ? 120 : 90, - systemSettings.voltageDiv); // this will move the QC output to the preferred voltage to start with + 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; -#else - osDelay(250); // wait for accelerometer to stabilize -#endif + // 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 - 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 error has occurred then we update the tick timer + if (error > threshold) { + lastMovementTime = xTaskGetTickCount(); + } - 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 - } + osDelay(100); // Slow down update rate + QC_resync(); + } } From 05b43dfa1ce5769b6ef42e02e9d37b852dd8776c Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 12:43:32 +1000 Subject: [PATCH 25/26] Clean up power calls --- workspace/TS100/Core/BSP/BSP.h | 1 + workspace/TS100/Core/BSP/BSP_Power.h | 27 +++++++++++++++++++ workspace/TS100/Core/BSP/Miniware/Power.cpp | 20 ++++++++++++++ .../TS100/Core/BSP/Miniware/postRTOS.cpp | 12 +-------- workspace/TS100/Core/Threads/MOVThread.cpp | 4 ++- 5 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 workspace/TS100/Core/BSP/BSP_Power.h create mode 100644 workspace/TS100/Core/BSP/Miniware/Power.cpp diff --git a/workspace/TS100/Core/BSP/BSP.h b/workspace/TS100/Core/BSP/BSP.h index cbf28ceb..a558baad 100644 --- a/workspace/TS100/Core/BSP/BSP.h +++ b/workspace/TS100/Core/BSP/BSP.h @@ -1,4 +1,5 @@ #include "BSP_Flash.h" +#include "BSP_Power.h" #include "BSP_QC.h" #include "Defines.h" #include "UnitSettings.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/Miniware/Power.cpp b/workspace/TS100/Core/BSP/Miniware/Power.cpp new file mode 100644 index 00000000..9abe8008 --- /dev/null +++ b/workspace/TS100/Core/BSP/Miniware/Power.cpp @@ -0,0 +1,20 @@ +#include "BSP.h" +#include "BSP_Power.h" +#include "QC3.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/postRTOS.cpp b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp index 005b930a..0c262a95 100644 --- a/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp +++ b/workspace/TS100/Core/BSP/Miniware/postRTOS.cpp @@ -9,15 +9,5 @@ #include "task.h" void postRToSInit() { -#ifdef MODEL_TS80 - startQC(systemSettings.voltageDiv); - while (pidTaskNotification == 0) osDelay(30); // Wait for PID to start - - seekQC((systemSettings.cutoutSetting) ? 120 : 90, - systemSettings.voltageDiv); // this will move the QC output to the preferred voltage to start with - -#else - while (pidTaskNotification == 0) osDelay(30); // Wait for PID to start - osDelay(200); // wait for accelerometer to stabilize -#endif + // Any after RTos setup } diff --git a/workspace/TS100/Core/Threads/MOVThread.cpp b/workspace/TS100/Core/Threads/MOVThread.cpp index 08fc89cd..e88cefce 100644 --- a/workspace/TS100/Core/Threads/MOVThread.cpp +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -25,6 +25,8 @@ 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; @@ -86,6 +88,6 @@ void startMOVTask(void const *argument __unused) { } osDelay(100); // Slow down update rate - QC_resync(); + power_check(); } } From 7cff1cdf3bea0e443bd75bd78cef6574194cb3f9 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 30 May 2020 12:43:49 +1000 Subject: [PATCH 26/26] Update Power.cpp --- workspace/TS100/Core/BSP/Miniware/Power.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/workspace/TS100/Core/BSP/Miniware/Power.cpp b/workspace/TS100/Core/BSP/Miniware/Power.cpp index 9abe8008..30386c83 100644 --- a/workspace/TS100/Core/BSP/Miniware/Power.cpp +++ b/workspace/TS100/Core/BSP/Miniware/Power.cpp @@ -1,6 +1,7 @@ #include "BSP.h" #include "BSP_Power.h" #include "QC3.h" +#include "Settings.h" void power_probe() { // If TS80 probe for QC // If TS100 - noop