mirror of
https://github.com/OpenEPaperLink/OpenEPaperLink.git
synced 2026-03-21 10:06:07 +01:00
NFC + button wake and LED
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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]);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user