NFC + button wake and LED

This commit is contained in:
Jonas Niesner
2023-08-28 15:41:19 +02:00
parent 81f5345237
commit 71d8aba77a
7 changed files with 100 additions and 51 deletions

View File

@@ -55,6 +55,26 @@ void watchdog_enable(int timeout) {
}
uint32_t sleepMsEntry = 0;
uint32_t ledinerv = 2500;
uint32_t ledtime = 2000;
bool ledred = false;
bool ledgreen = false;
bool ledblue = false;
uint32_t loops = 0;
void setled(bool r,bool g,bool b){
ledred = r;
ledgreen = g;
ledblue = b;
ledinerv = 2500;
ledtime = 2000;
}
void resettimer(){
sleepMsEntry = sleepMsEntry + 999999999;
loops = 0;
}
void sleepForMs(uint32_t ms) {
// Turn everything off for minimal deep sleep current
radioRxEnable(0);
@@ -63,14 +83,31 @@ void sleepForMs(uint32_t ms) {
;
Serial.end();
yield();
// here we set the rtc to sleep for the time we want
initRTC0(ms);
//led and sleep stuff
if(!ledred && !ledgreen && !ledblue)ledinerv = 99999999;
uint32_t sleepinterval = ledinerv;
loops = ms / ledinerv;
if(loops == 0){
loops = 1;
sleepinterval = ms;
}
if(sleepinterval > ms)sleepinterval = ms;
for(uint32_t i = 0;i < loops;i++){
digitalWrite(LED_RED, !ledred);
digitalWrite(LED_GREEN, !ledgreen);
digitalWrite(LED_BLUE, !ledblue);
nrf_delay_us(ledtime);
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
initRTC0(sleepinterval);
sleepMsEntry = millis();
while (millis() - sleepMsEntry < ms) {
while (millis() - sleepMsEntry < sleepinterval){
__WFE();
__SEV();
__WFE();
}
}
Serial.begin(115200);
}

View File

@@ -51,4 +51,6 @@ void initRTC0(uint32_t ms);
int8_t startHFCLK(void);
uint8_t isHFCLKstable(void);
void boardGetOwnMac(uint8_t *mac);
void sleepForMs(uint32_t ms);
void sleepForMs(uint32_t ms);
void setled(bool r,bool g,bool b);
void resettimer();

View File

@@ -5,10 +5,21 @@
#define WAKEUP_REASON_TIMED 0
#define WAKEUP_REASON_GPIO 2
#define WAKEUP_REASON_NFC 3
#define WAKEUP_REASON_BUTTON1 4
#define WAKEUP_REASON_BUTTON2 5
#define WAKEUP_REASON_FIRSTBOOT 0xFC
#define WAKEUP_REASON_NETWORK_SCAN 0xFD
#define WAKEUP_REASON_WDT_RESET 0xFE
#define CMD_LED_OFF 100
#define CMD_LED_RED 101
#define CMD_LED_GREEN 102
#define CMD_LED_BLUE 103
#define CMD_LED_YELLOW 104
#define CMD_LED_CYAN 105
#define CMD_LED_MAGENTA 106
#define CMD_LED_WHITE 107
#define DETECT_P1_0_NOTHING 0
#define DETECT_P1_0_BUTTON 1
#define DETECT_P1_0_JIG 2

View File

@@ -3,8 +3,8 @@
#include <stdint.h>
#define FW_VERSION 017 // version number (max 2.5.5 :) )
#define FW_VERSION_SUFFIX "-CLUT" // suffix, like -RC1 or whatever.
#define FW_VERSION 017 // version number (max 2.5.5 :) )
#define FW_VERSION_SUFFIX "BETA" // suffix, like -RC1 or whatever.
// #define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers
// #define PRINT_LUT // uncomment if you want the tag to print the LUT for the current temperature bracket
#endif

View File

@@ -112,19 +112,10 @@ void setup() {
printf("BOOTED> %d.%d.%d%s\n", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix);
powerUp(INIT_I2C);
// i2cBusScan();
/*if (i2cCheckDevice(0x55)) {
powerDown(INIT_I2C);
capabilities |= CAPABILITY_HAS_NFC;
if (supportsNFCWake()) {
printf("This board supports NFC wake!\n");
capabilities |= CAPABILITY_NFC_WAKE;
}
} else {
powerDown(INIT_I2C);
}*/
//we always have NFC + NFC wake
capabilities |= CAPABILITY_HAS_NFC;
capabilities |= CAPABILITY_NFC_WAKE;
printf("MAC>%02X%02X", mSelfMac[0], mSelfMac[1]);
printf("%02X%02X", mSelfMac[2], mSelfMac[3]);

View File

@@ -37,6 +37,21 @@ uint8_t checkButtonOrJig() {
return DETECT_P1_0_NOTHING;
}
void button1wake(){
wakeUpReason = WAKEUP_REASON_BUTTON1;
resettimer();
}
void button2wake(){
wakeUpReason = WAKEUP_REASON_BUTTON2;
resettimer();
}
void nfcwake(){
wakeUpReason = WAKEUP_REASON_NFC;
resettimer();
}
void setupPortsInitial() {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
@@ -46,12 +61,18 @@ void setupPortsInitial() {
pinMode(LED_BLUE, OUTPUT);
pinMode(BUTTON1, INPUT_PULLUP);
pinMode(BUTTON2, INPUT_PULLUP);
pinMode(NFC_POWER, INPUT_PULLDOWN);
pinMode(NFC_IRQ, INPUT_PULLDOWN);
pinMode(FLASH_MISO, INPUT);
pinMode(FLASH_CLK, OUTPUT);
pinMode(FLASH_MOSI, OUTPUT);
digitalWrite(FLASH_CS, HIGH);
pinMode(FLASH_CS, OUTPUT);
attachInterrupt(digitalPinToInterrupt(BUTTON1), button1wake, FALLING);
attachInterrupt(digitalPinToInterrupt(BUTTON2), button2wake, FALLING);
attachInterrupt(digitalPinToInterrupt(NFC_IRQ), nfcwake, RISING);
}
void initPowerSaving(const uint16_t initialValue) {
@@ -151,7 +172,7 @@ void powerUp(const uint8_t parts) {
}
if (parts & INIT_TEMPREADING) {
// temperature = adcSampleTemperature();
//temperature = nrf_temp_read();
}
if (parts & INIT_RADIO) {

View File

@@ -695,37 +695,6 @@ static bool downloadImageDataToEEPROM(const struct AvailDataInfo *avail) {
bool processAvailDataInfo(struct AvailDataInfo *avail) {
switch (avail->dataType) {
#if (SCREEN_WIDTH == 152)
// the 1.54" screen is pretty small, we can write an entire 1bpp image from the block transfer buffer directly to the EPD buffer
case DATATYPE_IMG_RAW_1BPP_DIRECT:
printf("Direct draw image received\n");
if (curDataInfo.dataSize == 0 && !memcmp((const void *)&avail->dataVer, (const void *)&curDataInfo.dataVer, 8)) {
// we've downloaded this already, we're guessing it's already displayed
printf("currently shown image, send xfc\n");
powerUp(INIT_RADIO);
sendXferComplete();
powerDown(INIT_RADIO);
return true;
}
memcpy(&curDataInfo, (void *)avail, sizeof(struct AvailDataInfo));
if (avail->dataSize > 4096)
avail->dataSize = 4096;
if (getDataBlock(avail->dataSize)) {
powerUp(INIT_RADIO);
sendXferComplete();
powerDown(INIT_RADIO);
curDataInfo.dataSize = 0; // mark as transfer not pending
powerUp(INIT_EPD);
drawImageFromBuffer(blockXferBuffer, drawWithLut);
powerDown(INIT_EPD);
drawWithLut = 0; // default back to the regular ol' stock/OTP LUT
return true;
}
return false;
break;
#endif
case DATATYPE_IMG_BMP:
case DATATYPE_IMG_DIFF:
case DATATYPE_IMG_RAW_1BPP:
@@ -852,6 +821,24 @@ bool processAvailDataInfo(struct AvailDataInfo *avail) {
return false;
break;
}
case DATATYPE_COMMAND_DATA:
printf("CMD received\n");
//led cmd handeling
if(avail->dataTypeArgument == CMD_LED_OFF)setled(false,false,false);
if(avail->dataTypeArgument == CMD_LED_RED)setled(true,false,false);
if(avail->dataTypeArgument == CMD_LED_GREEN)setled(false,true,false);
if(avail->dataTypeArgument == CMD_LED_BLUE)setled(false,false,true);
if(avail->dataTypeArgument == CMD_LED_YELLOW)setled(true,true,false);
if(avail->dataTypeArgument == CMD_LED_CYAN)setled(false,true,true);
if(avail->dataTypeArgument == CMD_LED_MAGENTA)setled(true,false,true);
if(avail->dataTypeArgument == CMD_LED_WHITE)setled(true,true,true);
powerUp(INIT_RADIO);
sendXferComplete();
powerDown(INIT_RADIO);
return true;
break;
case DATATYPE_CUSTOM_LUT_OTA:
// Handle data for the NFC IC (if we have it)