From a659b0e3f69313d53d2d001f1c1004fd84c055e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 23 Oct 2022 19:15:14 +0200 Subject: [PATCH 1/8] Implement new hardware abstraction from InfiniTime using C++20 concepts. --- CMakeLists.txt | 22 +- littlefs-do-main.cpp | 2 +- main.cpp | 37 +-- sim/components/ble/NimbleController.h | 4 - sim/drivers/SpiMaster.cpp | 296 -------------------- sim/drivers/SpiMaster.h | 65 ----- sim/drivers/SpiNorFlash.h | 66 ----- sim/drivers/infinisim/Spi.cpp | 32 +++ sim/drivers/infinisim/Spi.h | 30 ++ sim/drivers/infinisim/SpiMaster.h | 45 +++ sim/drivers/{ => infinisim}/SpiNorFlash.cpp | 12 +- sim/drivers/infinisim/SpiNorFlash.h | 66 +++++ sim/port/infinitime.h | 18 ++ 13 files changed, 228 insertions(+), 467 deletions(-) delete mode 100644 sim/drivers/SpiMaster.cpp delete mode 100644 sim/drivers/SpiMaster.h delete mode 100644 sim/drivers/SpiNorFlash.h create mode 100644 sim/drivers/infinisim/Spi.cpp create mode 100644 sim/drivers/infinisim/Spi.h create mode 100644 sim/drivers/infinisim/SpiMaster.h rename sim/drivers/{ => infinisim}/SpiNorFlash.cpp (90%) create mode 100644 sim/drivers/infinisim/SpiNorFlash.h create mode 100644 sim/port/infinitime.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 24c6c33..b46639a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ project(InfiniSim VERSION ${PROJECT_VERSION} LANGUAGES C CXX) # https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html string(COMPARE EQUAL "${CMAKE_CXX_STANDARD}" "" no_cmake_cxx_standard_set) if(no_cmake_cxx_standard_set) - set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) message(STATUS "Using default C++ standard ${CMAKE_CXX_STANDARD}") @@ -142,12 +142,13 @@ target_sources(infinisim PUBLIC sim/drivers/Cst816s.cpp sim/drivers/Hrs3300.h sim/drivers/Hrs3300.cpp - sim/drivers/SpiMaster.h - sim/drivers/SpiMaster.cpp + sim/drivers/infinisim/SpiMaster.h + sim/drivers/infinisim/Spi.h + sim/drivers/infinisim/Spi.cpp sim/drivers/TwiMaster.h sim/drivers/TwiMaster.cpp - sim/drivers/SpiNorFlash.h - sim/drivers/SpiNorFlash.cpp + sim/drivers/infinisim/SpiNorFlash.h + sim/drivers/infinisim/SpiNorFlash.cpp sim/heartratetask/HeartRateTask.h sim/heartratetask/HeartRateTask.cpp ) @@ -214,7 +215,6 @@ target_sources(infinisim PUBLIC ${InfiniTime_DIR}/src/components/timer/TimerController.cpp ${InfiniTime_DIR}/src/drivers/PinMap.h ${InfiniTime_DIR}/src/drivers/Spi.h - ${InfiniTime_DIR}/src/drivers/Spi.cpp ${InfiniTime_DIR}/src/drivers/St7789.h ${InfiniTime_DIR}/src/drivers/St7789.cpp ${InfiniTime_DIR}/src/touchhandler/TouchHandler.h @@ -335,13 +335,13 @@ add_executable(littlefs-do ${InfiniTime_DIR}/src/components/fs/FS.h ${InfiniTime_DIR}/src/components/fs/FS.cpp # dependencies for FS.h - sim/drivers/SpiNorFlash.h - sim/drivers/SpiNorFlash.cpp + sim/drivers/infinisim/SpiNorFlash.h + sim/drivers/infinisim/SpiNorFlash.cpp # dependencies for SpiNorFlash.h ${InfiniTime_DIR}/src/drivers/Spi.h - ${InfiniTime_DIR}/src/drivers/Spi.cpp - sim/drivers/SpiMaster.h - sim/drivers/SpiMaster.cpp + sim/drivers/infinisim/SpiMaster.h + sim/drivers/infinisim/Spi.h + sim/drivers/infinisim/Spi.cpp ${InfiniTime_DIR}/src/components/settings/Settings.h ${InfiniTime_DIR}/src/components/settings/Settings.cpp diff --git a/littlefs-do-main.cpp b/littlefs-do-main.cpp index 780e561..40e278b 100644 --- a/littlefs-do-main.cpp +++ b/littlefs-do-main.cpp @@ -22,7 +22,7 @@ #include "components/fs/FS.h" #include "components/settings/Settings.h" -#include "drivers/SpiNorFlash.h" +#include "drivers/infinisim/SpiNorFlash.h" #include "nlohmann/json.hpp" #include "miniz.h" diff --git a/main.cpp b/main.cpp index ce04fdd..f886c71 100644 --- a/main.cpp +++ b/main.cpp @@ -30,25 +30,24 @@ #include #include "BootloaderVersion.h" +#include "buttonhandler/ButtonHandler.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" #include "components/brightness/BrightnessController.h" -#include "components/motor/MotorController.h" #include "components/datetime/DateTimeController.h" -#include "components/heartrate/HeartRateController.h" #include "components/fs/FS.h" +#include "components/heartrate/HeartRateController.h" +#include "components/motor/MotorController.h" +#include "drivers/Cst816s.h" +#include "drivers/PinMap.h" #include "drivers/Spi.h" -#include "drivers/SpiMaster.h" -#include "drivers/SpiNorFlash.h" #include "drivers/St7789.h" #include "drivers/TwiMaster.h" -#include "drivers/Cst816s.h" -#include "drivers/PinMap.h" +#include "sim/drivers/infinisim/SpiMaster.h" +#include "sim/drivers/infinisim/SpiNorFlash.h" #include "systemtask/SystemTask.h" -#include "drivers/PinMap.h" #include "touchhandler/TouchHandler.h" -#include "buttonhandler/ButtonHandler.h" // get the simulator-headers #include "displayapp/DisplayApp.h" @@ -70,6 +69,8 @@ #endif #include +#include "port/infinitime.h" + /********************* * DEFINES *********************/ @@ -290,19 +291,19 @@ static constexpr uint8_t touchPanelTwiAddress = 0x15; static constexpr uint8_t motionSensorTwiAddress = 0x18; static constexpr uint8_t heartRateSensorTwiAddress = 0x44; -Pinetime::Drivers::SpiMaster spi {Pinetime::Drivers::SpiMaster::SpiModule::SPI0, - {Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb, - Pinetime::Drivers::SpiMaster::Modes::Mode3, - Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz, - Pinetime::PinMap::SpiSck, - Pinetime::PinMap::SpiMosi, - Pinetime::PinMap::SpiMiso}}; +Pinetime::Drivers::Infinisim::SpiMaster spiImpl {}; +Pinetime::Drivers::SpiMaster spi {spiImpl}; + -Pinetime::Drivers::Spi lcdSpi {spi, Pinetime::PinMap::SpiLcdCsn}; +Pinetime::Drivers::Infinisim::Spi lcdSpiImpl {spiImpl, Pinetime::PinMap::SpiLcdCsn}; +Pinetime::Drivers::Spi lcdSpi {lcdSpiImpl}; Pinetime::Drivers::St7789 lcd {lcdSpi, Pinetime::PinMap::LcdDataCommand}; -Pinetime::Drivers::Spi flashSpi {spi, Pinetime::PinMap::SpiFlashCsn}; -Pinetime::Drivers::SpiNorFlash spiNorFlash {"spiNorFlash.raw"}; +Pinetime::Drivers::Infinisim::Spi flashSpiImpl {spiImpl, Pinetime::PinMap::SpiFlashCsn}; +Pinetime::Drivers::Spi flashSpi {flashSpiImpl}; + +Pinetime::Drivers::Infinisim::SpiNorFlash spiNorFlashImpl {"spiNorFlash.raw"}; +Pinetime::Drivers::SpiNorFlash spiNorFlash {spiNorFlashImpl}; // The TWI device should work @ up to 400Khz but there is a HW bug which prevent it from // respecting correct timings. According to erratas heet, this magic value makes it run diff --git a/sim/components/ble/NimbleController.h b/sim/components/ble/NimbleController.h index ce7e8d7..9721881 100644 --- a/sim/components/ble/NimbleController.h +++ b/sim/components/ble/NimbleController.h @@ -25,10 +25,6 @@ //#include "components/ble/FSService.h" namespace Pinetime { - namespace Drivers { - class SpiNorFlash; - } - namespace System { class SystemTask; } diff --git a/sim/drivers/SpiMaster.cpp b/sim/drivers/SpiMaster.cpp deleted file mode 100644 index 92e7ab2..0000000 --- a/sim/drivers/SpiMaster.cpp +++ /dev/null @@ -1,296 +0,0 @@ -#include "drivers/SpiMaster.h" -//#include -//#include -#include -#include - -using namespace Pinetime::Drivers; - -SpiMaster::SpiMaster(const SpiMaster::SpiModule spi, const SpiMaster::Parameters& params) : spi {spi}, params {params} { -} - -bool SpiMaster::Init() { -// if(mutex == nullptr) { -// mutex = xSemaphoreCreateBinary(); -// ASSERT(mutex != nullptr); -// } -// -// /* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI0 */ -// nrf_gpio_pin_set(params.pinSCK); -// nrf_gpio_cfg_output(params.pinSCK); -// nrf_gpio_pin_clear(params.pinMOSI); -// nrf_gpio_cfg_output(params.pinMOSI); -// nrf_gpio_cfg_input(params.pinMISO, NRF_GPIO_PIN_NOPULL); -// // nrf_gpio_cfg_output(params.pinCSN); -// // pinCsn = params.pinCSN; -// -// switch (spi) { -// case SpiModule::SPI0: -// spiBaseAddress = NRF_SPIM0; -// break; -// case SpiModule::SPI1: -// spiBaseAddress = NRF_SPIM1; -// break; -// default: -// return false; -// } -// -// /* Configure pins, frequency and mode */ -// spiBaseAddress->PSELSCK = params.pinSCK; -// spiBaseAddress->PSELMOSI = params.pinMOSI; -// spiBaseAddress->PSELMISO = params.pinMISO; -// -// uint32_t frequency; -// switch (params.Frequency) { -// case Frequencies::Freq8Mhz: -// frequency = 0x80000000; -// break; -// default: -// return false; -// } -// spiBaseAddress->FREQUENCY = frequency; -// -// uint32_t regConfig = 0; -// switch (params.bitOrder) { -// case BitOrder::Msb_Lsb: -// break; -// case BitOrder::Lsb_Msb: -// regConfig = 1; -// break; -// default: -// return false; -// } -// switch (params.mode) { -// case Modes::Mode0: -// break; -// case Modes::Mode1: -// regConfig |= (0x01 << 1); -// break; -// case Modes::Mode2: -// regConfig |= (0x02 << 1); -// break; -// case Modes::Mode3: -// regConfig |= (0x03 << 1); -// break; -// default: -// return false; -// } -// -// spiBaseAddress->CONFIG = regConfig; -// spiBaseAddress->EVENTS_ENDRX = 0; -// spiBaseAddress->EVENTS_ENDTX = 0; -// spiBaseAddress->EVENTS_END = 0; -// -// spiBaseAddress->INTENSET = ((unsigned) 1 << (unsigned) 6); -// spiBaseAddress->INTENSET = ((unsigned) 1 << (unsigned) 1); -// spiBaseAddress->INTENSET = ((unsigned) 1 << (unsigned) 19); -// -// spiBaseAddress->ENABLE = (SPIM_ENABLE_ENABLE_Enabled << SPIM_ENABLE_ENABLE_Pos); -// -// NRFX_IRQ_PRIORITY_SET(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, 2); -// NRFX_IRQ_ENABLE(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn); -// -// xSemaphoreGive(mutex); - return true; -} - -//void SpiMaster::SetupWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel) { -// // Create an event when SCK toggles. -// NRF_GPIOTE->CONFIG[gpiote_channel] = (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos) | (spim->PSEL.SCK << GPIOTE_CONFIG_PSEL_Pos) | -// (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos); -// -// // Stop the spim instance when SCK toggles. -// NRF_PPI->CH[ppi_channel].EEP = (uint32_t) &NRF_GPIOTE->EVENTS_IN[gpiote_channel]; -// NRF_PPI->CH[ppi_channel].TEP = (uint32_t) &spim->TASKS_STOP; -// NRF_PPI->CHENSET = 1U << ppi_channel; -// spiBaseAddress->EVENTS_END = 0; -// -// // Disable IRQ -// spim->INTENCLR = (1 << 6); -// spim->INTENCLR = (1 << 1); -// spim->INTENCLR = (1 << 19); -//} - -//void SpiMaster::DisableWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel) { -// NRF_GPIOTE->CONFIG[gpiote_channel] = 0; -// NRF_PPI->CH[ppi_channel].EEP = 0; -// NRF_PPI->CH[ppi_channel].TEP = 0; -// NRF_PPI->CHENSET = ppi_channel; -// spiBaseAddress->EVENTS_END = 0; -// spim->INTENSET = (1 << 6); -// spim->INTENSET = (1 << 1); -// spim->INTENSET = (1 << 19); -//} - -void SpiMaster::OnEndEvent() { - if (currentBufferAddr == 0) { - return; - } - -// auto s = currentBufferSize; -// if (s > 0) { -// auto currentSize = std::min((size_t) 255, s); -// PrepareTx(currentBufferAddr, currentSize); -// currentBufferAddr += currentSize; -// currentBufferSize -= currentSize; -// -// spiBaseAddress->TASKS_START = 1; -// } else { -// BaseType_t xHigherPriorityTaskWoken = pdFALSE; -// if (taskToNotify != nullptr) { -// vTaskNotifyGiveFromISR(taskToNotify, &xHigherPriorityTaskWoken); -// portYIELD_FROM_ISR(xHigherPriorityTaskWoken); -// } -// -// nrf_gpio_pin_set(this->pinCsn); -// currentBufferAddr = 0; -// BaseType_t xHigherPriorityTaskWoken2 = pdFALSE; -// xSemaphoreGiveFromISR(mutex, &xHigherPriorityTaskWoken2); -// portYIELD_FROM_ISR(xHigherPriorityTaskWoken | xHigherPriorityTaskWoken2); -// } -} - -void SpiMaster::OnStartedEvent() { -} - -//void SpiMaster::PrepareTx(const volatile uint32_t bufferAddress, const volatile size_t size) { -// spiBaseAddress->TXD.PTR = bufferAddress; -// spiBaseAddress->TXD.MAXCNT = size; -// spiBaseAddress->TXD.LIST = 0; -// spiBaseAddress->RXD.PTR = 0; -// spiBaseAddress->RXD.MAXCNT = 0; -// spiBaseAddress->RXD.LIST = 0; -// spiBaseAddress->EVENTS_END = 0; -//} - -//void SpiMaster::PrepareRx(const volatile uint32_t cmdAddress, -// const volatile size_t cmdSize, -// const volatile uint32_t bufferAddress, -// const volatile size_t size) { -// spiBaseAddress->TXD.PTR = 0; -// spiBaseAddress->TXD.MAXCNT = 0; -// spiBaseAddress->TXD.LIST = 0; -// spiBaseAddress->RXD.PTR = bufferAddress; -// spiBaseAddress->RXD.MAXCNT = size; -// spiBaseAddress->RXD.LIST = 0; -// spiBaseAddress->EVENTS_END = 0; -//} - -bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) { -// if (data == nullptr) -// return false; -// auto ok = xSemaphoreTake(mutex, portMAX_DELAY); -// ASSERT(ok == true); -// taskToNotify = xTaskGetCurrentTaskHandle(); -// -// this->pinCsn = pinCsn; -// -// if (size == 1) { -// SetupWorkaroundForFtpan58(spiBaseAddress, 0, 0); -// } else { -// DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0); -// } -// -// nrf_gpio_pin_clear(this->pinCsn); -// -// currentBufferAddr = (uint32_t) data; -// currentBufferSize = size; -// -// auto currentSize = std::min((size_t) 255, (size_t) currentBufferSize); -// PrepareTx(currentBufferAddr, currentSize); -// currentBufferSize -= currentSize; -// currentBufferAddr += currentSize; -// spiBaseAddress->TASKS_START = 1; -// -// if (size == 1) { -// while (spiBaseAddress->EVENTS_END == 0) -// ; -// nrf_gpio_pin_set(this->pinCsn); -// currentBufferAddr = 0; -// xSemaphoreGive(mutex); -// } - - return true; -} - -bool SpiMaster::Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize) { -// xSemaphoreTake(mutex, portMAX_DELAY); -// -// taskToNotify = nullptr; -// -// this->pinCsn = pinCsn; -// DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0); -// spiBaseAddress->INTENCLR = (1 << 6); -// spiBaseAddress->INTENCLR = (1 << 1); -// spiBaseAddress->INTENCLR = (1 << 19); -// -// nrf_gpio_pin_clear(this->pinCsn); -// -// currentBufferAddr = 0; -// currentBufferSize = 0; -// -// PrepareTx((uint32_t) cmd, cmdSize); -// spiBaseAddress->TASKS_START = 1; -// while (spiBaseAddress->EVENTS_END == 0) -// ; -// -// PrepareRx((uint32_t) cmd, cmdSize, (uint32_t) data, dataSize); -// spiBaseAddress->TASKS_START = 1; -// -// while (spiBaseAddress->EVENTS_END == 0) -// ; -// nrf_gpio_pin_set(this->pinCsn); -// -// xSemaphoreGive(mutex); - - return true; -} - -void SpiMaster::Sleep() { -// while (spiBaseAddress->ENABLE != 0) { -// spiBaseAddress->ENABLE = (SPIM_ENABLE_ENABLE_Disabled << SPIM_ENABLE_ENABLE_Pos); -// } -// nrf_gpio_cfg_default(params.pinSCK); -// nrf_gpio_cfg_default(params.pinMOSI); -// nrf_gpio_cfg_default(params.pinMISO); - - NRF_LOG_INFO("[SPIMASTER] sleep"); -} - -void SpiMaster::Wakeup() { - Init(); - NRF_LOG_INFO("[SPIMASTER] Wakeup"); -} - -bool SpiMaster::WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize) { -// xSemaphoreTake(mutex, portMAX_DELAY); -// -// taskToNotify = nullptr; -// -// this->pinCsn = pinCsn; -// DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0); -// spiBaseAddress->INTENCLR = (1 << 6); -// spiBaseAddress->INTENCLR = (1 << 1); -// spiBaseAddress->INTENCLR = (1 << 19); -// -// nrf_gpio_pin_clear(this->pinCsn); -// -// currentBufferAddr = 0; -// currentBufferSize = 0; -// -// PrepareTx((uint32_t) cmd, cmdSize); -// spiBaseAddress->TASKS_START = 1; -// while (spiBaseAddress->EVENTS_END == 0) -// ; -// -// PrepareTx((uint32_t) data, dataSize); -// spiBaseAddress->TASKS_START = 1; -// -// while (spiBaseAddress->EVENTS_END == 0) -// ; -// nrf_gpio_pin_set(this->pinCsn); -// -// xSemaphoreGive(mutex); - - return true; -} diff --git a/sim/drivers/SpiMaster.h b/sim/drivers/SpiMaster.h deleted file mode 100644 index 14ba2d2..0000000 --- a/sim/drivers/SpiMaster.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once -#include -#include - -#include -//#include -//#include - -namespace Pinetime { - namespace Drivers { - class SpiMaster { - public: - enum class SpiModule : uint8_t { SPI0, SPI1 }; - enum class BitOrder : uint8_t { Msb_Lsb, Lsb_Msb }; - enum class Modes : uint8_t { Mode0, Mode1, Mode2, Mode3 }; - enum class Frequencies : uint8_t { Freq8Mhz }; - struct Parameters { - BitOrder bitOrder; - Modes mode; - Frequencies Frequency; - uint8_t pinSCK; - uint8_t pinMOSI; - uint8_t pinMISO; - }; - - SpiMaster(const SpiModule spi, const Parameters& params); - SpiMaster(const SpiMaster&) = delete; - SpiMaster& operator=(const SpiMaster&) = delete; - SpiMaster(SpiMaster&&) = delete; - SpiMaster& operator=(SpiMaster&&) = delete; - - bool Init(); - bool Write(uint8_t pinCsn, const uint8_t* data, size_t size); - bool Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize); - - bool WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize); - - void OnStartedEvent(); - void OnEndEvent(); - - void Sleep(); - void Wakeup(); - - private: -// void SetupWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel); -// void DisableWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel); -// void PrepareTx(const volatile uint32_t bufferAddress, const volatile size_t size); -// void PrepareRx(const volatile uint32_t cmdAddress, -// const volatile size_t cmdSize, -// const volatile uint32_t bufferAddress, -// const volatile size_t size); - -// NRF_SPIM_Type* spiBaseAddress; - uint8_t pinCsn; - - SpiMaster::SpiModule spi; - SpiMaster::Parameters params; - - volatile uint32_t currentBufferAddr = 0; - volatile size_t currentBufferSize = 0; -// volatile TaskHandle_t taskToNotify; -// SemaphoreHandle_t mutex = nullptr; - }; - } -} diff --git a/sim/drivers/SpiNorFlash.h b/sim/drivers/SpiNorFlash.h deleted file mode 100644 index 83bdf7d..0000000 --- a/sim/drivers/SpiNorFlash.h +++ /dev/null @@ -1,66 +0,0 @@ -#pragma once -#include -#include -#include - -namespace Pinetime { - namespace Drivers { - class Spi; - class SpiNorFlash { - public: - explicit SpiNorFlash(const std::string& memoryFilePath); - ~SpiNorFlash(); - SpiNorFlash(const SpiNorFlash&) = delete; - SpiNorFlash& operator=(const SpiNorFlash&) = delete; - SpiNorFlash(SpiNorFlash&&) = delete; - SpiNorFlash& operator=(SpiNorFlash&&) = delete; - - struct __attribute__((packed)) Identification { - uint8_t manufacturer = 0; - uint8_t type = 0; - uint8_t density = 0; - }; - - Identification ReadIdentificaion(); - uint8_t ReadStatusRegister(); - bool WriteInProgress(); - bool WriteEnabled(); - uint8_t ReadConfigurationRegister(); - void Read(uint32_t address, uint8_t* buffer, size_t size); - void Write(uint32_t address, const uint8_t* buffer, size_t size); - void WriteEnable(); - void SectorErase(uint32_t sectorAddress); - uint8_t ReadSecurityRegister(); - bool ProgramFailed(); - bool EraseFailed(); - - void Init(); - void Uninit(); - - void Sleep(); - void Wakeup(); - - private: - enum class Commands : uint8_t { - PageProgram = 0x02, - Read = 0x03, - ReadStatusRegister = 0x05, - WriteEnable = 0x06, - ReadConfigurationRegister = 0x15, - SectorErase = 0x20, - ReadSecurityRegister = 0x2B, - ReadIdentification = 0x9F, - ReleaseFromDeepPowerDown = 0xAB, - DeepPowerDown = 0xB9 - }; - static constexpr uint16_t pageSize = 256; - - static constexpr size_t memorySize {0x400000}; - const std::string& memoryFilePath; - - - Identification device_id; - std::fstream memoryFile; - }; - } -} diff --git a/sim/drivers/infinisim/Spi.cpp b/sim/drivers/infinisim/Spi.cpp new file mode 100644 index 0000000..bab62fd --- /dev/null +++ b/sim/drivers/infinisim/Spi.cpp @@ -0,0 +1,32 @@ +#include "Spi.h" + +using namespace Pinetime::Drivers::Infinisim; + +Spi::Spi(Pinetime::Drivers::Infinisim::SpiMaster& spiMaster, uint8_t pinCsn) : spiMaster {spiMaster}, pinCsn {pinCsn} { + +} + +bool Spi::Write(const uint8_t* data, size_t size) { + return spiMaster.Write(pinCsn, data, size); +} + +bool Spi::Read(uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize) { + return spiMaster.Read(pinCsn, cmd, cmdSize, data, dataSize); +} + +void Spi::Sleep() { + +} + +bool Spi::WriteCmdAndBuffer(const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize) { + return spiMaster.WriteCmdAndBuffer(pinCsn, cmd, cmdSize, data, dataSize); +} + +bool Spi::Init() { + + return true; +} + +void Spi::Wakeup() { + +} diff --git a/sim/drivers/infinisim/Spi.h b/sim/drivers/infinisim/Spi.h new file mode 100644 index 0000000..9f19746 --- /dev/null +++ b/sim/drivers/infinisim/Spi.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include "drivers/infinisim/SpiMaster.h" + +namespace Pinetime { + namespace Drivers { + namespace Infinisim { + class Spi { + public: + Spi(Pinetime::Drivers::Infinisim::SpiMaster& spiMaster, uint8_t pinCsn); + Spi(const Spi&) = delete; + Spi& operator=(const Spi&) = delete; + Spi(Spi&&) = delete; + Spi& operator=(Spi&&) = delete; + + bool Init(); + bool Write(const uint8_t* data, size_t size); + bool Read(uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize); + bool WriteCmdAndBuffer(const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize); + void Sleep(); + void Wakeup(); + + private: + Pinetime::Drivers::Infinisim::SpiMaster& spiMaster; + uint8_t pinCsn; + }; + } + } +} \ No newline at end of file diff --git a/sim/drivers/infinisim/SpiMaster.h b/sim/drivers/infinisim/SpiMaster.h new file mode 100644 index 0000000..58fe94c --- /dev/null +++ b/sim/drivers/infinisim/SpiMaster.h @@ -0,0 +1,45 @@ +#pragma once +#include +#include + +namespace Pinetime { +namespace Drivers { +namespace Infinisim { +class SpiMaster { +public: + SpiMaster() = default; + SpiMaster(const SpiMaster &) = delete; + SpiMaster &operator=(const SpiMaster &) = delete; + SpiMaster(SpiMaster &&) = delete; + SpiMaster &operator=(SpiMaster &&) = delete; + + bool Init() { + return true; + } + + bool Write(uint8_t pinCsn, const uint8_t *data, size_t size) { + return true; + } + + bool Read(uint8_t pinCsn, uint8_t *cmd, size_t cmdSize, uint8_t *data, + size_t dataSize) { + return true; + } + + bool WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t *cmd, size_t cmdSize, + const uint8_t *data, size_t dataSize) { + return true; + } + + void OnStartedEvent() {} + void OnEndEvent() {} + + void Sleep() {} + void Wakeup() {} + +private: + +}; +} +} +} diff --git a/sim/drivers/SpiNorFlash.cpp b/sim/drivers/infinisim/SpiNorFlash.cpp similarity index 90% rename from sim/drivers/SpiNorFlash.cpp rename to sim/drivers/infinisim/SpiNorFlash.cpp index 4569355..18ca98f 100644 --- a/sim/drivers/SpiNorFlash.cpp +++ b/sim/drivers/infinisim/SpiNorFlash.cpp @@ -1,12 +1,12 @@ -#include "drivers/SpiNorFlash.h" -#include -#include +#include "SpiNorFlash.h" #include "drivers/Spi.h" +#include "sim/libraries/log/nrf_log.h" +#include "sim/nrfx/hal/nrf_gpio.h" #include #include #include -using namespace Pinetime::Drivers; +using namespace Pinetime::Drivers::Infinisim; SpiNorFlash::SpiNorFlash(const std::string& memoryFilePath) : memoryFilePath{memoryFilePath} { namespace fs = std::filesystem; @@ -26,7 +26,7 @@ SpiNorFlash::~SpiNorFlash() { } void SpiNorFlash::Init() { - device_id = ReadIdentificaion(); + device_id = ReadIdentification(); NRF_LOG_INFO( "[SpiNorFlash] Manufacturer : %d, Memory type : %d, memory density : %d", device_id.manufacturer, device_id.type, device_id.density); } @@ -42,7 +42,7 @@ void SpiNorFlash::Wakeup() { NRF_LOG_INFO("[SpiNorFlash] Wakeup") } -SpiNorFlash::Identification SpiNorFlash::ReadIdentificaion() { +SpiNorFlash::Identification SpiNorFlash::ReadIdentification() { return {}; } diff --git a/sim/drivers/infinisim/SpiNorFlash.h b/sim/drivers/infinisim/SpiNorFlash.h new file mode 100644 index 0000000..5230a23 --- /dev/null +++ b/sim/drivers/infinisim/SpiNorFlash.h @@ -0,0 +1,66 @@ +#pragma once +#include +#include +#include + +namespace Pinetime { +namespace Drivers { +namespace Infinisim { +class SpiNorFlash { +public: + explicit SpiNorFlash(const std::string &memoryFilePath); + ~SpiNorFlash(); + SpiNorFlash(const SpiNorFlash &) = delete; + SpiNorFlash &operator=(const SpiNorFlash &) = delete; + SpiNorFlash(SpiNorFlash &&) = delete; + SpiNorFlash &operator=(SpiNorFlash &&) = delete; + + struct __attribute__((packed)) Identification { + uint8_t manufacturer = 0; + uint8_t type = 0; + uint8_t density = 0; + }; + + Identification ReadIdentification(); + uint8_t ReadStatusRegister(); + bool WriteInProgress(); + bool WriteEnabled(); + uint8_t ReadConfigurationRegister(); + void Read(uint32_t address, uint8_t *buffer, size_t size); + void Write(uint32_t address, const uint8_t *buffer, size_t size); + void WriteEnable(); + void SectorErase(uint32_t sectorAddress); + uint8_t ReadSecurityRegister(); + bool ProgramFailed(); + bool EraseFailed(); + + void Init(); + void Uninit(); + + void Sleep(); + void Wakeup(); + +private: + enum class Commands : uint8_t { + PageProgram = 0x02, + Read = 0x03, + ReadStatusRegister = 0x05, + WriteEnable = 0x06, + ReadConfigurationRegister = 0x15, + SectorErase = 0x20, + ReadSecurityRegister = 0x2B, + ReadIdentification = 0x9F, + ReleaseFromDeepPowerDown = 0xAB, + DeepPowerDown = 0xB9 + }; + static constexpr uint16_t pageSize = 256; + + static constexpr size_t memorySize{0x400000}; + const std::string &memoryFilePath; + + Identification device_id; + std::fstream memoryFile; +}; +} +} +} diff --git a/sim/port/infinitime.h b/sim/port/infinitime.h new file mode 100644 index 0000000..a6cd0c3 --- /dev/null +++ b/sim/port/infinitime.h @@ -0,0 +1,18 @@ +#pragma once +#include "drivers/Spi.h" +#include "drivers/SpiMaster.h" +#include "drivers/SpiNorFlash.h" +#include + + +#include "sim/drivers/infinisim/SpiMaster.h" +#include "sim/drivers/infinisim/Spi.h" +#include "sim/drivers/infinisim/SpiNorFlash.h" + +namespace Pinetime { + namespace Drivers { + using SpiMaster = Interface::SpiMaster; + using Spi = Interface::Spi; + using SpiNorFlash = Interface::SpiNorFlash; + } +} \ No newline at end of file From 003caf72e8d356a2566ece8f15f2d82267ab8c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Tue, 27 Dec 2022 15:36:08 +0100 Subject: [PATCH 2/8] Add missing new line at end of files and fix include paths. --- sim/drivers/infinisim/Spi.cpp | 2 +- sim/drivers/infinisim/Spi.h | 2 +- sim/drivers/infinisim/SpiNorFlash.cpp | 2 +- sim/port/infinitime.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sim/drivers/infinisim/Spi.cpp b/sim/drivers/infinisim/Spi.cpp index bab62fd..7e7c872 100644 --- a/sim/drivers/infinisim/Spi.cpp +++ b/sim/drivers/infinisim/Spi.cpp @@ -1,4 +1,4 @@ -#include "Spi.h" +#include "drivers/infinisim/Spi.h" using namespace Pinetime::Drivers::Infinisim; diff --git a/sim/drivers/infinisim/Spi.h b/sim/drivers/infinisim/Spi.h index 9f19746..9ba162c 100644 --- a/sim/drivers/infinisim/Spi.h +++ b/sim/drivers/infinisim/Spi.h @@ -27,4 +27,4 @@ namespace Pinetime { }; } } -} \ No newline at end of file +} diff --git a/sim/drivers/infinisim/SpiNorFlash.cpp b/sim/drivers/infinisim/SpiNorFlash.cpp index 18ca98f..93b1176 100644 --- a/sim/drivers/infinisim/SpiNorFlash.cpp +++ b/sim/drivers/infinisim/SpiNorFlash.cpp @@ -1,4 +1,4 @@ -#include "SpiNorFlash.h" +#include "drivers/infinisim/SpiNorFlash.h" #include "drivers/Spi.h" #include "sim/libraries/log/nrf_log.h" #include "sim/nrfx/hal/nrf_gpio.h" diff --git a/sim/port/infinitime.h b/sim/port/infinitime.h index a6cd0c3..dc5eade 100644 --- a/sim/port/infinitime.h +++ b/sim/port/infinitime.h @@ -15,4 +15,4 @@ namespace Pinetime { using Spi = Interface::Spi; using SpiNorFlash = Interface::SpiNorFlash; } -} \ No newline at end of file +} From 6daf3843182199fc55c4eece479b5450cab2b330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Tue, 27 Dec 2022 21:29:09 +0100 Subject: [PATCH 3/8] Integrate the refactoring of TwiMaster. --- CMakeLists.txt | 4 +- main.cpp | 12 +- sim/drivers/Bma421.cpp | 4 +- sim/drivers/Bma421.h | 2 +- sim/drivers/Hrs3300.h | 2 +- sim/drivers/TwiMaster.cpp | 187 ---------------------------- sim/drivers/TwiMaster.h | 41 ------ sim/drivers/infinisim/TwiMaster.cpp | 27 ++++ sim/drivers/infinisim/TwiMaster.h | 24 ++++ sim/port/infinitime.h | 3 + 10 files changed, 63 insertions(+), 243 deletions(-) delete mode 100644 sim/drivers/TwiMaster.cpp delete mode 100644 sim/drivers/TwiMaster.h create mode 100644 sim/drivers/infinisim/TwiMaster.cpp create mode 100644 sim/drivers/infinisim/TwiMaster.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b46639a..64e2979 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,8 +145,8 @@ target_sources(infinisim PUBLIC sim/drivers/infinisim/SpiMaster.h sim/drivers/infinisim/Spi.h sim/drivers/infinisim/Spi.cpp - sim/drivers/TwiMaster.h - sim/drivers/TwiMaster.cpp + sim/drivers/infinisim/TwiMaster.h + sim/drivers/infinisim/TwiMaster.cpp sim/drivers/infinisim/SpiNorFlash.h sim/drivers/infinisim/SpiNorFlash.cpp sim/heartratetask/HeartRateTask.h diff --git a/main.cpp b/main.cpp index f886c71..600f9e1 100644 --- a/main.cpp +++ b/main.cpp @@ -43,9 +43,9 @@ #include "drivers/PinMap.h" #include "drivers/Spi.h" #include "drivers/St7789.h" -#include "drivers/TwiMaster.h" #include "sim/drivers/infinisim/SpiMaster.h" #include "sim/drivers/infinisim/SpiNorFlash.h" +#include "sim/drivers/infinisim/TwiMaster.h" #include "systemtask/SystemTask.h" #include "touchhandler/TouchHandler.h" @@ -284,9 +284,6 @@ void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action /********************** * GLOBAL FUNCTIONS **********************/ -constexpr NRF_TWIM_Type *NRF_TWIM1 = nullptr; - - static constexpr uint8_t touchPanelTwiAddress = 0x15; static constexpr uint8_t motionSensorTwiAddress = 0x18; static constexpr uint8_t heartRateSensorTwiAddress = 0x44; @@ -305,11 +302,8 @@ Pinetime::Drivers::Spi flashSpi {flashSpiImpl}; Pinetime::Drivers::Infinisim::SpiNorFlash spiNorFlashImpl {"spiNorFlash.raw"}; Pinetime::Drivers::SpiNorFlash spiNorFlash {spiNorFlashImpl}; -// The TWI device should work @ up to 400Khz but there is a HW bug which prevent it from -// respecting correct timings. According to erratas heet, this magic value makes it run -// at ~390Khz with correct timings. -static constexpr uint32_t MaxTwiFrequencyWithoutHardwareBug {0x06200000}; -Pinetime::Drivers::TwiMaster twiMaster {NRF_TWIM1, MaxTwiFrequencyWithoutHardwareBug, Pinetime::PinMap::TwiSda, Pinetime::PinMap::TwiScl}; +Pinetime::Drivers::Infinisim::TwiMaster twiMasterImpl {}; +Pinetime::Drivers::TwiMaster twiMaster{twiMasterImpl}; Pinetime::Drivers::Cst816S touchPanel; // {twiMaster, touchPanelTwiAddress}; //#ifdef PINETIME_IS_RECOVERY // #include "displayapp/DummyLittleVgl.h" diff --git a/sim/drivers/Bma421.cpp b/sim/drivers/Bma421.cpp index f2d3cdd..ba862b6 100644 --- a/sim/drivers/Bma421.cpp +++ b/sim/drivers/Bma421.cpp @@ -1,8 +1,8 @@ #include "drivers/Bma421.h" +#include "sim/drivers/infinisim/TwiMaster.h" +#include #include #include -#include "drivers/TwiMaster.h" -#include using namespace Pinetime::Drivers; diff --git a/sim/drivers/Bma421.h b/sim/drivers/Bma421.h index b532749..3d0c011 100644 --- a/sim/drivers/Bma421.h +++ b/sim/drivers/Bma421.h @@ -3,10 +3,10 @@ #include #include #include +#include "port/infinitime.h" namespace Pinetime { namespace Drivers { - class TwiMaster; class Bma421 { public: enum class DeviceTypes : uint8_t { diff --git a/sim/drivers/Hrs3300.h b/sim/drivers/Hrs3300.h index 01310c6..0be1650 100644 --- a/sim/drivers/Hrs3300.h +++ b/sim/drivers/Hrs3300.h @@ -1,6 +1,6 @@ #pragma once -#include "drivers/TwiMaster.h" +#include "port/infinitime.h" namespace Pinetime { namespace Drivers { diff --git a/sim/drivers/TwiMaster.cpp b/sim/drivers/TwiMaster.cpp deleted file mode 100644 index cd89d7d..0000000 --- a/sim/drivers/TwiMaster.cpp +++ /dev/null @@ -1,187 +0,0 @@ -#include "drivers/TwiMaster.h" -#include -#include -#include - -using namespace Pinetime::Drivers; - -// TODO use shortcut to automatically send STOP when receive LastTX, for example -// TODO use DMA/IRQ - -TwiMaster::TwiMaster(NRF_TWIM_Type* module, uint32_t frequency, uint8_t pinSda, uint8_t pinScl) - : module {module}, frequency {frequency}, pinSda {pinSda}, pinScl {pinScl} { -} - -//void TwiMaster::ConfigurePins() const { -// NRF_GPIO->PIN_CNF[pinScl] = -// (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | -// (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | -// (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | -// (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) | -// (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); -// -// NRF_GPIO->PIN_CNF[pinSda] = -// (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | -// (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | -// (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | -// (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) | -// (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); -//} - -void TwiMaster::Init() { -// if (mutex == nullptr) { -// mutex = xSemaphoreCreateBinary(); -// } -// -// ConfigurePins(); -// -// twiBaseAddress = module; -// -// twiBaseAddress->FREQUENCY = frequency; -// -// twiBaseAddress->PSEL.SCL = pinScl; -// twiBaseAddress->PSEL.SDA = pinSda; -// twiBaseAddress->EVENTS_LASTRX = 0; -// twiBaseAddress->EVENTS_STOPPED = 0; -// twiBaseAddress->EVENTS_LASTTX = 0; -// twiBaseAddress->EVENTS_ERROR = 0; -// twiBaseAddress->EVENTS_RXSTARTED = 0; -// twiBaseAddress->EVENTS_SUSPENDED = 0; -// twiBaseAddress->EVENTS_TXSTARTED = 0; -// -// twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos); -// -// xSemaphoreGive(mutex); -} - -TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* data, size_t size) { -// xSemaphoreTake(mutex, portMAX_DELAY); -// Wakeup(); -// auto ret = Write(deviceAddress, ®isterAddress, 1, false); -// ret = Read(deviceAddress, data, size, true); -// Sleep(); -// xSemaphoreGive(mutex); -// return ret; - return TwiMaster::ErrorCodes::NoError; -} - -TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size) { -// ASSERT(size <= maxDataSize); -// xSemaphoreTake(mutex, portMAX_DELAY); -// Wakeup(); -// internalBuffer[0] = registerAddress; -// std::memcpy(internalBuffer + 1, data, size); -// auto ret = Write(deviceAddress, internalBuffer, size + 1, true); -// Sleep(); -// xSemaphoreGive(mutex); -// return ret; - return TwiMaster::ErrorCodes::NoError; -} - -//TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop) { -// twiBaseAddress->ADDRESS = deviceAddress; -// twiBaseAddress->TASKS_RESUME = 0x1UL; -// twiBaseAddress->RXD.PTR = (uint32_t) buffer; -// twiBaseAddress->RXD.MAXCNT = size; -// -// twiBaseAddress->TASKS_STARTRX = 1; -// -// while (!twiBaseAddress->EVENTS_RXSTARTED && !twiBaseAddress->EVENTS_ERROR) -// ; -// twiBaseAddress->EVENTS_RXSTARTED = 0x0UL; -// -// txStartedCycleCount = DWT->CYCCNT; -// uint32_t currentCycleCount; -// while (!twiBaseAddress->EVENTS_LASTRX && !twiBaseAddress->EVENTS_ERROR) { -// currentCycleCount = DWT->CYCCNT; -// if ((currentCycleCount - txStartedCycleCount) > HwFreezedDelay) { -// FixHwFreezed(); -// return ErrorCodes::TransactionFailed; -// } -// } -// twiBaseAddress->EVENTS_LASTRX = 0x0UL; -// -// if (stop || twiBaseAddress->EVENTS_ERROR) { -// twiBaseAddress->TASKS_STOP = 0x1UL; -// while (!twiBaseAddress->EVENTS_STOPPED) -// ; -// twiBaseAddress->EVENTS_STOPPED = 0x0UL; -// } else { -// twiBaseAddress->TASKS_SUSPEND = 0x1UL; -// while (!twiBaseAddress->EVENTS_SUSPENDED) -// ; -// twiBaseAddress->EVENTS_SUSPENDED = 0x0UL; -// } -// -// if (twiBaseAddress->EVENTS_ERROR) { -// twiBaseAddress->EVENTS_ERROR = 0x0UL; -// } -// return ErrorCodes::NoError; -//} - -//TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop) { -// twiBaseAddress->ADDRESS = deviceAddress; -// twiBaseAddress->TASKS_RESUME = 0x1UL; -// twiBaseAddress->TXD.PTR = (uint32_t) data; -// twiBaseAddress->TXD.MAXCNT = size; -// -// twiBaseAddress->TASKS_STARTTX = 1; -// -// while (!twiBaseAddress->EVENTS_TXSTARTED && !twiBaseAddress->EVENTS_ERROR) -// ; -// twiBaseAddress->EVENTS_TXSTARTED = 0x0UL; -// -// txStartedCycleCount = DWT->CYCCNT; -// uint32_t currentCycleCount; -// while (!twiBaseAddress->EVENTS_LASTTX && !twiBaseAddress->EVENTS_ERROR) { -// currentCycleCount = DWT->CYCCNT; -// if ((currentCycleCount - txStartedCycleCount) > HwFreezedDelay) { -// FixHwFreezed(); -// return ErrorCodes::TransactionFailed; -// } -// } -// twiBaseAddress->EVENTS_LASTTX = 0x0UL; -// -// if (stop || twiBaseAddress->EVENTS_ERROR) { -// twiBaseAddress->TASKS_STOP = 0x1UL; -// while (!twiBaseAddress->EVENTS_STOPPED) -// ; -// twiBaseAddress->EVENTS_STOPPED = 0x0UL; -// } else { -// twiBaseAddress->TASKS_SUSPEND = 0x1UL; -// while (!twiBaseAddress->EVENTS_SUSPENDED) -// ; -// twiBaseAddress->EVENTS_SUSPENDED = 0x0UL; -// } -// -// if (twiBaseAddress->EVENTS_ERROR) { -// twiBaseAddress->EVENTS_ERROR = 0x0UL; -// uint32_t error = twiBaseAddress->ERRORSRC; -// twiBaseAddress->ERRORSRC = error; -// } -// -// return ErrorCodes::NoError; -//} - -void TwiMaster::Sleep() { -// twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Disabled << TWIM_ENABLE_ENABLE_Pos); -} - -void TwiMaster::Wakeup() { -// twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos); -} - -/* Sometimes, the TWIM device just freeze and never set the event EVENTS_LASTTX. - * This method disable and re-enable the peripheral so that it works again. - * This is just a workaround, and it would be better if we could find a way to prevent - * this issue from happening. - * */ -//void TwiMaster::FixHwFreezed() { -// NRF_LOG_INFO("I2C device frozen, reinitializing it!"); -// -// uint32_t twi_state = NRF_TWI1->ENABLE; -// -// Sleep(); -// -// twiBaseAddress->ENABLE = twi_state; -//} diff --git a/sim/drivers/TwiMaster.h b/sim/drivers/TwiMaster.h deleted file mode 100644 index bc2bd8d..0000000 --- a/sim/drivers/TwiMaster.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include -//#include -#include // NRF_TWIM_Type -#include - -namespace Pinetime { - namespace Drivers { - class TwiMaster { - public: - enum class ErrorCodes { NoError, TransactionFailed }; - - TwiMaster(NRF_TWIM_Type* module, uint32_t frequency, uint8_t pinSda, uint8_t pinScl); - - void Init(); - ErrorCodes Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size); - ErrorCodes Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size); - - void Sleep(); - void Wakeup(); - - private: -// ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop); -// ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop); -// void FixHwFreezed(); -// void ConfigurePins() const; - - NRF_TWIM_Type* twiBaseAddress; -// SemaphoreHandle_t mutex = nullptr; - NRF_TWIM_Type* module; - uint32_t frequency; - uint8_t pinSda; - uint8_t pinScl; - static constexpr uint8_t maxDataSize {16}; - static constexpr uint8_t registerSize {1}; - uint8_t internalBuffer[maxDataSize + registerSize]; - uint32_t txStartedCycleCount = 0; - static constexpr uint32_t HwFreezedDelay {161000}; - }; - } -} diff --git a/sim/drivers/infinisim/TwiMaster.cpp b/sim/drivers/infinisim/TwiMaster.cpp new file mode 100644 index 0000000..453eb5b --- /dev/null +++ b/sim/drivers/infinisim/TwiMaster.cpp @@ -0,0 +1,27 @@ +#include "TwiMaster.h" +#include + +using namespace Pinetime::Drivers::Infinisim; + +TwiMaster::TwiMaster() { +} + +void TwiMaster::Init() { + +} + +TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* data, size_t size) { + return TwiMaster::ErrorCodes::NoError; +} + +TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size) { + return TwiMaster::ErrorCodes::NoError; +} + +void TwiMaster::Sleep() { + +} + +void TwiMaster::Wakeup() { + +} diff --git a/sim/drivers/infinisim/TwiMaster.h b/sim/drivers/infinisim/TwiMaster.h new file mode 100644 index 0000000..46c152d --- /dev/null +++ b/sim/drivers/infinisim/TwiMaster.h @@ -0,0 +1,24 @@ +#pragma once +#include +#include + +namespace Pinetime { + namespace Drivers { + namespace Infinisim { + class TwiMaster { + public: + enum class ErrorCodes { NoError, TransactionFailed }; + + TwiMaster(); + void Init(); + ErrorCodes Read(uint8_t deviceAddress, uint8_t registerAddress, + uint8_t *buffer, size_t size); + ErrorCodes Write(uint8_t deviceAddress, uint8_t registerAddress, + const uint8_t *data, size_t size); + + void Sleep(); + void Wakeup(); + }; + } + } +} diff --git a/sim/port/infinitime.h b/sim/port/infinitime.h index dc5eade..6a81e9a 100644 --- a/sim/port/infinitime.h +++ b/sim/port/infinitime.h @@ -2,17 +2,20 @@ #include "drivers/Spi.h" #include "drivers/SpiMaster.h" #include "drivers/SpiNorFlash.h" +#include "drivers/TwiMaster.h" #include #include "sim/drivers/infinisim/SpiMaster.h" #include "sim/drivers/infinisim/Spi.h" +#include "sim/drivers/infinisim/TwiMaster.h" #include "sim/drivers/infinisim/SpiNorFlash.h" namespace Pinetime { namespace Drivers { using SpiMaster = Interface::SpiMaster; using Spi = Interface::Spi; + using TwiMaster = Interface::TwiMaster; using SpiNorFlash = Interface::SpiNorFlash; } } From 0ed24c5bec4b9ff3f448246992a67992a75ba605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Wed, 28 Dec 2022 12:26:52 +0100 Subject: [PATCH 4/8] Integrate the refactoring of TouchPanel/Cst816S. --- CMakeLists.txt | 4 +- main.cpp | 9 +- sim/displayapp/LittleVgl.cpp | 4 +- sim/displayapp/LittleVgl.h | 6 +- sim/drivers/Cst816s.h | 88 ------------------- .../SdlTouchPanel.cpp} | 42 ++++----- sim/drivers/infinisim/SdlTouchPanel.h | 50 +++++++++++ sim/port/TouchPanel.h | 9 ++ sim/port/TwiMaster.h | 10 +++ 9 files changed, 99 insertions(+), 123 deletions(-) delete mode 100644 sim/drivers/Cst816s.h rename sim/drivers/{Cst816s.cpp => infinisim/SdlTouchPanel.cpp} (71%) create mode 100644 sim/drivers/infinisim/SdlTouchPanel.h create mode 100644 sim/port/TouchPanel.h create mode 100644 sim/port/TwiMaster.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 64e2979..6582a0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,8 +138,8 @@ target_sources(infinisim PUBLIC sim/drivers/Watchdog.cpp sim/drivers/Bma421.h sim/drivers/Bma421.cpp - sim/drivers/Cst816s.h - sim/drivers/Cst816s.cpp + sim/drivers/infinisim/SdlTouchPanel.h + sim/drivers/infinisim/SdlTouchPanel.cpp sim/drivers/Hrs3300.h sim/drivers/Hrs3300.cpp sim/drivers/infinisim/SpiMaster.h diff --git a/main.cpp b/main.cpp index 600f9e1..1036c40 100644 --- a/main.cpp +++ b/main.cpp @@ -39,10 +39,10 @@ #include "components/fs/FS.h" #include "components/heartrate/HeartRateController.h" #include "components/motor/MotorController.h" -#include "drivers/Cst816s.h" #include "drivers/PinMap.h" #include "drivers/Spi.h" #include "drivers/St7789.h" +#include "sim/drivers/infinisim/SdlTouchPanel.h" #include "sim/drivers/infinisim/SpiMaster.h" #include "sim/drivers/infinisim/SpiNorFlash.h" #include "sim/drivers/infinisim/TwiMaster.h" @@ -70,6 +70,8 @@ #include #include "port/infinitime.h" +#include "port/TwiMaster.h" +#include "port/TouchPanel.h" /********************* * DEFINES @@ -304,7 +306,10 @@ Pinetime::Drivers::SpiNorFlash spiNorFlash {spiNorFlashImpl}; Pinetime::Drivers::Infinisim::TwiMaster twiMasterImpl {}; Pinetime::Drivers::TwiMaster twiMaster{twiMasterImpl}; -Pinetime::Drivers::Cst816S touchPanel; // {twiMaster, touchPanelTwiAddress}; + +Pinetime::Drivers::Infinisim::TouchPanels::SdlTouchPanel touchPanelImpl; +Pinetime::Drivers::TouchPanel touchPanel {touchPanelImpl}; + //#ifdef PINETIME_IS_RECOVERY // #include "displayapp/DummyLittleVgl.h" // #include "displayapp/DisplayAppRecovery.h" diff --git a/sim/displayapp/LittleVgl.cpp b/sim/displayapp/LittleVgl.cpp index 355c2ba..9fe2291 100644 --- a/sim/displayapp/LittleVgl.cpp +++ b/sim/displayapp/LittleVgl.cpp @@ -9,7 +9,7 @@ #include #include ////#include -#include "drivers/Cst816s.h" +#include "drivers/TouchPanel.h" #include "drivers/St7789.h" // lv-sim monitor display driver for monitor_flush() function @@ -41,7 +41,7 @@ bool touchpad_read(lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { return lvgl->GetTouchPadInfo(data); } -LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel) +LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::TouchPanel& touchPanel) : lcd {lcd}, touchPanel {touchPanel} { } diff --git a/sim/displayapp/LittleVgl.h b/sim/displayapp/LittleVgl.h index 4582616..425d2d1 100644 --- a/sim/displayapp/LittleVgl.h +++ b/sim/displayapp/LittleVgl.h @@ -1,10 +1,10 @@ #pragma once +#include "port/TouchPanel.h" #include namespace Pinetime { namespace Drivers { - class Cst816S; class St7789; } @@ -12,7 +12,7 @@ namespace Pinetime { class LittleVgl { public: enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; - LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel); + LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::TouchPanel& touchPanel); LittleVgl(const LittleVgl&) = delete; LittleVgl& operator=(const LittleVgl&) = delete; @@ -40,7 +40,7 @@ namespace Pinetime { void InitTheme(); Pinetime::Drivers::St7789& lcd; - Pinetime::Drivers::Cst816S& touchPanel; + Pinetime::Drivers::TouchPanel& touchPanel; lv_disp_buf_t disp_buf_2; lv_color_t buf2_1[LV_HOR_RES_MAX * 4]; diff --git a/sim/drivers/Cst816s.h b/sim/drivers/Cst816s.h deleted file mode 100644 index 3a989da..0000000 --- a/sim/drivers/Cst816s.h +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -//#include "drivers/TwiMaster.h" -#include -#include - -namespace Pinetime { - namespace Drivers { - class Cst816S { - public: - enum class Gestures : uint8_t { - None = 0x00, - SlideDown = 0x01, - SlideUp = 0x02, - SlideLeft = 0x03, - SlideRight = 0x04, - SingleTap = 0x05, - DoubleTap = 0x0B, - LongPress = 0x0C - }; - struct TouchInfos { - uint16_t x = 0; - uint16_t y = 0; - Gestures gesture = Gestures::None; - bool touching = false; - bool isValid = false; - }; - - Cst816S(); -// Cst816S(TwiMaster& twiMaster, uint8_t twiAddress); - Cst816S(const Cst816S&) = delete; - Cst816S& operator=(const Cst816S&) = delete; - Cst816S(Cst816S&&) = delete; - Cst816S& operator=(Cst816S&&) = delete; - - bool Init(); - TouchInfos GetTouchInfo(); - void Sleep(); - void Wakeup(); - - uint8_t GetChipId() const { - return chipId; - } - uint8_t GetVendorId() const { - return vendorId; - } - uint8_t GetFwVersion() const { - return fwVersion; - } - private: - bool CheckDeviceIds(); - - // Unused/Unavailable commented out - static constexpr uint8_t gestureIndex = 1; - static constexpr uint8_t touchPointNumIndex = 2; - //static constexpr uint8_t touchEventIndex = 3; - static constexpr uint8_t touchXHighIndex = 3; - static constexpr uint8_t touchXLowIndex = 4; - //static constexpr uint8_t touchIdIndex = 5; - static constexpr uint8_t touchYHighIndex = 5; - static constexpr uint8_t touchYLowIndex = 6; - //static constexpr uint8_t touchStep = 6; - //static constexpr uint8_t touchXYIndex = 7; - //static constexpr uint8_t touchMiscIndex = 8; - - static constexpr uint8_t maxX = 240; - static constexpr uint8_t maxY = 240; - -// TwiMaster& twiMaster; -// uint8_t twiAddress; - - const uint8_t chipId = 0xb4; - const uint8_t vendorId = 0; - const uint8_t fwVersion = 1; - - - // simulation members for swipe detection from mouse - std::chrono::time_point pressed_since; - bool is_pressed = false; - bool is_long_press = false; - bool is_stationary = true; - bool is_swipe = false; - uint8_t x_start; - uint8_t y_start; - }; - - } -} diff --git a/sim/drivers/Cst816s.cpp b/sim/drivers/infinisim/SdlTouchPanel.cpp similarity index 71% rename from sim/drivers/Cst816s.cpp rename to sim/drivers/infinisim/SdlTouchPanel.cpp index 659511f..8b809ad 100644 --- a/sim/drivers/Cst816s.cpp +++ b/sim/drivers/infinisim/SdlTouchPanel.cpp @@ -1,29 +1,19 @@ -#include "drivers/Cst816s.h" +#include "SdlTouchPanel.h" #include "lv_drv_conf.h" // MONITOR_ZOOM +#include "sim/libraries/log/nrf_log.h" #include -#include #include -using namespace Pinetime::Drivers; +using namespace Pinetime::Drivers::Infinisim::TouchPanels; -/* References : - * This implementation is based on this article : - * https://medium.com/@ly.lee/building-a-rust-driver-for-pinetimes-touch-controller-cbc1a5d5d3e9 Touch panel datasheet (weird chinese - * translation) : https://wiki.pine64.org/images/5/51/CST816S%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8CV1.1.en.pdf - * - * TODO : we need a complete datasheet and protocol reference! - * */ - -//Cst816S::Cst816S(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, twiAddress {twiAddress} { -//} -Cst816S::Cst816S() { +SdlTouchPanel::SdlTouchPanel() { } -bool Cst816S::Init() { +bool SdlTouchPanel::Init() { return true; } -Cst816S::TouchInfos Cst816S::GetTouchInfo() { +Pinetime::Drivers::TouchPanels::TouchInfos SdlTouchPanel::GetTouchInfo() { int x, y; uint32_t buttons = SDL_GetMouseState(&x, &y); // scale down real mouse coordinates to InfiniTime scale to make zoom work @@ -31,7 +21,7 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() { x /= MONITOR_ZOOM; y /= MONITOR_ZOOM; - Cst816S::TouchInfos info; + Pinetime::Drivers::TouchPanels::TouchInfos info; info.x = x; info.y = y; info.touching = (buttons & SDL_BUTTON_LMASK) != 0; @@ -62,7 +52,7 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() { if(is_stationary && press_duration.count() > 1.0) { // longer than 1 second pressed, then it is long-press is_long_press = true; - info.gesture = Gestures::LongPress; + info.gesture = Pinetime::Drivers::TouchPanels::Gestures::LongPress; } else if(!is_stationary) { // moved mouse fast enough to not be a long-press is_swipe = true; @@ -71,16 +61,16 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() { if (fabs(x_diff) > fabs(y_diff)) { // x-swipe if (x_diff < 0) { - info.gesture = Gestures::SlideLeft; + info.gesture = Pinetime::Drivers::TouchPanels::Gestures::SlideLeft; } else { - info.gesture = Gestures::SlideRight; + info.gesture = Pinetime::Drivers::TouchPanels::Gestures::SlideRight; } } else { // y-swipe if (y_diff < 0) { - info.gesture = Gestures::SlideUp; + info.gesture = Pinetime::Drivers::TouchPanels::Gestures::SlideUp; } else { - info.gesture = Gestures::SlideDown; + info.gesture = Pinetime::Drivers::TouchPanels::Gestures::SlideDown; } } } @@ -95,7 +85,7 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() { if(norm < 20) { if(is_stationary && !is_long_press && !is_swipe) { // no swipe with less than 5 pixel mouse movement - info.gesture = Gestures::SingleTap; + info.gesture = Pinetime::Drivers::TouchPanels::Gestures::SingleTap; } } } @@ -103,15 +93,15 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() { return info; } -void Cst816S::Sleep() { +void SdlTouchPanel::Sleep() { NRF_LOG_INFO("[TOUCHPANEL] Sleep"); } -void Cst816S::Wakeup() { +void SdlTouchPanel::Wakeup() { Init(); NRF_LOG_INFO("[TOUCHPANEL] Wakeup"); } -bool Cst816S::CheckDeviceIds() { +bool SdlTouchPanel::CheckDeviceIds() { return chipId == 0xb4 && vendorId == 0 && fwVersion == 1; } diff --git a/sim/drivers/infinisim/SdlTouchPanel.h b/sim/drivers/infinisim/SdlTouchPanel.h new file mode 100644 index 0000000..6f1df0c --- /dev/null +++ b/sim/drivers/infinisim/SdlTouchPanel.h @@ -0,0 +1,50 @@ +#pragma once + +#include "drivers/TouchPanel.h" +#include +#include + +namespace Pinetime { + namespace Drivers { + namespace Infinisim { + namespace TouchPanels { + class SdlTouchPanel { + public: + SdlTouchPanel(); + SdlTouchPanel(const SdlTouchPanel &) = delete; + SdlTouchPanel &operator=(const SdlTouchPanel &) = delete; + SdlTouchPanel(SdlTouchPanel &&) = delete; + SdlTouchPanel &operator=(SdlTouchPanel &&) = delete; + + bool Init(); + Pinetime::Drivers::TouchPanels::TouchInfos GetTouchInfo(); + void Sleep(); + void Wakeup(); + + uint8_t GetChipId() const { return chipId; } + uint8_t GetVendorId() const { return vendorId; } + uint8_t GetFwVersion() const { return fwVersion; } + + private: + bool CheckDeviceIds(); + + static constexpr uint8_t maxX = 240; + static constexpr uint8_t maxY = 240; + + const uint8_t chipId = 0xb4; + const uint8_t vendorId = 0; + const uint8_t fwVersion = 1; + + // simulation members for swipe detection from mouse + std::chrono::time_point pressed_since; + bool is_pressed = false; + bool is_long_press = false; + bool is_stationary = true; + bool is_swipe = false; + uint8_t x_start; + uint8_t y_start; + }; + } + } + } +} diff --git a/sim/port/TouchPanel.h b/sim/port/TouchPanel.h new file mode 100644 index 0000000..002af6c --- /dev/null +++ b/sim/port/TouchPanel.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/TouchPanel.h" +#include "sim/drivers/infinisim/SdlTouchPanel.h" + +namespace Pinetime { + namespace Drivers { + using TouchPanel = Interface::Touchpanel; + } +} diff --git a/sim/port/TwiMaster.h b/sim/port/TwiMaster.h new file mode 100644 index 0000000..df47fa8 --- /dev/null +++ b/sim/port/TwiMaster.h @@ -0,0 +1,10 @@ +#pragma once +#include "drivers/TwiMaster.h" +#include "sim/drivers/infinisim/SdlTouchPanel.h" +#include + +namespace Pinetime { + namespace Drivers { + using TwiMaster = Interface::TwiMaster; + } +} From 6c73bd6d9cbf94a70ac0aa72277148afb341b6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Wed, 28 Dec 2022 13:05:02 +0100 Subject: [PATCH 5/8] Split port/infinitime.h into multiple files. --- main.cpp | 4 +++- sim/drivers/Bma421.h | 2 +- sim/drivers/Hrs3300.h | 2 +- sim/port/Spi.h | 9 +++++++++ sim/port/SpiMaster.h | 9 +++++++++ sim/port/SpiNorFlash.h | 9 +++++++++ sim/port/infinitime.h | 21 --------------------- 7 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 sim/port/Spi.h create mode 100644 sim/port/SpiMaster.h create mode 100644 sim/port/SpiNorFlash.h delete mode 100644 sim/port/infinitime.h diff --git a/main.cpp b/main.cpp index 1036c40..496f50d 100644 --- a/main.cpp +++ b/main.cpp @@ -69,7 +69,9 @@ #endif #include -#include "port/infinitime.h" +#include "port/Spi.h" +#include "port/SpiMaster.h" +#include "port/SpiNorFlash.h" #include "port/TwiMaster.h" #include "port/TouchPanel.h" diff --git a/sim/drivers/Bma421.h b/sim/drivers/Bma421.h index 3d0c011..59b3ca0 100644 --- a/sim/drivers/Bma421.h +++ b/sim/drivers/Bma421.h @@ -3,7 +3,7 @@ #include #include #include -#include "port/infinitime.h" +#include "port/TwiMaster.h" namespace Pinetime { namespace Drivers { diff --git a/sim/drivers/Hrs3300.h b/sim/drivers/Hrs3300.h index 0be1650..66e938f 100644 --- a/sim/drivers/Hrs3300.h +++ b/sim/drivers/Hrs3300.h @@ -1,6 +1,6 @@ #pragma once -#include "port/infinitime.h" +#include "port/TwiMaster.h" namespace Pinetime { namespace Drivers { diff --git a/sim/port/Spi.h b/sim/port/Spi.h new file mode 100644 index 0000000..81a3c86 --- /dev/null +++ b/sim/port/Spi.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/Spi.h" +#include "sim/drivers/infinisim/Spi.h" + +namespace Pinetime { + namespace Drivers { + using Spi = Interface::Spi; + } +} diff --git a/sim/port/SpiMaster.h b/sim/port/SpiMaster.h new file mode 100644 index 0000000..9eef864 --- /dev/null +++ b/sim/port/SpiMaster.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/SpiMaster.h" +#include "sim/drivers/infinisim/SpiMaster.h" + +namespace Pinetime { + namespace Drivers { + using SpiMaster = Interface::SpiMaster; + } +} diff --git a/sim/port/SpiNorFlash.h b/sim/port/SpiNorFlash.h new file mode 100644 index 0000000..848f432 --- /dev/null +++ b/sim/port/SpiNorFlash.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/SpiNorFlash.h" +#include "sim/drivers/infinisim/SpiNorFlash.h" + +namespace Pinetime { + namespace Drivers { + using SpiNorFlash = Interface::SpiNorFlash; + } +} diff --git a/sim/port/infinitime.h b/sim/port/infinitime.h deleted file mode 100644 index 6a81e9a..0000000 --- a/sim/port/infinitime.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include "drivers/Spi.h" -#include "drivers/SpiMaster.h" -#include "drivers/SpiNorFlash.h" -#include "drivers/TwiMaster.h" -#include - - -#include "sim/drivers/infinisim/SpiMaster.h" -#include "sim/drivers/infinisim/Spi.h" -#include "sim/drivers/infinisim/TwiMaster.h" -#include "sim/drivers/infinisim/SpiNorFlash.h" - -namespace Pinetime { - namespace Drivers { - using SpiMaster = Interface::SpiMaster; - using Spi = Interface::Spi; - using TwiMaster = Interface::TwiMaster; - using SpiNorFlash = Interface::SpiNorFlash; - } -} From df47f1b8b92ccb3d3ccef5284b01744094b35633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Wed, 28 Dec 2022 15:31:01 +0100 Subject: [PATCH 6/8] Integrate the refactoring of MotionSensor/BMA421. --- CMakeLists.txt | 4 +- main.cpp | 13 +- sim/components/motion/MotionController.cpp | 6 +- sim/components/motion/MotionController.h | 4 +- sim/drivers/Bma421.cpp | 134 --------------------- sim/drivers/Bma421.h | 56 --------- sim/drivers/infinisim/Bma421.cpp | 36 ++++++ sim/drivers/infinisim/Bma421.h | 46 +++++++ sim/port/MotionSensor.h | 9 ++ 9 files changed, 105 insertions(+), 203 deletions(-) delete mode 100644 sim/drivers/Bma421.cpp delete mode 100644 sim/drivers/Bma421.h create mode 100644 sim/drivers/infinisim/Bma421.cpp create mode 100644 sim/drivers/infinisim/Bma421.h create mode 100644 sim/port/MotionSensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6582a0c..c629044 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,8 +136,8 @@ target_sources(infinisim PUBLIC sim/components/motion/MotionController.cpp sim/drivers/Watchdog.h sim/drivers/Watchdog.cpp - sim/drivers/Bma421.h - sim/drivers/Bma421.cpp + sim/drivers/infinisim/Bma421.h + sim/drivers/infinisim/Bma421.cpp sim/drivers/infinisim/SdlTouchPanel.h sim/drivers/infinisim/SdlTouchPanel.cpp sim/drivers/Hrs3300.h diff --git a/main.cpp b/main.cpp index 496f50d..c6e1a4f 100644 --- a/main.cpp +++ b/main.cpp @@ -26,8 +26,8 @@ #else #include "displayapp/lv_pinetime_theme.h" #endif +#include "sim/drivers/infinisim/Bma421.h" #include -#include #include "BootloaderVersion.h" #include "buttonhandler/ButtonHandler.h" @@ -321,7 +321,8 @@ Pinetime::Drivers::TouchPanel touchPanel {touchPanelImpl}; //#endif Pinetime::Components::LittleVgl lvgl {lcd, touchPanel}; -Pinetime::Drivers::Bma421 motionSensor {twiMaster, motionSensorTwiAddress}; +Pinetime::Drivers::Infinisim::MotionSensors::Bma421 motionSensorImpl{}; +Pinetime::Drivers::MotionSensor motionSensor{motionSensorImpl}; Pinetime::Drivers::Hrs3300 heartRateSensor {twiMaster, heartRateSensorTwiAddress}; TimerHandle_t debounceTimer; @@ -688,12 +689,12 @@ class Framework { } else if (key == 'P') { this->print_memory_usage = false; } else if (key == 's') { - motionSensor.steps += 500; + motionSensorImpl.steps += 500; } else if (key == 'S') { - if (motionSensor.steps > 500) { - motionSensor.steps -= 500; + if (motionSensorImpl.steps > 500) { + motionSensorImpl.steps -= 500; } else { - motionSensor.steps = 0; + motionSensorImpl.steps = 0; } } else if (key == 'h') { if (heartRateController.State() == Pinetime::Controllers::HeartRateController::States::Stopped) { diff --git a/sim/components/motion/MotionController.cpp b/sim/components/motion/MotionController.cpp index 331b5df..6fea9d4 100644 --- a/sim/components/motion/MotionController.cpp +++ b/sim/components/motion/MotionController.cpp @@ -70,12 +70,12 @@ int32_t MotionController::currentShakeSpeed() { void MotionController::IsSensorOk(bool isOk) { isSensorOk = isOk; } -void MotionController::Init(Pinetime::Drivers::Bma421::DeviceTypes types) { +void MotionController::Init(Pinetime::Drivers::MotionSensors::DeviceTypes types) { switch (types) { - case Drivers::Bma421::DeviceTypes::BMA421: + case Drivers::MotionSensors::DeviceTypes::BMA421: this->deviceType = DeviceTypes::BMA421; break; - case Drivers::Bma421::DeviceTypes::BMA425: + case Drivers::MotionSensors::DeviceTypes::BMA425: this->deviceType = DeviceTypes::BMA425; break; default: diff --git a/sim/components/motion/MotionController.h b/sim/components/motion/MotionController.h index a16560b..734cce7 100644 --- a/sim/components/motion/MotionController.h +++ b/sim/components/motion/MotionController.h @@ -1,7 +1,7 @@ #pragma once +#include "drivers/MotionSensor.h" #include -#include //#include namespace Pinetime { @@ -48,7 +48,7 @@ namespace Pinetime { return deviceType; } - void Init(Pinetime::Drivers::Bma421::DeviceTypes types); + void Init(Pinetime::Drivers::MotionSensors::DeviceTypes types); // void SetService(Pinetime::Controllers::MotionService* service); private: diff --git a/sim/drivers/Bma421.cpp b/sim/drivers/Bma421.cpp deleted file mode 100644 index ba862b6..0000000 --- a/sim/drivers/Bma421.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "drivers/Bma421.h" -#include "sim/drivers/infinisim/TwiMaster.h" -#include -#include -#include - -using namespace Pinetime::Drivers; - -namespace { -// int8_t user_i2c_read(uint8_t reg_addr, uint8_t* reg_data, uint32_t length, void* intf_ptr) { -// auto bma421 = static_cast(intf_ptr); -// bma421->Read(reg_addr, reg_data, length); -// return 0; -// } -// -// int8_t user_i2c_write(uint8_t reg_addr, const uint8_t* reg_data, uint32_t length, void* intf_ptr) { -// auto bma421 = static_cast(intf_ptr); -// bma421->Write(reg_addr, reg_data, length); -// return 0; -// } -// -// void user_delay(uint32_t period_us, void* intf_ptr) { -// nrf_delay_us(period_us); -// } -} - -Bma421::Bma421(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, deviceAddress {twiAddress} { -// bma.intf = BMA4_I2C_INTF; -// bma.bus_read = user_i2c_read; -// bma.bus_write = user_i2c_write; -// bma.variant = BMA42X_VARIANT; -// bma.intf_ptr = this; -// bma.delay_us = user_delay; -// bma.read_write_len = 16; -} - -void Bma421::Init() { - if (not isResetOk) - return; // Call SoftReset (and reset TWI device) first! - -// auto ret = bma423_init(&bma); -// if (ret != BMA4_OK) -// return; - - switch(bma.chip_id) { - case BMA423_CHIP_ID: deviceType = DeviceTypes::BMA421; break; - case BMA425_CHIP_ID: deviceType = DeviceTypes::BMA425; break; - default: deviceType = DeviceTypes::Unknown; break; - } - -// ret = bma423_write_config_file(&bma); -// if (ret != BMA4_OK) -// return; -// -// ret = bma4_set_interrupt_mode(BMA4_LATCH_MODE, &bma); -// if (ret != BMA4_OK) -// return; -// -// ret = bma423_feature_enable(BMA423_STEP_CNTR, 1, &bma); -// if (ret != BMA4_OK) -// return; -// -// ret = bma423_step_detector_enable(0, &bma); -// if (ret != BMA4_OK) -// return; -// -// ret = bma4_set_accel_enable(1, &bma); -// if (ret != BMA4_OK) -// return; -// -// struct bma4_accel_config accel_conf; -// accel_conf.odr = BMA4_OUTPUT_DATA_RATE_100HZ; -// accel_conf.range = BMA4_ACCEL_RANGE_2G; -// accel_conf.bandwidth = BMA4_ACCEL_NORMAL_AVG4; -// accel_conf.perf_mode = BMA4_CIC_AVG_MODE; -// ret = bma4_set_accel_config(&accel_conf, &bma); -// if (ret != BMA4_OK) -// return; -// - isOk = true; -} - -void Bma421::Reset() { - uint8_t data = 0xb6; - twiMaster.Write(deviceAddress, 0x7E, &data, 1); -} - -void Bma421::Read(uint8_t registerAddress, uint8_t* buffer, size_t size) { - twiMaster.Read(deviceAddress, registerAddress, buffer, size); -} - -void Bma421::Write(uint8_t registerAddress, const uint8_t* data, size_t size) { - twiMaster.Write(deviceAddress, registerAddress, data, size); -} - -Bma421::Values Bma421::Process() { - if (not isOk) - return {}; -// struct bma4_accel data; -// bma4_read_accel_xyz(&data, &bma); -// -// uint32_t steps = 0; -// bma423_step_counter_output(&steps, &bma); -// -// int32_t temperature = 0; -// bma4_get_temperature(&temperature, BMA4_DEG, &bma); -// temperature = temperature / 1000; -// -// uint8_t activity = 0; -// bma423_activity_output(&activity, &bma); -// -// // X and Y axis are swapped because of the way the sensor is mounted in the PineTime -// return {steps, data.y, data.x, data.z}; - return {steps, 0, 0, 0}; -} -bool Bma421::IsOk() const { - return isOk; -} - -void Bma421::ResetStepCounter() { -// bma423_reset_step_counter(&bma); - steps = 0; -} - -void Bma421::SoftReset() { -// auto ret = bma4_soft_reset(&bma); -// if (ret == BMA4_OK) { -// isResetOk = true; -// nrf_delay_ms(1); -// } -} -Bma421::DeviceTypes Bma421::DeviceType() const { - return deviceType; -} diff --git a/sim/drivers/Bma421.h b/sim/drivers/Bma421.h deleted file mode 100644 index 59b3ca0..0000000 --- a/sim/drivers/Bma421.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include "port/TwiMaster.h" - -namespace Pinetime { - namespace Drivers { - class Bma421 { - public: - enum class DeviceTypes : uint8_t { - Unknown, - BMA421, - BMA425 - }; - struct Values { - uint32_t steps; - int16_t x; - int16_t y; - int16_t z; - }; - Bma421(TwiMaster& twiMaster, uint8_t twiAddress); - Bma421(const Bma421&) = delete; - Bma421& operator=(const Bma421&) = delete; - Bma421(Bma421&&) = delete; - Bma421& operator=(Bma421&&) = delete; - - /// The chip freezes the TWI bus after the softreset operation. Softreset is separated from the - /// Init() method to allow the caller to uninit and then reinit the TWI device after the softreset. - void SoftReset(); - void Init(); - Values Process(); - void ResetStepCounter(); - - void Read(uint8_t registerAddress, uint8_t* buffer, size_t size); - void Write(uint8_t registerAddress, const uint8_t* data, size_t size); - - bool IsOk() const; - DeviceTypes DeviceType() const; - - // lv_sim: returned by Process(), public to be modified by main.cpp - uint32_t steps = 0; - - private: - void Reset(); - - TwiMaster& twiMaster; - uint8_t deviceAddress = 0x18; - bma4_dev bma; - bool isOk = true; - bool isResetOk = false; - DeviceTypes deviceType = DeviceTypes::Unknown; - }; - } -} \ No newline at end of file diff --git a/sim/drivers/infinisim/Bma421.cpp b/sim/drivers/infinisim/Bma421.cpp new file mode 100644 index 0000000..85705ba --- /dev/null +++ b/sim/drivers/infinisim/Bma421.cpp @@ -0,0 +1,36 @@ +#include "Bma421.h" +#include "sim/drivers/infinisim/TwiMaster.h" + +using namespace Pinetime::Drivers::Infinisim::MotionSensors; + +void Bma421::Init() { + +} + +void Bma421::Read(uint8_t registerAddress, uint8_t* buffer, size_t size) { + +} + +void Bma421::Write(uint8_t registerAddress, const uint8_t* data, size_t size) { + +} + +Pinetime::Drivers::MotionSensors::Values Bma421::Process() { + return {steps, 0, 0, 0}; +} + +bool Bma421::IsOk() const { + return true; +} + +void Bma421::ResetStepCounter() { + steps = 0; +} + +void Bma421::SoftReset() { + +} + +Pinetime::Drivers::MotionSensors::DeviceTypes Bma421::DeviceType() const { + return Pinetime::Drivers::MotionSensors::DeviceTypes::BMA425; +} diff --git a/sim/drivers/infinisim/Bma421.h b/sim/drivers/infinisim/Bma421.h new file mode 100644 index 0000000..0fcf470 --- /dev/null +++ b/sim/drivers/infinisim/Bma421.h @@ -0,0 +1,46 @@ +#pragma once +#include "port/TwiMaster.h" +#include +#include +#include +#include "drivers/MotionSensor.h" +#include + +namespace Pinetime { + namespace Drivers { + namespace Infinisim { + namespace MotionSensors { + class Bma421 { + public: + enum class DeviceTypes : uint8_t { Unknown, BMA421, BMA425 }; + struct Values { + uint32_t steps; + int16_t x; + int16_t y; + int16_t z; + }; + Bma421() = default; + Bma421(const Bma421 &) = delete; + Bma421 &operator=(const Bma421 &) = delete; + Bma421(Bma421 &&) = delete; + Bma421 &operator=(Bma421 &&) = delete; + + /// The chip freezes the TWI bus after the softreset operation. Softreset is separated from the Init() method to allow the caller to uninit and then reinit the TWI device after the softreset. + void SoftReset(); + void Init(); + Pinetime::Drivers::MotionSensors::Values Process(); + void ResetStepCounter(); + + void Read(uint8_t registerAddress, uint8_t *buffer, size_t size); + void Write(uint8_t registerAddress, const uint8_t *data, size_t size); + + bool IsOk() const; + Pinetime::Drivers::MotionSensors::DeviceTypes DeviceType() const; + + // lv_sim: returned by Process(), public to be modified by main.cpp + uint32_t steps = 0; + }; + } + } + } +} \ No newline at end of file diff --git a/sim/port/MotionSensor.h b/sim/port/MotionSensor.h new file mode 100644 index 0000000..61ecf6a --- /dev/null +++ b/sim/port/MotionSensor.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/MotionSensor.h" +#include "sim/drivers/infinisim/Bma421.h" + +namespace Pinetime { + namespace Drivers { + using MotionSensor = Interface::MotionSensor; + } +} From 99122bce6469945e41f33db26a0fd359258c1944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Wed, 28 Dec 2022 17:33:34 +0100 Subject: [PATCH 7/8] Integrate the refactoring of heart rate sensor and watchdog. --- CMakeLists.txt | 8 +-- main.cpp | 12 +++- sim/drivers/Hrs3300.cpp | 105 ---------------------------- sim/drivers/Hrs3300.h | 46 ------------ sim/drivers/Watchdog.cpp | 41 ----------- sim/drivers/Watchdog.h | 34 --------- sim/drivers/infinisim/Hrs3300.cpp | 43 ++++++++++++ sim/drivers/infinisim/Hrs3300.h | 28 ++++++++ sim/drivers/infinisim/Watchdog.cpp | 16 +++++ sim/drivers/infinisim/Watchdog.h | 23 ++++++ sim/heartratetask/HeartRateTask.cpp | 4 +- sim/heartratetask/HeartRateTask.h | 9 ++- sim/port/HeartRateSensor.h | 9 +++ sim/port/TwiMaster.h | 1 - sim/port/Watchdog.h | 9 +++ 15 files changed, 147 insertions(+), 241 deletions(-) delete mode 100644 sim/drivers/Hrs3300.cpp delete mode 100644 sim/drivers/Hrs3300.h delete mode 100644 sim/drivers/Watchdog.cpp delete mode 100644 sim/drivers/Watchdog.h create mode 100644 sim/drivers/infinisim/Hrs3300.cpp create mode 100644 sim/drivers/infinisim/Hrs3300.h create mode 100644 sim/drivers/infinisim/Watchdog.cpp create mode 100644 sim/drivers/infinisim/Watchdog.h create mode 100644 sim/port/HeartRateSensor.h create mode 100644 sim/port/Watchdog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c629044..ff5f5d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,14 +134,14 @@ target_sources(infinisim PUBLIC sim/components/heartrate/HeartRateController.cpp sim/components/motion/MotionController.h sim/components/motion/MotionController.cpp - sim/drivers/Watchdog.h - sim/drivers/Watchdog.cpp + sim/drivers/infinisim/Watchdog.h + sim/drivers/infinisim/Watchdog.cpp sim/drivers/infinisim/Bma421.h sim/drivers/infinisim/Bma421.cpp sim/drivers/infinisim/SdlTouchPanel.h sim/drivers/infinisim/SdlTouchPanel.cpp - sim/drivers/Hrs3300.h - sim/drivers/Hrs3300.cpp + sim/drivers/infinisim/Hrs3300.h + sim/drivers/infinisim/Hrs3300.cpp sim/drivers/infinisim/SpiMaster.h sim/drivers/infinisim/Spi.h sim/drivers/infinisim/Spi.cpp diff --git a/main.cpp b/main.cpp index c6e1a4f..663d249 100644 --- a/main.cpp +++ b/main.cpp @@ -27,7 +27,7 @@ #include "displayapp/lv_pinetime_theme.h" #endif #include "sim/drivers/infinisim/Bma421.h" -#include +#include "sim/drivers/infinisim/Hrs3300.h" #include "BootloaderVersion.h" #include "buttonhandler/ButtonHandler.h" @@ -42,10 +42,13 @@ #include "drivers/PinMap.h" #include "drivers/Spi.h" #include "drivers/St7789.h" +#include "drivers/Watchdog.h" +#include "drivers/WatchdogView.h" #include "sim/drivers/infinisim/SdlTouchPanel.h" #include "sim/drivers/infinisim/SpiMaster.h" #include "sim/drivers/infinisim/SpiNorFlash.h" #include "sim/drivers/infinisim/TwiMaster.h" +#include "sim/drivers/infinisim/Watchdog.h" #include "systemtask/SystemTask.h" #include "touchhandler/TouchHandler.h" @@ -74,6 +77,7 @@ #include "port/SpiNorFlash.h" #include "port/TwiMaster.h" #include "port/TouchPanel.h" +#include "port/Watchdog.h" /********************* * DEFINES @@ -323,7 +327,8 @@ Pinetime::Components::LittleVgl lvgl {lcd, touchPanel}; Pinetime::Drivers::Infinisim::MotionSensors::Bma421 motionSensorImpl{}; Pinetime::Drivers::MotionSensor motionSensor{motionSensorImpl}; -Pinetime::Drivers::Hrs3300 heartRateSensor {twiMaster, heartRateSensorTwiAddress}; +Pinetime::Drivers::Infinisim::HeartRateSensors::Hrs3300 heartRateSensorImpl; +Pinetime::Drivers::HeartRateSensor heartRateSensor{heartRateSensorImpl}; TimerHandle_t debounceTimer; TimerHandle_t debounceChargeTimer; @@ -338,7 +343,8 @@ Pinetime::Controllers::Settings settingsController {fs}; Pinetime::Controllers::MotorController motorController {}; Pinetime::Controllers::DateTime dateTimeController {settingsController}; -Pinetime::Drivers::Watchdog watchdog; +Pinetime::Drivers::Infinisim::Watchdogs::Watchdog watchdogImpl; +Pinetime::Drivers::Watchdog watchdog{watchdogImpl}; Pinetime::Drivers::WatchdogView watchdogView(watchdog); Pinetime::Controllers::NotificationManager notificationManager; Pinetime::Controllers::MotionController motionController; diff --git a/sim/drivers/Hrs3300.cpp b/sim/drivers/Hrs3300.cpp deleted file mode 100644 index 4374dd4..0000000 --- a/sim/drivers/Hrs3300.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - SPDX-License-Identifier: LGPL-3.0-or-later - Original work Copyright (C) 2020 Daniel Thompson - C++ port Copyright (C) 2021 Jean-François Milants -*/ - -#include "drivers/Hrs3300.h" -#include -#include - -#include -#include -#include - -using namespace Pinetime::Drivers; -/** Driver for the HRS3300 heart rate sensor. - * Original implementation from wasp-os : https://github.com/daniel-thompson/wasp-os/blob/master/wasp/drivers/hrs3300.py - */ -Hrs3300::Hrs3300(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, twiAddress {twiAddress} { -} - -void Hrs3300::Init() { - nrf_gpio_cfg_input(30, NRF_GPIO_PIN_NOPULL); - - Disable(); -// vTaskDelay(100); - - // HRS disabled, 12.5 ms wait time between cycles, (partly) 20mA drive - WriteRegister(static_cast(Registers::Enable), 0x60); - - // (partly) 20mA drive, power on, "magic" (datasheet says both - // "reserved" and "set low nibble to 8" but 0xe gives better results - // and is used by at least two other HRS3300 drivers - WriteRegister(static_cast(Registers::PDriver), 0x6E); - - // HRS and ALS both in 16-bit mode - WriteRegister(static_cast(Registers::Res), 0x88); - - // 64x gain - WriteRegister(static_cast(Registers::Hgain), 0x10); -} - -void Hrs3300::Enable() { - NRF_LOG_INFO("ENABLE"); - auto value = ReadRegister(static_cast(Registers::Enable)); - value |= 0x80; - WriteRegister(static_cast(Registers::Enable), value); -} - -void Hrs3300::Disable() { - NRF_LOG_INFO("DISABLE"); - auto value = ReadRegister(static_cast(Registers::Enable)); - value &= ~0x80; - WriteRegister(static_cast(Registers::Enable), value); -} - -uint16_t Hrs3300::ReadHrs() { - auto m = ReadRegister(static_cast(Registers::C0DataM)); - auto h = ReadRegister(static_cast(Registers::C0DataH)); - auto l = ReadRegister(static_cast(Registers::C0dataL)); - return (m << 8) | ((h & 0x0f) << 4) | (l & 0x0f) | ((l & 0x30) << 12); -} - -uint16_t Hrs3300::ReadAls() { - auto m = ReadRegister(static_cast(Registers::C1dataM)); - auto h = ReadRegister(static_cast(Registers::C1dataH)); - auto l = ReadRegister(static_cast(Registers::C1dataL)); - return (m << 3) | ((h & 0x3f) << 11) | (l & 0x07); -} - -void Hrs3300::SetGain(uint8_t gain) { - constexpr uint8_t maxGain = 64U; - gain = std::min(gain, maxGain); - uint8_t hgain = 0; - while ((1 << hgain) < gain) { - ++hgain; - } - - WriteRegister(static_cast(Registers::Hgain), hgain << 2); -} - -void Hrs3300::SetDrive(uint8_t drive) { - auto en = ReadRegister(static_cast(Registers::Enable)); - auto pd = ReadRegister(static_cast(Registers::PDriver)); - - en = (en & 0xf7) | ((drive & 2) << 2); - pd = (pd & 0xbf) | ((drive & 1) << 6); - - WriteRegister(static_cast(Registers::Enable), en); - WriteRegister(static_cast(Registers::PDriver), pd); -} - -void Hrs3300::WriteRegister(uint8_t reg, uint8_t data) { - auto ret = twiMaster.Write(twiAddress, reg, &data, 1); - if (ret != TwiMaster::ErrorCodes::NoError) - NRF_LOG_INFO("WRITE ERROR"); -} - -uint8_t Hrs3300::ReadRegister(uint8_t reg) { - uint8_t value; - auto ret = twiMaster.Read(twiAddress, reg, &value, 1); - if (ret != TwiMaster::ErrorCodes::NoError) - NRF_LOG_INFO("READ ERROR"); - return value; -} diff --git a/sim/drivers/Hrs3300.h b/sim/drivers/Hrs3300.h deleted file mode 100644 index 66e938f..0000000 --- a/sim/drivers/Hrs3300.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include "port/TwiMaster.h" - -namespace Pinetime { - namespace Drivers { - class Hrs3300 { - public: - enum class Registers : uint8_t { - Id = 0x00, - Enable = 0x01, - EnableHen = 0x80, - C1dataM = 0x08, - C0DataM = 0x09, - C0DataH = 0x0a, - PDriver = 0x0c, - C1dataH = 0x0d, - C1dataL = 0x0e, - C0dataL = 0x0f, - Res = 0x16, - Hgain = 0x17 - }; - - Hrs3300(TwiMaster& twiMaster, uint8_t twiAddress); - Hrs3300(const Hrs3300&) = delete; - Hrs3300& operator=(const Hrs3300&) = delete; - Hrs3300(Hrs3300&&) = delete; - Hrs3300& operator=(Hrs3300&&) = delete; - - void Init(); - void Enable(); - void Disable(); - uint16_t ReadHrs(); - uint16_t ReadAls(); - void SetGain(uint8_t gain); - void SetDrive(uint8_t drive); - - private: - TwiMaster& twiMaster; - uint8_t twiAddress; - - void WriteRegister(uint8_t reg, uint8_t data); - uint8_t ReadRegister(uint8_t reg); - }; - } -} diff --git a/sim/drivers/Watchdog.cpp b/sim/drivers/Watchdog.cpp deleted file mode 100644 index 4f913bd..0000000 --- a/sim/drivers/Watchdog.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "drivers/Watchdog.h" -using namespace Pinetime::Drivers; - -void Watchdog::Setup(uint8_t timeoutSeconds) { - resetReason = ActualResetReason(); -} - -void Watchdog::Start() { -} - -void Watchdog::Kick() { -} - -Watchdog::ResetReasons Watchdog::ActualResetReason() const { - return ResetReasons::ResetPin; -} - -const char* Watchdog::ResetReasonToString(Watchdog::ResetReasons reason) { - switch (reason) { - case ResetReasons::ResetPin: - return "Reset pin"; - case ResetReasons::Watchdog: - return "Watchdog"; - case ResetReasons::DebugInterface: - return "Debug interface"; - case ResetReasons::LpComp: - return "LPCOMP"; - case ResetReasons::SystemOff: - return "System OFF"; - case ResetReasons::CpuLockup: - return "CPU Lock-up"; - case ResetReasons::SoftReset: - return "Soft reset"; - case ResetReasons::NFC: - return "NFC"; - case ResetReasons::HardReset: - return "Hard reset"; - default: - return "Unknown"; - } -} diff --git a/sim/drivers/Watchdog.h b/sim/drivers/Watchdog.h deleted file mode 100644 index 03807d6..0000000 --- a/sim/drivers/Watchdog.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#include - -namespace Pinetime { - namespace Drivers { - class Watchdog { - public: - enum class ResetReasons { ResetPin, Watchdog, SoftReset, CpuLockup, SystemOff, LpComp, DebugInterface, NFC, HardReset }; - void Setup(uint8_t timeoutSeconds); - void Start(); - void Kick(); - ResetReasons ResetReason() const { - return resetReason; - } - static const char* ResetReasonToString(ResetReasons reason); - - private: - ResetReasons resetReason; - ResetReasons ActualResetReason() const; - }; - - class WatchdogView { - public: - WatchdogView(const Watchdog& watchdog) : watchdog {watchdog} { - } - Watchdog::ResetReasons ResetReason() const { - return watchdog.ResetReason(); - } - - private: - const Watchdog& watchdog; - }; - } -} diff --git a/sim/drivers/infinisim/Hrs3300.cpp b/sim/drivers/infinisim/Hrs3300.cpp new file mode 100644 index 0000000..84e3b8d --- /dev/null +++ b/sim/drivers/infinisim/Hrs3300.cpp @@ -0,0 +1,43 @@ +/* + SPDX-License-Identifier: LGPL-3.0-or-later + Original work Copyright (C) 2020 Daniel Thompson + C++ port Copyright (C) 2021 Jean-François Milants +*/ + +#include "Hrs3300.h" +#include "sim/nrfx/hal/nrf_gpio.h" +#include + +#include "sim/FreeRTOS.h" +#include "sim/libraries/log/nrf_log.h" +#include "sim/task.h" + +using namespace Pinetime::Drivers::Infinisim::HeartRateSensors; + +void Hrs3300::Init() { + +} + +void Hrs3300::Enable() { + +} + +void Hrs3300::Disable() { + +} + +uint32_t Hrs3300::ReadHrs() { + +} + +uint32_t Hrs3300::ReadAls() { + +} + +void Hrs3300::SetGain(uint8_t gain) { + +} + +void Hrs3300::SetDrive(uint8_t drive) { + +} diff --git a/sim/drivers/infinisim/Hrs3300.h b/sim/drivers/infinisim/Hrs3300.h new file mode 100644 index 0000000..adcf5ed --- /dev/null +++ b/sim/drivers/infinisim/Hrs3300.h @@ -0,0 +1,28 @@ +#pragma once + +#include "port/TwiMaster.h" + +namespace Pinetime { + namespace Drivers { + namespace Infinisim { + namespace HeartRateSensors { + class Hrs3300 { + public: + Hrs3300() = default; + Hrs3300(const Hrs3300 &) = delete; + Hrs3300 &operator=(const Hrs3300 &) = delete; + Hrs3300(Hrs3300 &&) = delete; + Hrs3300 &operator=(Hrs3300 &&) = delete; + + void Init(); + void Enable(); + void Disable(); + uint32_t ReadHrs(); + uint32_t ReadAls(); + void SetGain(uint8_t gain); + void SetDrive(uint8_t drive); + }; + } + } + } +} diff --git a/sim/drivers/infinisim/Watchdog.cpp b/sim/drivers/infinisim/Watchdog.cpp new file mode 100644 index 0000000..4de2842 --- /dev/null +++ b/sim/drivers/infinisim/Watchdog.cpp @@ -0,0 +1,16 @@ +#include "Watchdog.h" +using namespace Pinetime::Drivers::Infinisim::Watchdogs; + +void Watchdog::Setup(uint8_t timeoutSeconds) { + resetReason = ActualResetReason(); +} + +void Watchdog::Start() { +} + +void Watchdog::Kick() { +} + +Pinetime::Drivers::Watchdogs::ResetReasons Watchdog::ActualResetReason() const { + return Pinetime::Drivers::Watchdogs::ResetReasons::ResetPin; +} diff --git a/sim/drivers/infinisim/Watchdog.h b/sim/drivers/infinisim/Watchdog.h new file mode 100644 index 0000000..c003b23 --- /dev/null +++ b/sim/drivers/infinisim/Watchdog.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include "drivers/Watchdog.h" + +namespace Pinetime { + namespace Drivers { + namespace Infinisim { + namespace Watchdogs { + class Watchdog { + public: + void Setup(uint8_t timeoutSeconds); + void Start(); + void Kick(); + Pinetime::Drivers::Watchdogs::ResetReasons ResetReason() const { return resetReason; } + + private: + Pinetime::Drivers::Watchdogs::ResetReasons resetReason; + Pinetime::Drivers::Watchdogs::ResetReasons ActualResetReason() const; + }; + } + } + } +} diff --git a/sim/heartratetask/HeartRateTask.cpp b/sim/heartratetask/HeartRateTask.cpp index 21526a1..79d7fe3 100644 --- a/sim/heartratetask/HeartRateTask.cpp +++ b/sim/heartratetask/HeartRateTask.cpp @@ -1,11 +1,11 @@ #include "heartratetask/HeartRateTask.h" -#include +#include "sim/drivers/infinisim/Hrs3300.h" #include #include using namespace Pinetime::Applications; -HeartRateTask::HeartRateTask(Drivers::Hrs3300& heartRateSensor, Controllers::HeartRateController& controller) +HeartRateTask::HeartRateTask(Drivers::HeartRateSensor& heartRateSensor, Controllers::HeartRateController& controller) : heartRateSensor {heartRateSensor}, controller {controller} { //, ppg{} { } diff --git a/sim/heartratetask/HeartRateTask.h b/sim/heartratetask/HeartRateTask.h index c67694d..75eed70 100644 --- a/sim/heartratetask/HeartRateTask.h +++ b/sim/heartratetask/HeartRateTask.h @@ -3,11 +3,10 @@ //#include #include //#include +#include "port/HeartRateSensor.h" namespace Pinetime { - namespace Drivers { - class Hrs3300; - } + namespace Controllers { class HeartRateController; } @@ -17,7 +16,7 @@ namespace Pinetime { enum class Messages : uint8_t { GoToSleep, WakeUp, StartMeasurement, StopMeasurement }; enum class States { Idle, Running }; - explicit HeartRateTask(Drivers::Hrs3300& heartRateSensor, Controllers::HeartRateController& controller); + explicit HeartRateTask(Drivers::HeartRateSensor& heartRateSensor, Controllers::HeartRateController& controller); void Start(); void Work(); void PushMessage(Messages msg); @@ -30,7 +29,7 @@ namespace Pinetime { // TaskHandle_t taskHandle; QueueHandle_t messageQueue; States state = States::Running; - Drivers::Hrs3300& heartRateSensor; + Drivers::HeartRateSensor& heartRateSensor; Controllers::HeartRateController& controller; // Controllers::Ppg ppg; bool measurementStarted = false; diff --git a/sim/port/HeartRateSensor.h b/sim/port/HeartRateSensor.h new file mode 100644 index 0000000..cccb548 --- /dev/null +++ b/sim/port/HeartRateSensor.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/HeartRateSensor.h" +#include "sim/drivers/infinisim/Hrs3300.h" + +namespace Pinetime { + namespace Drivers { + using HeartRateSensor = Interface::HeartRateSensor; + } +} diff --git a/sim/port/TwiMaster.h b/sim/port/TwiMaster.h index df47fa8..055b668 100644 --- a/sim/port/TwiMaster.h +++ b/sim/port/TwiMaster.h @@ -1,6 +1,5 @@ #pragma once #include "drivers/TwiMaster.h" -#include "sim/drivers/infinisim/SdlTouchPanel.h" #include namespace Pinetime { diff --git a/sim/port/Watchdog.h b/sim/port/Watchdog.h new file mode 100644 index 0000000..ab523e5 --- /dev/null +++ b/sim/port/Watchdog.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/Watchdog.h" +#include "sim/drivers/infinisim/Watchdog.h" + +namespace Pinetime { + namespace Drivers { + using Watchdog = Interface::Watchdog; + } +} From b0a37f933bae12d13b0e313d26dd3479a6b25b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Wed, 28 Dec 2022 18:13:04 +0100 Subject: [PATCH 8/8] Integrate the refactoring of display. --- CMakeLists.txt | 4 ++-- main.cpp | 22 ++++-------------- sim/displayapp/LittleVgl.cpp | 6 +++-- sim/displayapp/LittleVgl.h | 9 +++----- sim/drivers/infinisim/St7789.cpp | 39 ++++++++++++++++++++++++++++++++ sim/drivers/infinisim/St7789.h | 36 +++++++++++++++++++++++++++++ sim/port/Display.h | 9 ++++++++ 7 files changed, 97 insertions(+), 28 deletions(-) create mode 100644 sim/drivers/infinisim/St7789.cpp create mode 100644 sim/drivers/infinisim/St7789.h create mode 100644 sim/port/Display.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ff5f5d6..a8f29f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,6 +149,8 @@ target_sources(infinisim PUBLIC sim/drivers/infinisim/TwiMaster.cpp sim/drivers/infinisim/SpiNorFlash.h sim/drivers/infinisim/SpiNorFlash.cpp + sim/drivers/infinisim/St7789.cpp + sim/drivers/infinisim/St7789.h sim/heartratetask/HeartRateTask.h sim/heartratetask/HeartRateTask.cpp ) @@ -215,8 +217,6 @@ target_sources(infinisim PUBLIC ${InfiniTime_DIR}/src/components/timer/TimerController.cpp ${InfiniTime_DIR}/src/drivers/PinMap.h ${InfiniTime_DIR}/src/drivers/Spi.h - ${InfiniTime_DIR}/src/drivers/St7789.h - ${InfiniTime_DIR}/src/drivers/St7789.cpp ${InfiniTime_DIR}/src/touchhandler/TouchHandler.h ${InfiniTime_DIR}/src/touchhandler/TouchHandler.cpp ${InfiniTime_DIR}/src/systemtask/SystemTask.h diff --git a/main.cpp b/main.cpp index 663d249..b3c1f84 100644 --- a/main.cpp +++ b/main.cpp @@ -41,7 +41,7 @@ #include "components/motor/MotorController.h" #include "drivers/PinMap.h" #include "drivers/Spi.h" -#include "drivers/St7789.h" +#include "drivers/Display.h" #include "drivers/Watchdog.h" #include "drivers/WatchdogView.h" #include "sim/drivers/infinisim/SdlTouchPanel.h" @@ -78,6 +78,7 @@ #include "port/TwiMaster.h" #include "port/TouchPanel.h" #include "port/Watchdog.h" +#include "port/Display.h" /********************* * DEFINES @@ -292,20 +293,12 @@ void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action /********************** * GLOBAL FUNCTIONS **********************/ -static constexpr uint8_t touchPanelTwiAddress = 0x15; -static constexpr uint8_t motionSensorTwiAddress = 0x18; -static constexpr uint8_t heartRateSensorTwiAddress = 0x44; Pinetime::Drivers::Infinisim::SpiMaster spiImpl {}; Pinetime::Drivers::SpiMaster spi {spiImpl}; - -Pinetime::Drivers::Infinisim::Spi lcdSpiImpl {spiImpl, Pinetime::PinMap::SpiLcdCsn}; -Pinetime::Drivers::Spi lcdSpi {lcdSpiImpl}; -Pinetime::Drivers::St7789 lcd {lcdSpi, Pinetime::PinMap::LcdDataCommand}; - -Pinetime::Drivers::Infinisim::Spi flashSpiImpl {spiImpl, Pinetime::PinMap::SpiFlashCsn}; -Pinetime::Drivers::Spi flashSpi {flashSpiImpl}; +Pinetime::Drivers::Infinisim::Displays::St7789 lcdImpl; +Pinetime::Drivers::Display lcd {lcdImpl}; Pinetime::Drivers::Infinisim::SpiNorFlash spiNorFlashImpl {"spiNorFlash.raw"}; Pinetime::Drivers::SpiNorFlash spiNorFlash {spiNorFlashImpl}; @@ -316,13 +309,6 @@ Pinetime::Drivers::TwiMaster twiMaster{twiMasterImpl}; Pinetime::Drivers::Infinisim::TouchPanels::SdlTouchPanel touchPanelImpl; Pinetime::Drivers::TouchPanel touchPanel {touchPanelImpl}; -//#ifdef PINETIME_IS_RECOVERY -// #include "displayapp/DummyLittleVgl.h" -// #include "displayapp/DisplayAppRecovery.h" -//#else -// #include "displayapp/LittleVgl.h" -// #include "displayapp/DisplayApp.h" -//#endif Pinetime::Components::LittleVgl lvgl {lcd, touchPanel}; Pinetime::Drivers::Infinisim::MotionSensors::Bma421 motionSensorImpl{}; diff --git a/sim/displayapp/LittleVgl.cpp b/sim/displayapp/LittleVgl.cpp index 9fe2291..aa56af3 100644 --- a/sim/displayapp/LittleVgl.cpp +++ b/sim/displayapp/LittleVgl.cpp @@ -10,7 +10,9 @@ #include ////#include #include "drivers/TouchPanel.h" -#include "drivers/St7789.h" +#include "drivers/Display.h" +#include "port/Display.h" + // lv-sim monitor display driver for monitor_flush() function #include "lv_drivers/display/monitor.h" @@ -41,7 +43,7 @@ bool touchpad_read(lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { return lvgl->GetTouchPadInfo(data); } -LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::TouchPanel& touchPanel) +LittleVgl::LittleVgl(Pinetime::Drivers::Display& lcd, Pinetime::Drivers::TouchPanel& touchPanel) : lcd {lcd}, touchPanel {touchPanel} { } diff --git a/sim/displayapp/LittleVgl.h b/sim/displayapp/LittleVgl.h index 425d2d1..d830c18 100644 --- a/sim/displayapp/LittleVgl.h +++ b/sim/displayapp/LittleVgl.h @@ -1,18 +1,15 @@ #pragma once #include "port/TouchPanel.h" +#include "port/Display.h" #include namespace Pinetime { - namespace Drivers { - class St7789; - } - namespace Components { class LittleVgl { public: enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; - LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::TouchPanel& touchPanel); + LittleVgl(Pinetime::Drivers::Display& lcd, Pinetime::Drivers::TouchPanel& touchPanel); LittleVgl(const LittleVgl&) = delete; LittleVgl& operator=(const LittleVgl&) = delete; @@ -39,7 +36,7 @@ namespace Pinetime { void InitTouchpad(); void InitTheme(); - Pinetime::Drivers::St7789& lcd; + Pinetime::Drivers::Display& lcd; Pinetime::Drivers::TouchPanel& touchPanel; lv_disp_buf_t disp_buf_2; diff --git a/sim/drivers/infinisim/St7789.cpp b/sim/drivers/infinisim/St7789.cpp new file mode 100644 index 0000000..845fad3 --- /dev/null +++ b/sim/drivers/infinisim/St7789.cpp @@ -0,0 +1,39 @@ +#include "St7789.h" +#include +#include +#include +#include "drivers/Spi.h" + +using namespace Pinetime::Drivers::Infinisim::Displays; + +void St7789::Init() { + +} + +void St7789::Uninit() { + +} + +void St7789::DrawPixel(uint16_t x, uint16_t y, uint32_t color) { + +} + +void St7789::DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t* data, size_t size) { + +} + +void St7789::Sleep() { + +} + +void St7789::Wakeup() { + +} + +void St7789::VerticalScrollDefinition(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines) { + +} + +void St7789::VerticalScrollStartAddress(uint16_t line) { + +} \ No newline at end of file diff --git a/sim/drivers/infinisim/St7789.h b/sim/drivers/infinisim/St7789.h new file mode 100644 index 0000000..8b2a50e --- /dev/null +++ b/sim/drivers/infinisim/St7789.h @@ -0,0 +1,36 @@ +#pragma once +#include "drivers/Spi.h" +#include +#include +#include "port/Spi.h" + +namespace Pinetime { + namespace Drivers { + namespace Infinisim { + namespace Displays { + class St7789 { + public: + St7789() = default; + St7789(const St7789 &) = delete; + St7789 &operator=(const St7789 &) = delete; + St7789(St7789 &&) = delete; + St7789 &operator=(St7789 &&) = delete; + + void Init(); + void Uninit(); + void DrawPixel(uint16_t x, uint16_t y, uint32_t color); + + void VerticalScrollDefinition(uint16_t topFixedLines, uint16_t scrollLines, + uint16_t bottomFixedLines); + void VerticalScrollStartAddress(uint16_t line); + + void DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, + const uint8_t *data, size_t size); + + void Sleep(); + void Wakeup(); + }; + } + } + } +} diff --git a/sim/port/Display.h b/sim/port/Display.h new file mode 100644 index 0000000..45876cf --- /dev/null +++ b/sim/port/Display.h @@ -0,0 +1,9 @@ +#pragma once +#include "drivers/Display.h" +#include "sim/drivers/infinisim/St7789.h" + +namespace Pinetime { + namespace Drivers { + using Display = Interface::Display; + } +}