mirror of
https://github.com/DashyFox/StackSport.git
synced 2025-06-28 13:19:41 +00:00
indicator
This commit is contained in:
156
Core/Src/Indicator.c
Normal file
156
Core/Src/Indicator.c
Normal file
@ -0,0 +1,156 @@
|
||||
/*
|
||||
* Indicator.c
|
||||
*
|
||||
* Created on: Sep 26, 2024
|
||||
* Author: DashyFox
|
||||
*/
|
||||
|
||||
#include "Indicator.h"
|
||||
#include "ShiftReg.h"
|
||||
#include "SimpleTimer.h"
|
||||
#include <string.h>
|
||||
|
||||
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();
|
||||
}
|
Reference in New Issue
Block a user