diff --git a/firmware/motion-head/src/indicators.h b/firmware/motion-head/src/indicators.h index 81c727cbd55e1f9ec41fc520fe66b7896ab82394..e95b9991def2041a1aa24c658bbc6c09b9adf279 100644 --- a/firmware/motion-head/src/indicators.h +++ b/firmware/motion-head/src/indicators.h @@ -4,26 +4,18 @@ #define CLKLIGHT_PIN 27 #define CLKLIGHT_PORT PORT->Group[0] #define CLKLIGHT_BM (uint32_t)(1 << CLKLIGHT_PIN) -#define CLKLIGHT_ON -//CLKLIGHT_PORT.OUTCLR.reg = CLKLIGHT_BM -#define CLKLIGHT_OFF -//CLKLIGHT_PORT.OUTSET.reg = CLKLIGHT_BM -#define CLKLIGHT_TOGGLE -//CLKLIGHT_PORT.OUTTGL.reg = CLKLIGHT_BM -#define CLKLIGHT_SETUP -//CLKLIGHT_PORT.DIRSET.reg = CLKLIGHT_BM; CLKLIGHT_OFF +#define CLKLIGHT_ON CLKLIGHT_PORT.OUTCLR.reg = CLKLIGHT_BM +#define CLKLIGHT_OFF CLKLIGHT_PORT.OUTSET.reg = CLKLIGHT_BM +#define CLKLIGHT_TOGGLE CLKLIGHT_PORT.OUTTGL.reg = CLKLIGHT_BM +#define CLKLIGHT_SETUP CLKLIGHT_PORT.DIRSET.reg = CLKLIGHT_BM; CLKLIGHT_OFF #define ERRLIGHT_PIN 8 #define ERRLIGHT_PORT PORT->Group[1] #define ERRLIGHT_BM (uint32_t)(1 << ERRLIGHT_PIN) -#define ERRLIGHT_ON -//ERRLIGHT_PORT.OUTCLR.reg = ERRLIGHT_BM -#define ERRLIGHT_OFF -//ERRLIGHT_PORT.OUTSET.reg = ERRLIGHT_BM -#define ERRLIGHT_TOGGLE -//ERRLIGHT_PORT.OUTTGL.reg = ERRLIGHT_BM -#define ERRLIGHT_SETUP -//ERRLIGHT_PORT.DIRSET.reg = ERRLIGHT_BM; ERRLIGHT_OFF +#define ERRLIGHT_ON ERRLIGHT_PORT.OUTCLR.reg = ERRLIGHT_BM +#define ERRLIGHT_OFF ERRLIGHT_PORT.OUTSET.reg = ERRLIGHT_BM +#define ERRLIGHT_TOGGLE ERRLIGHT_PORT.OUTTGL.reg = ERRLIGHT_BM +#define ERRLIGHT_SETUP ERRLIGHT_PORT.DIRSET.reg = ERRLIGHT_BM; ERRLIGHT_OFF // PSU-breakout board lights, diff --git a/firmware/motion-head/src/main.cpp b/firmware/motion-head/src/main.cpp index cf7aaac058ef42b6c1794a775d5788b567ebf3d0..f6c7ceb2ba48d4862ab6152190f5a87b023d795a 100644 --- a/firmware/motion-head/src/main.cpp +++ b/firmware/motion-head/src/main.cpp @@ -231,7 +231,7 @@ void setup() { smoothieRoll->init(20000); // 25kHz base (40us period) or // 20kHz base (50us period) - d51ClockBoss->start_ticker_a(50); + d51ClockBoss->start_ticker_a(100); } void loop() { @@ -252,10 +252,13 @@ void TC0_Handler(void){ // runs at period established above... TC0->COUNT32.INTFLAG.bit.MC0 = 1; TC0->COUNT32.INTFLAG.bit.MC1 = 1; + DEBUG1PIN_TOGGLE; timeTick ++; timeBlink ++; if(timeBlink > blinkTime){ - DEBUG1PIN_TOGGLE; + //DEBUG1PIN_TOGGLE; + CLKLIGHT_TOGGLE; + sysErrLightCheck(); timeBlink = 0; } // do bus action first: want downstream clocks to be deterministic-ish diff --git a/firmware/motion-head/src/osape-d51 b/firmware/motion-head/src/osape-d51 index 82214472bdab35fa776d99c5c8e36e57f51d18e0..0beaf064563e5773f2979d09ad40cefd786ca383 160000 --- a/firmware/motion-head/src/osape-d51 +++ b/firmware/motion-head/src/osape-d51 @@ -1 +1 @@ -Subproject commit 82214472bdab35fa776d99c5c8e36e57f51d18e0 +Subproject commit 0beaf064563e5773f2979d09ad40cefd786ca383 diff --git a/firmware/motion-head/src/syserror.cpp b/firmware/motion-head/src/syserror.cpp index 67d696423fd8fe65da6fb351fc29afa9136b24ac..a650704bee1384f9e6475b5da6b8b9e1f030f29a 100644 --- a/firmware/motion-head/src/syserror.cpp +++ b/firmware/motion-head/src/syserror.cpp @@ -1,55 +1,52 @@ #include "syserror.h" +#include "indicators.h" #include "osape-d51/osape/osap/ts.h" #include "osape-d51/vertices/ucBusDrop.h" #include "osape-d51/osape/utils/cobs.h" #include "config.h" + uint8_t errBuf[1028]; uint8_t errEncoded[1028]; -/* -boolean writeString(unsigned char* dest, uint16_t* dptr, String msg){ - uint16_t len = msg.length(); - dest[(*dptr) ++] = TS_STRING_KEY; - writeLenBytes(dest, dptr, len); - msg.getBytes(dest, len + 1); - return true; -} +volatile unsigned long errLightLastOn = 0; +volatile unsigned long errLightOnTime = 0; +volatile boolean errLightBlink = true; +volatile boolean errLightOn = false; -boolean writeLenBytes(unsigned char* dest, uint16_t* dptr, uint16_t len){ - dest[(*dptr) ++] = len; - dest[(*dptr) ++] = (len >> 8) & 255; - return true; +void sysErrLightFlash(uint8_t level){ + ERRLIGHT_ON; + errLightOn = true; + errLightLastOn = millis(); + switch(level){ + case 0: + errLightBlink = false; + break; + case 1: + errLightOnTime = 5000; + break; + case 2: + errLightOnTime = 1000; + break; + case 3: + errLightOnTime = 250; + break; + } } -*/ -#ifdef UCBUS_IS_DROP +void sysErrLightCheck(void){ + if(errLightOn && errLightBlink){ + if(errLightLastOn + errLightOnTime < millis()){ + ERRLIGHT_OFF; + errLightOn = false; + } + } +} -//uint8_t escape[512]; -//uint8_t escapeHeader[10] = { PK_BUSF_KEY, 0, 0, 0, 0, PK_PTR, PK_PORTF_KEY, 0, 0, PK_DEST }; +#ifdef UCBUS_IS_DROP -// config-your-own-ll-escape-hatch void sysError(String msg){ - //ERRLIGHT_ON; - /* - uint32_t len = msg.length(); - errBuf[0] = PK_LLERR; // the ll-errmsg-key - errBuf[1] = len & 255; - errBuf[2] = (len >> 8) & 255; - errBuf[3] = (len >> 16) & 255; - errBuf[4] = (len >> 24) & 255; - msg.getBytes(&(errBuf[5]), len + 1); - // write header, - memcpy(escape, escapeHeader, 10); - // write segsize, checksum - uint16_t wptr = 10; - ts_writeUint16(128, escape, &wptr); - ts_writeUint16(len + 5, escape, &wptr); - memcpy(&(escape[wptr]), errBuf, len + 5); - // transmit on ucbus - // potential here to hang-up and do while(!(ucBusDrop->cts())) ... I *think* that would clear on an interrupt - ucBusDrop->transmit(escape, len + wptr + 5); - */ + // noop } #else @@ -90,4 +87,5 @@ void logPacket(uint8_t* pck, uint16_t len){ errmsg += ", "; } sysError(errmsg); -} \ No newline at end of file +} + diff --git a/firmware/motion-head/src/syserror.h b/firmware/motion-head/src/syserror.h index 3645dbc38bbb4c251a83d8e2729060afaf65eab2..489173a78b43b8fb1dcf5fc6b4d310aae53438b2 100644 --- a/firmware/motion-head/src/syserror.h +++ b/firmware/motion-head/src/syserror.h @@ -7,4 +7,9 @@ void sysError(String msg); void logPacket(uint8_t* pck, uint16_t len); //void sysError(uint8_t* bytes, uint16_t len); +void sysErrLightFlash(uint8_t level); +void sysErrLightCheck(void); + +#define ERROR(level, msg) sysErrLightFlash(level); sysError(msg) + #endif