diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.cpp b/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.cpp index 7db9f593..83897c3b 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.cpp +++ b/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.cpp @@ -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); } diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.h b/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.h index 3a794dd0..50ad4307 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.h +++ b/ARM_Tag_FW/Newton_M3_nRF52811/hal/Newton_M3_nRF52811/HAL_Newton_M3.h @@ -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); \ No newline at end of file +void sleepForMs(uint32_t ms); +void setled(bool r,bool g,bool b); +void resettimer(); \ No newline at end of file diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/include/powermgt.h b/ARM_Tag_FW/Newton_M3_nRF52811/include/powermgt.h index 1dc0a85a..155daa0b 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/include/powermgt.h +++ b/ARM_Tag_FW/Newton_M3_nRF52811/include/powermgt.h @@ -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 diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/include/settings.h b/ARM_Tag_FW/Newton_M3_nRF52811/include/settings.h index 38b69be8..d3e84c96 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/include/settings.h +++ b/ARM_Tag_FW/Newton_M3_nRF52811/include/settings.h @@ -3,8 +3,8 @@ #include -#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 \ No newline at end of file diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp b/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp index a4aae8b1..6f9d6f20 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp +++ b/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp @@ -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]); diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp b/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp index 18062563..1a3ad093 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp +++ b/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp @@ -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) { diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp b/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp index e6f1fe83..65fedda8 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp +++ b/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp @@ -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)