Merge branch 'littlevgl'
# Conflicts: # src/DisplayApp/Screens/Clock.cpp # src/DisplayApp/Screens/Clock.h
This commit is contained in:
@@ -50,29 +50,58 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() {
|
||||
nrfx_twi_rx(&twi, address, touchData, 63);
|
||||
auto nbTouchPoints = touchData[2] & 0x0f;
|
||||
|
||||
uint8_t i = 0;
|
||||
// uint8_t i = 0;
|
||||
// NRF_LOG_INFO("#########################")
|
||||
for(int i = 0; i < 1; i++) {
|
||||
uint8_t pointId = (touchData[touchIdIndex + (touchStep * i)]) >> 4;
|
||||
if(nbTouchPoints == 0 && pointId == lastTouchId) return info;
|
||||
|
||||
// We fetch only the first touch point (the controller seems to handle only one anyway...)
|
||||
info.isTouch = true;
|
||||
|
||||
auto xHigh = touchData[touchXHighIndex + (touchStep * i)] & 0x0f;
|
||||
auto xLow = touchData[touchXLowIndex + (touchStep * i)];
|
||||
uint16_t x = (xHigh << 8) | xLow;
|
||||
|
||||
auto yHigh = touchData[touchYHighIndex + (touchStep * i)] & 0x0f;
|
||||
auto yLow = touchData[touchYLowIndex + (touchStep * i)];
|
||||
uint16_t y = (yHigh << 8) | yLow;
|
||||
auto xHigh = touchData[touchXHighIndex + (touchStep * i)] & 0x0f;
|
||||
auto xLow = touchData[touchXLowIndex + (touchStep * i)];
|
||||
uint16_t x = (xHigh << 8) | xLow;
|
||||
|
||||
auto yHigh = touchData[touchYHighIndex + (touchStep * i)] & 0x0f;
|
||||
auto yLow = touchData[touchYLowIndex + (touchStep * i)];
|
||||
uint16_t y = (yHigh << 8) | yLow;
|
||||
|
||||
auto action = touchData[touchEventIndex + (touchStep * i)] >> 6; /* 0 = Down, 1 = Up, 2 = contact*/
|
||||
auto finger = touchData[touchIdIndex + (touchStep * i)] >> 4;
|
||||
auto pressure = touchData[touchXYIndex + (touchStep * i)];
|
||||
auto area = touchData[touchMiscIndex + (touchStep * i)] >> 4;
|
||||
|
||||
info.x = x;
|
||||
info.y = y;
|
||||
info.action = action;
|
||||
info.gesture = static_cast<Gestures>(touchData[gestureIndex]);
|
||||
|
||||
// NRF_LOG_INFO("---------------")
|
||||
// NRF_LOG_INFO("ID : %d", pointId);
|
||||
// NRF_LOG_INFO("NB : %d", nbTouchPoints);
|
||||
// NRF_LOG_INFO("X/Y :%d / %d", info.x, info.y);
|
||||
// NRF_LOG_INFO("Action : %d", action);
|
||||
// NRF_LOG_INFO("Finger : %d", finger);
|
||||
// NRF_LOG_INFO("Pressure : %d", pressure);
|
||||
// NRF_LOG_INFO("area : %d", area);
|
||||
// NRF_LOG_INFO("Touch : %s", info.isTouch?"Yes" : "No");
|
||||
// switch(info.gesture) {// gesture
|
||||
// case Gestures::None: NRF_LOG_INFO("Gesture : None"); break;
|
||||
// case Gestures::SlideDown: NRF_LOG_INFO("Gesture : Slide Down"); break;
|
||||
// case Gestures::SlideUp: NRF_LOG_INFO("Gesture : Slide Up"); break;
|
||||
// case Gestures::SlideLeft: NRF_LOG_INFO("Gesture : Slide Left"); break;
|
||||
// case Gestures::SlideRight: NRF_LOG_INFO("Gesture : Slide Right"); break;
|
||||
// case Gestures::SingleTap: NRF_LOG_INFO("Gesture : Single click"); break;
|
||||
// case Gestures::DoubleTap: NRF_LOG_INFO("Gesture : Double click"); break;
|
||||
// case Gestures::LongPress: NRF_LOG_INFO("Gesture : Long press"); break;
|
||||
// default : NRF_LOG_INFO("Unknown"); break;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
auto action = touchData[touchEventIndex + (touchStep * i)] >> 6; /* 0 = Down, 1 = Up, 2 = contact*/
|
||||
auto finger = touchData[touchIdIndex + (touchStep * i)] >> 4;
|
||||
auto pressure = touchData[touchXYIndex + (touchStep * i)];
|
||||
auto area = touchData[touchMiscIndex + (touchStep * i)] >> 4;
|
||||
|
||||
info.x = x;
|
||||
info.y = y;
|
||||
info.action = action;
|
||||
return info;
|
||||
}
|
||||
|
||||
|
@@ -6,6 +6,16 @@ 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;
|
||||
uint16_t y;
|
||||
@@ -13,6 +23,7 @@ namespace Pinetime {
|
||||
uint8_t finger;
|
||||
uint8_t pressure;
|
||||
uint8_t area;
|
||||
Gestures gesture;
|
||||
bool isTouch = false;
|
||||
};
|
||||
|
||||
@@ -36,6 +47,7 @@ namespace Pinetime {
|
||||
static constexpr uint8_t touchYLowIndex = 6;
|
||||
static constexpr uint8_t touchIdIndex = 5;
|
||||
static constexpr uint8_t touchStep = 6;
|
||||
static constexpr uint8_t gestureIndex = 1;
|
||||
|
||||
uint8_t touchData[63];
|
||||
|
||||
|
49
src/drivers/DebugPins.cpp
Normal file
49
src/drivers/DebugPins.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <hal/nrf_gpio.h>
|
||||
#include "DebugPins.h"
|
||||
|
||||
#ifdef USE_DEBUG_PINS
|
||||
void debugpins_init() {
|
||||
nrf_gpio_cfg_output(DebugPin0);
|
||||
nrf_gpio_pin_clear(DebugPin0);
|
||||
|
||||
nrf_gpio_cfg_output(DebugPin1);
|
||||
nrf_gpio_pin_clear(DebugPin1);
|
||||
|
||||
nrf_gpio_cfg_output(DebugPin2);
|
||||
nrf_gpio_pin_clear(DebugPin2);
|
||||
|
||||
nrf_gpio_cfg_output(DebugPin3);
|
||||
nrf_gpio_pin_clear(DebugPin3);
|
||||
|
||||
nrf_gpio_cfg_output(DebugPin4);
|
||||
nrf_gpio_pin_clear(DebugPin4);
|
||||
}
|
||||
void debugpins_set(debugpins_pins pin) {
|
||||
nrf_gpio_pin_set((uint32_t)(pin));
|
||||
}
|
||||
|
||||
void debugpins_clear(debugpins_pins pin) {
|
||||
nrf_gpio_pin_clear((uint32_t)(pin));
|
||||
}
|
||||
|
||||
void debugpins_pulse(debugpins_pins pin) {
|
||||
nrf_gpio_pin_set((uint32_t)(pin));
|
||||
nrf_gpio_pin_clear((uint32_t)(pin));
|
||||
}
|
||||
#else
|
||||
void debugpins_init() {
|
||||
|
||||
}
|
||||
void debugpins_set(debugpins_pins pin) {
|
||||
|
||||
}
|
||||
|
||||
void debugpins_clear(debugpins_pins pin) {
|
||||
|
||||
}
|
||||
|
||||
void debugpins_pulse(debugpins_pins pin) {
|
||||
|
||||
}
|
||||
|
||||
#endif
|
25
src/drivers/DebugPins.h
Normal file
25
src/drivers/DebugPins.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef enum {
|
||||
DebugPin0 = 27,
|
||||
DebugPin1 = 29,
|
||||
DebugPin2 = 20,
|
||||
DebugPin3 = 17,
|
||||
DebugPin4 = 11,
|
||||
} debugpins_pins;
|
||||
|
||||
void debugpins_init();
|
||||
void debugpins_set(debugpins_pins pin);
|
||||
void debugpins_clear(debugpins_pins pin);
|
||||
void debugpins_pulse(debugpins_pins pin);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -1,7 +1,10 @@
|
||||
#include <FreeRTOS.h>
|
||||
#include <hal/nrf_gpio.h>
|
||||
#include <hal/nrf_spim.h>
|
||||
#include "SpiMaster.h"
|
||||
#include <algorithm>
|
||||
#include <task.h>
|
||||
|
||||
using namespace Pinetime::Drivers;
|
||||
|
||||
SpiMaster::SpiMaster(const SpiMaster::SpiModule spi, const SpiMaster::Parameters ¶ms) :
|
||||
@@ -96,7 +99,7 @@ void SpiMaster::DisableWorkaroundForFtpan58(NRF_SPIM_Type *spim, uint32_t ppi_ch
|
||||
spim->INTENSET = (1<<19);
|
||||
}
|
||||
|
||||
void SpiMaster::OnEndEvent(BufferProvider& provider) {
|
||||
void SpiMaster::OnEndEvent() {
|
||||
if(!busy) return;
|
||||
|
||||
auto s = currentBufferSize;
|
||||
@@ -110,24 +113,20 @@ void SpiMaster::OnEndEvent(BufferProvider& provider) {
|
||||
} else {
|
||||
uint8_t* buffer = nullptr;
|
||||
size_t size = 0;
|
||||
if(provider.GetNextBuffer(&buffer, size)) {
|
||||
currentBufferAddr = (uint32_t) buffer;
|
||||
currentBufferSize = size;
|
||||
auto s = currentBufferSize;
|
||||
auto currentSize = std::min((size_t)255, s);
|
||||
PrepareTx(currentBufferAddr, currentSize);
|
||||
currentBufferAddr += currentSize;
|
||||
currentBufferSize -= currentSize;
|
||||
busy = false;
|
||||
|
||||
spiBaseAddress->TASKS_START = 1;
|
||||
} else {
|
||||
busy = false;
|
||||
nrf_gpio_pin_set(pinCsn);
|
||||
|
||||
if(taskToNotify != nullptr) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
vTaskNotifyGiveFromISR(taskToNotify, &xHigherPriorityTaskWoken);
|
||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||
}
|
||||
|
||||
nrf_gpio_pin_set(pinCsn);
|
||||
}
|
||||
}
|
||||
|
||||
void SpiMaster::OnStartedEvent(BufferProvider& provider) {
|
||||
void SpiMaster::OnStartedEvent() {
|
||||
if(!busy) return;
|
||||
}
|
||||
|
||||
@@ -143,7 +142,7 @@ void SpiMaster::PrepareTx(const volatile uint32_t bufferAddress, const volatile
|
||||
|
||||
bool SpiMaster::Write(const uint8_t *data, size_t size) {
|
||||
if(data == nullptr) return false;
|
||||
|
||||
taskToNotify = xTaskGetCurrentTaskHandle();
|
||||
while(busy) {
|
||||
asm("nop");
|
||||
}
|
||||
|
@@ -1,8 +1,10 @@
|
||||
#pragma once
|
||||
#include <FreeRTOS.h>
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
#include <array>
|
||||
#include <atomic>
|
||||
#include <task.h>
|
||||
|
||||
#include "BufferProvider.h"
|
||||
namespace Pinetime {
|
||||
@@ -27,8 +29,8 @@ namespace Pinetime {
|
||||
bool Init();
|
||||
bool Write(const uint8_t* data, size_t size);
|
||||
|
||||
void OnStartedEvent(BufferProvider& provider);
|
||||
void OnEndEvent(BufferProvider& provider);
|
||||
void OnStartedEvent();
|
||||
void OnEndEvent();
|
||||
|
||||
void Sleep();
|
||||
void Wakeup();
|
||||
@@ -47,6 +49,7 @@ namespace Pinetime {
|
||||
volatile bool busy = false;
|
||||
volatile uint32_t currentBufferAddr = 0;
|
||||
volatile size_t currentBufferSize = 0;
|
||||
volatile TaskHandle_t taskToNotify;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
60
src/drivers/Watchdog.cpp
Normal file
60
src/drivers/Watchdog.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
#include <mdk/nrf52.h>
|
||||
#include <mdk/nrf52_bitfields.h>
|
||||
#include <nrf_soc.h>
|
||||
#include "Watchdog.h"
|
||||
using namespace Pinetime::Drivers;
|
||||
|
||||
|
||||
void Watchdog::Setup(uint8_t timeoutSeconds) {
|
||||
NRF_WDT->CONFIG &= ~(WDT_CONFIG_SLEEP_Msk << WDT_CONFIG_SLEEP_Pos);
|
||||
NRF_WDT->CONFIG |= (WDT_CONFIG_HALT_Run << WDT_CONFIG_SLEEP_Pos);
|
||||
|
||||
NRF_WDT->CONFIG &= ~(WDT_CONFIG_HALT_Msk << WDT_CONFIG_HALT_Pos);
|
||||
NRF_WDT->CONFIG |= (WDT_CONFIG_HALT_Pause << WDT_CONFIG_HALT_Pos);
|
||||
|
||||
/* timeout (s) = (CRV + 1) / 32768 */
|
||||
// JF : 7500 = 7.5s
|
||||
uint32_t crv = (((timeoutSeconds*1000u) << 15u) / 1000) - 1;
|
||||
NRF_WDT->CRV = crv;
|
||||
|
||||
/* Enable reload requests */
|
||||
NRF_WDT->RREN = (WDT_RREN_RR0_Enabled << WDT_RREN_RR0_Pos);
|
||||
}
|
||||
|
||||
void Watchdog::Start() {
|
||||
NRF_WDT->TASKS_START = 1;
|
||||
}
|
||||
|
||||
void Watchdog::Kick() {
|
||||
NRF_WDT->RR[0] = WDT_RR_RR_Reload;
|
||||
}
|
||||
|
||||
Watchdog::ResetReasons Watchdog::ResetReason() {
|
||||
uint32_t resetReason;
|
||||
sd_power_reset_reason_get(&resetReason);
|
||||
sd_power_reset_reason_clr(0xFFFFFFFF);
|
||||
if(resetReason & 0x01) return ResetReasons::ResetPin;
|
||||
if((resetReason >> 1) & 0x01) return ResetReasons::Watchdog;
|
||||
if((resetReason >> 2) & 0x01) return ResetReasons::SoftReset;
|
||||
if((resetReason >> 3) & 0x01) return ResetReasons::CpuLockup;
|
||||
if((resetReason >> 16) & 0x01) return ResetReasons::SystemOff;
|
||||
if((resetReason >> 17) & 0x01) return ResetReasons::LpComp;
|
||||
if((resetReason >> 18) & 0x01) return ResetReasons::DebugInterface;
|
||||
if((resetReason >> 19) & 0x01) return ResetReasons::NFC;
|
||||
return ResetReasons::HardReset;
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
}
|
17
src/drivers/Watchdog.h
Normal file
17
src/drivers/Watchdog.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
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();
|
||||
static const char* ResetReasonToString(ResetReasons reason);
|
||||
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user