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 83897c3b..1d82ba8d 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,36 +55,92 @@ 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; +bool interruped = false; -void setled(bool r,bool g,bool b){ - ledred = r; - ledgreen = g; - ledblue = b; - ledinerv = 2500; - ledtime = 2000; +//uint8_t ledcfg[12] = {0b00100010,0x78,0b00100100,5,0x03,0b01000011,1,0xC2,0b1100001,10,10,0}; +//uint8_t ledcfg[12] = {0b00010010,0x7D,0,0,0x03,0xE8,0,0,0,0,0,0}; +uint8_t ledcfg[12] = {255,0,0,0,0,0,0,0,0,0,0,0}; + +void setled(uint64_t parta,u_int32_t partb){ + ledcfg[0] = parta & 0xFF; + ledcfg[1] = (parta >> 8)& 0xFF; + ledcfg[2] = (parta >> 16)& 0xFF; + ledcfg[3] = (parta >> 24)& 0xFF; + ledcfg[4] = (parta >> 32)& 0xFF; + ledcfg[5] = (parta >> 40)& 0xFF; + ledcfg[6] = (parta >> 48)& 0xFF; + ledcfg[7] = (parta >> 56)& 0xFF; + ledcfg[8] = partb & 0xFF; + ledcfg[9] = (partb >> 8)& 0xFF; + ledcfg[10] = (partb >> 16)& 0xFF; + ledcfg[11] = (partb >> 24)& 0xFF; } void resettimer(){ - sleepMsEntry = sleepMsEntry + 999999999; + //tell the sleep function to net sleep again + sleepMsEntry = sleepMsEntry - 999999999; loops = 0; + interruped = true; } -void sleepForMs(uint32_t ms) { - // Turn everything off for minimal deep sleep current - radioRxEnable(0); - NRF_CLOCK->TASKS_HFCLKSTOP = 1U; - while ((NRF_CLOCK->HFCLKSTAT & 0x10001) == 0x10001) - ; - Serial.end(); - yield(); - //led and sleep stuff - if(!ledred && !ledgreen && !ledblue)ledinerv = 99999999; +void flashled(uint8_t color,uint8_t brightnes){ + uint8_t colorred = (color >> 5) & 0b00000111; + uint8_t colorgreen = (color >> 2) & 0b00000111; + uint8_t colorblue = color & 0b00000011; + for(uint16_t i = 0;i < brightnes;i++){ + digitalWrite(LED_RED, !(colorred >= 7)); + digitalWrite(LED_GREEN, !(colorgreen >= 7)); + digitalWrite(LED_BLUE, !(colorblue >= 3)); + nrf_delay_us(100); + digitalWrite(LED_RED, !(colorred >= 1)); + digitalWrite(LED_GREEN, !(colorgreen >= 1)); + nrf_delay_us(100); + digitalWrite(LED_RED, !(colorred >= 6)); + digitalWrite(LED_GREEN, !(colorgreen >= 6)); + digitalWrite(LED_BLUE, !(colorblue >= 1)); + nrf_delay_us(100); + digitalWrite(LED_RED, !(colorred >= 2)); + digitalWrite(LED_GREEN, !(colorgreen >= 2)); + nrf_delay_us(100); + digitalWrite(LED_RED, !(colorred >= 5)); + digitalWrite(LED_GREEN, !(colorgreen >= 5)); + nrf_delay_us(100); + digitalWrite(LED_RED, !(colorred >= 3)); + digitalWrite(LED_GREEN, !(colorgreen >= 3)); + digitalWrite(LED_BLUE, !(colorblue >= 2)); + nrf_delay_us(100); + digitalWrite(LED_RED, !(colorred >= 4)); + digitalWrite(LED_GREEN, !(colorgreen >= 4)); + nrf_delay_us(100); + digitalWrite(LED_RED, HIGH); + digitalWrite(LED_GREEN, HIGH); + digitalWrite(LED_BLUE, HIGH); + } +} + +void sleepwithinterrupts(uint32_t sleepinterval){ + yield(); + sleepMsEntry = millis(); + //sometimes we wake up early + while (millis() - sleepMsEntry < sleepinterval){ + initRTC0(sleepinterval); + __WFE(); + __SEV(); + __WFE(); + } +} + +void ledflashlogic(uint32_t ms){ + watchdog_enable(ms + 1000); + uint8_t brightnes = ledcfg[0] >> 4 & 0b00001111; + uint8_t mode = ledcfg[0] & 0b00001111; + //lets not blink for short delays + if(ms < 2000)mode = 15; + //if(mode == 0)sleepwithinterrupts(ms); + if(mode == 1){ + uint8_t color = ledcfg[1]; + uint32_t ledinerv = (ledcfg[2] << 24 )+ (ledcfg[3] << 16)+ (ledcfg[4] << 8)+ ledcfg[5]; uint32_t sleepinterval = ledinerv; loops = ms / ledinerv; if(loops == 0){ @@ -93,22 +149,81 @@ void sleepForMs(uint32_t 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 < sleepinterval){ - __WFE(); - __SEV(); - __WFE(); + flashled(color,brightnes); + sleepwithinterrupts(sleepinterval); } } + else if(mode == 0){ + interruped = false; + uint8_t interloopdelayfactor = 100; + u_int8_t loopdelayfactor = 100; + uint8_t c1 = ledcfg[1]; + uint8_t c2 = ledcfg[3]; + uint8_t c3 = ledcfg[5]; + uint8_t loop1delay = (ledcfg[2] >> 4) & 0b00001111; + uint8_t loop2delay = (ledcfg[4] >> 4) & 0b00001111; + uint8_t loop3delay = (ledcfg[6] >> 4) & 0b00001111; + uint8_t loopcnt1 = ledcfg[2] & 0b00001111; + uint8_t loopcnt2 = ledcfg[4] & 0b00001111; + uint8_t loopcnt3 = ledcfg[6] & 0b00001111; + uint8_t ildelay1 = 0; + uint8_t ildelay2 = 0; + uint8_t ildelay3 = 0; + uint8_t grouprepeats = ledcfg[7]; + uint32_t fulllooptime1 = loopcnt1 * loop1delay * loopdelayfactor + ildelay1 * interloopdelayfactor; + uint32_t fulllooptime2 = loopcnt2 * loop2delay * loopdelayfactor + ildelay2 * interloopdelayfactor; + uint32_t fulllooptime3 = loopcnt3 * loop3delay * loopdelayfactor + ildelay3 * interloopdelayfactor; + uint32_t looptimesum = fulllooptime1 + fulllooptime2 + fulllooptime3; + int fittingrepeats = (int) ms / looptimesum; + + grouprepeats = fittingrepeats; + if(grouprepeats == 0)grouprepeats = 1; + + for(int j = 0;j < grouprepeats;j++){ + + if(!interruped){ + for(int i = 0;i < loopcnt1;i++){ + flashled(c1,brightnes); + sleepwithinterrupts(loop1delay * loopdelayfactor); + if(interruped)break; + } + sleepwithinterrupts(ildelay1 * interloopdelayfactor); + } + if(!interruped){ + for(int i = 0;i < loopcnt2;i++){ + flashled(c2,brightnes); + sleepwithinterrupts(loop2delay * loopdelayfactor); + if(interruped)break; + } + sleepwithinterrupts(ildelay2 * interloopdelayfactor); + } + + if(!interruped){ + for(int i = 0;i < loopcnt3;i++){ + flashled(c3,brightnes); + sleepwithinterrupts(loop3delay * loopdelayfactor); + if(interruped)break; + } + sleepwithinterrupts(ildelay3 * interloopdelayfactor); + } + if(interruped)break; + } + } + else sleepwithinterrupts(ms); +} + +void sleepForMs(uint32_t ms) { + // Turn everything off for minimal deep sleep current + radioRxEnable(0); + NRF_CLOCK->TASKS_HFCLKSTOP = 1U; + while ((NRF_CLOCK->HFCLKSTAT & 0x10001) == 0x10001); + Serial.end(); + yield(); + //led and sleep stuff + ledflashlogic(ms); + //we have to restart the serial Serial.begin(115200); + Serial.println("wu"); } #define LF_FREQUENCY 32768UL 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 50ad4307..d0cd6af6 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 @@ -52,5 +52,5 @@ int8_t startHFCLK(void); uint8_t isHFCLKstable(void); void boardGetOwnMac(uint8_t *mac); void sleepForMs(uint32_t ms); -void setled(bool r,bool g,bool b); +void setled(uint64_t parta,u_int32_t partb); void resettimer(); \ No newline at end of file diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/platformio.ini b/ARM_Tag_FW/Newton_M3_nRF52811/platformio.ini index 03f03448..97bd9635 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/platformio.ini +++ b/ARM_Tag_FW/Newton_M3_nRF52811/platformio.ini @@ -7,7 +7,9 @@ board = nrf52811_dk framework = arduino debug_tool = stlink upload_protocol = stlink - +lib_deps = + stevemarple/SoftWire @ ^2.0.9 + stevemarple/AsyncDelay @ ^1.1.2 [env:Newton_M3_29_BWR] build_flags = diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp b/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp index 6f9d6f20..9aa65fff 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp +++ b/ARM_Tag_FW/Newton_M3_nRF52811/src/main.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "comms.h" #include "drawing.h" @@ -12,6 +14,8 @@ #include "userinterface.h" #include "wdt.h" +SoftWire sw(NFC_I2C_SDA, NFC_I2C_SCL); + extern "C" int _write(int file, char *ptr, int len) { (void)file; /* Not used, avoid warning */ Serial.write(ptr, len); @@ -111,7 +115,48 @@ void setup() { printf("BOOTED> %d.%d.%d%s\n", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); + /* powerUp(INIT_I2C); + pinMode(NFC_POWER, OUTPUT); + digitalWrite(NFC_POWER,HIGH); + + sw.setTimeout_ms(40); + sw.begin(); + delay(50); + + const uint8_t firstAddr = 1; + const uint8_t lastAddr = 0x7F; + Serial.println(); + Serial.print("I2C scan in range 0x"); + Serial.print(firstAddr, HEX); + Serial.print(" - 0x"); + Serial.print(lastAddr, HEX); + Serial.println(" (inclusive) ..."); + for (uint8_t addr = firstAddr; addr <= lastAddr; addr++) { + delayMicroseconds(50); + uint8_t startResult = sw.llStart((addr << 1) + 1); // Signal a read + sw.stop(); + if (startResult == 0) { + Serial.print("\rDevice found at 0x"); + Serial.println(addr, HEX); + Serial.flush(); + } + delay(50); + } + Serial.println("Finished"); + + Serial.println((uint8_t)0x55 << 1); + + sw.beginTransmission(30); + sw.write(uint8_t(0)); // Access the first register + sw.endTransmission(); + + digitalWrite(NFC_POWER,LOW); + pinMode(NFC_POWER, INPUT_PULLDOWN); + + powerDown(INIT_I2C); + + */ //we always have NFC + NFC wake capabilities |= CAPABILITY_HAS_NFC; diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp b/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp index 1a3ad093..36448bec 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp +++ b/ARM_Tag_FW/Newton_M3_nRF52811/src/powermgt.cpp @@ -117,20 +117,11 @@ static void configI2C(const bool setup) { if (setup == i2cActive) return; if (setup) { - /*P1DIR &= ~(1 << 6); - P1_6 = 1; - P1FUNC |= (1 << 4) | (1 << 5); - P1PULL |= (1 << 4) | (1 << 5); - i2cInit(); - i2cCheckDevice(0x50); */ - // first transaction after init fails, this makes sure everything is ready for the first transaction + pinMode(NFC_I2C_SCL,OUTPUT); + pinMode(NFC_I2C_SDA,OUTPUT); } else { - /*P1DIR |= (1 << 6); - P1_6 = 0; - P1FUNC &= ~((1 << 4) | (1 << 5)); - P1PULL &= ~((1 << 4) | (1 << 5)); - CLKEN &= ~0x10; - IEN1 &= ~4;*/ + pinMode(NFC_I2C_SDA,INPUT); + pinMode(NFC_I2C_SCL,INPUT); } i2cActive = setup; } diff --git a/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp b/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp index 65fedda8..c3b1460a 100644 --- a/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp +++ b/ARM_Tag_FW/Newton_M3_nRF52811/src/syncedproto.cpp @@ -823,17 +823,11 @@ bool processAvailDataInfo(struct AvailDataInfo *avail) { } 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); + if(avail->dataTypeArgument == 4){ + Serial.println("LED CMD"); + setled(avail->dataVer,avail->dataSize); + } powerUp(INIT_RADIO); sendXferComplete(); powerDown(INIT_RADIO);