/* * Indicator.c * * Created on: Sep 26, 2024 * Author: DashyFox */ #include "Indicator.h" #include "ShiftReg.h" #include "SimpleTimer.h" #include const LedMap ledMap = { // ALL - DOWN[0] TO UP[19] { {0, 0b01000000}, {0, 0b00100000}, {0, 0b00010000}, {0, 0b00001000}, {0, 0b00000100}, {0, 0b00000010}, {0, 0b00000001}, {1, 0b00000001}, {1, 0b00000010}, {1, 0b00000100}, {1, 0b01000000}, {1, 0b00100000}, {1, 0b00010000}, {2, 0b00000001}, {2, 0b00000010}, {2, 0b00000100}, {2, 0b00001000}, {2, 0b00010000}, {2, 0b00100000}, {2, 0b01000000}, }, // UP - DOWN[0] TO UP[9] { {1, 0b01000000}, {1, 0b00100000}, {1, 0b00010000}, {2, 0b00000001}, {2, 0b00000010}, {2, 0b00000100}, {2, 0b00001000}, {2, 0b00010000}, {2, 0b00100000}, {2, 0b01000000}, }, // DOWN - DOWN[0] TO UP[9] { {0, 0b01000000}, {0, 0b00100000}, {0, 0b00010000}, {0, 0b00001000}, {0, 0b00000100}, {0, 0b00000010}, {0, 0b00000001}, {1, 0b00000001}, {1, 0b00000010}, {1, 0b00000100}, }, // RED - DOWN[0] TO UP[5] { {1, 0b00000001}, {1, 0b00000010}, {1, 0b00000100}, {1, 0b01000000}, {1, 0b00100000}, {1, 0b00010000}, } }; static uint8_t ledBuf[3] = { 0, 0, 0 }; typedef struct { uint16_t period; uint16_t count; uint32_t timer; } LedBlinkInfo; static LedBlinkInfo ledBlinkInfo[NUMLEDS * INDICATORS_COUNT]; static void blinkHandler() { for (int i = 0; i < sizeof(ledBlinkInfo) / sizeof(ledBlinkInfo[0]); ++i) { if(!ledBlinkInfo[i].count || !ledBlinkInfo[i].period){ continue; } if(millis() - ledBlinkInfo[i].timer > ledBlinkInfo[i].period){ ledBlinkInfo[i].timer = millis(); led_write(ledMap.ALL[i], (ledBlinkInfo[i].count & 1) != 1); ledBlinkInfo[i].count--; } } } void led_init(){ memset(ledBlinkInfo, 0x00, sizeof(ledBlinkInfo)); } void led_show() { SetShiftReg(ledBuf); } void led_tick() { blinkHandler(); } void led_write(LedMap_element led, uint8_t state) { if (state) { ledBuf[led.byteIndx] |= led.offsetMask; } else { ledBuf[led.byteIndx] &= ~(led.offsetMask); } led_show(); } uint8_t led_getState(LedMap_element led){ return (ledBuf[led.byteIndx] & led.offsetMask) != 0; } void led_writeMirror(uint8_t number, uint8_t state) { if (number >= 10) { number = 9; } led_write(ledMap.UP[number], state); led_write(ledMap.DOWN[9 - number], state); led_show(); } void led_blink_num(uint8_t ledNum, uint16_t period, uint16_t count){ if(ledNum>=sizeof(ledBlinkInfo)/sizeof(ledBlinkInfo[0])) return; ledBlinkInfo[ledNum].count = count*2; ledBlinkInfo[ledNum].period = period; ledBlinkInfo[ledNum].timer = 0; // run immediately } void led_blink(LedMap_element led, uint16_t period, uint16_t count) { for (int i = 0; i < sizeof(ledMap.ALL)/sizeof(ledMap.ALL[0]); ++i) { if(memcmp(&led, &ledMap.ALL[i], sizeof(LedMap_element)) == 0){ led_blink_num(i, period, count); return; } } } void led_clear() { memset(ledBuf, 0x00, sizeof(ledBuf)); led_show(); }