From a68d774d71e4f752c22866414b658ab8082d7cc5 Mon Sep 17 00:00:00 2001 From: Tropicananass Date: Sun, 8 Nov 2020 18:22:58 +0100 Subject: [PATCH] ?? --- schematics/attiny85.fzz | Bin 12353 -> 12023 bytes src/main.cpp | 344 +++++++++++++++++++--------------------- 2 files changed, 167 insertions(+), 177 deletions(-) diff --git a/schematics/attiny85.fzz b/schematics/attiny85.fzz index ec07c8c9cf9b755c48f1a59c89206746ac96f24b..68be585af7519eb58ab5509110d02d8de56d0499 100644 GIT binary patch literal 12023 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 literal 12353 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 diff --git a/src/main.cpp b/src/main.cpp index dc9b084..dd3a143 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,47 +1,46 @@ #include +// TODO : use core built-in lib tinyNeoPixel #include #include -#include "pin_map.hpp" #include "Button.hpp" +#include "pin_map.hpp" - -/* Types and Constants */ -/* ---------------------------------------------------------------------------------------------- */ +/* Types and Constants */ +/*----------------------------------------------------------------------------------------------*/ /* State machine */ -#define FOREACH_MODE(MODE) \ - MODE(ControlOff) \ - MODE(LightOn) \ - MODE(SetColor) \ - MODE(SetSaturation) \ - MODE(SetBrightness) \ - MODE(Shift) \ +#define FOREACH_MODE(MODE) \ + MODE(ControlOff) \ + MODE(LightOn) \ + MODE(SetColor) \ + MODE(SetSaturation) \ + MODE(SetBrightness) \ + MODE(Shift) #define GENERATE_MODE_ENUM(ENUM) ENUM, -enum class Mode_e {FOREACH_MODE(GENERATE_MODE_ENUM)}; +enum class Mode_e { FOREACH_MODE(GENERATE_MODE_ENUM) }; -Mode_e& operator++(Mode_e& mode) -{ - if (mode == Mode_e::Shift) { - return mode = Mode_e::ControlOff; - } +Mode_e &operator++(Mode_e &mode) { + if (mode == Mode_e::Shift) { + return mode = Mode_e::ControlOff; + } - return mode = static_cast(static_cast(mode) + 1); + return mode = static_cast(static_cast(mode) + 1); } #ifdef DEBUG - #define GENERATE_MODE_STRING(STRING) #STRING, - char static const * mode_str[] = {FOREACH_MODE(GENERATE_MODE_STRING)}; +#define GENERATE_MODE_STRING(STRING) #STRING, +char static const *mode_str[] = {FOREACH_MODE(GENERATE_MODE_STRING)}; #endif /*DEBUG*/ /* Leds */ uint16_t static const LedCount{24}; uint8_t static const ColorSaturation{128}; -uint8_t static const ColorArray[3][3] = - {{ColorSaturation, 0, 0}, {0, ColorSaturation, 0}, {0, 0, ColorSaturation}}; +uint8_t static const ColorArray[3][3] = { + {ColorSaturation, 0, 0}, {0, ColorSaturation, 0}, {0, 0, ColorSaturation}}; /* Led ring state */ typedef struct { @@ -55,20 +54,19 @@ typedef struct { /* Button */ int const AnalogButtonVRef{970}; - -/* Global variables */ -/* ---------------------------------------------------------------------------------------------- */ +/* Global variables */ +/*----------------------------------------------------------------------------------------------*/ /* State machine */ Mode_e currentMode{Mode_e::ControlOff}; /* Led ring state */ -LedRingState_t ledRingState { - .ledOnCounter = 1, - .ledOnShift = 0, - .hue = 0, - .saturation = 255, - .brightness = 16, +LedRingState_t ledRingState{ + .ledOnCounter = LedCount / 2, + .ledOnShift = LedCount / 4, + .hue = 0, + .saturation = 255, + .brightness = 16, }; /* IO Objects */ @@ -78,22 +76,21 @@ AnalogButton button{AnalogButtonPin, AnalogButtonVRef}; /* debug Serial definition */ #ifdef DEBUG - #ifdef ARDUINO_AVR_ATTINYX5 - #include - SoftwareSerial debugSerial{RxPin, TxPin}; // RX, TX - #endif /*ARDUINO_AVR_ATTINYX5*/ - #ifdef ARDUINO_AVR_UNO - #include - HardwareSerial &debugSerial = Serial; - #endif /*ARDUINO_AVR_UNO*/ +#ifdef ARDUINO_AVR_ATTINYX5 +#include +SoftwareSerial debugSerial{RxPin, TxPin}; +#endif /*ARDUINO_AVR_ATTINYX5*/ +#ifdef ARDUINO_AVR_UNO +#include +HardwareSerial &debugSerial = Serial; +#endif /*ARDUINO_AVR_UNO*/ #endif /*DEBUG*/ - -/* Private function declarations */ -/* ---------------------------------------------------------------------------------------------- */ +/* Private function declarations */ +/*----------------------------------------------------------------------------------------------*/ /* State machine */ -#define GENERATE_MODE_EXEC_DECLARTION(MODE) void MODE ## _execute (int shift); +#define GENERATE_MODE_EXEC_DECLARTION(MODE) void MODE##_execute(int shift); FOREACH_MODE(GENERATE_MODE_EXEC_DECLARTION) /* Encoder */ @@ -103,70 +100,69 @@ void refresh_led_ring(void); void analog_button_calibration(void); -/* Function definitions */ -/* ---------------------------------------------------------------------------------------------- */ -void setup() -{ - #ifdef DEBUG - debugSerial.begin(9600); - while(!debugSerial.available()); - debugSerial.println("Init ... "); - #endif /*DEBUG*/ +/* Function definitions */ +/*----------------------------------------------------------------------------------------------*/ +void setup() { +#ifdef DEBUG + debugSerial.begin(9600); + while (!debugSerial.available()) + ; + debugSerial.println("Init ... "); +#endif /*DEBUG*/ + + ledRing.begin(); + refresh_led_ring(); analog_button_calibration(); - ledRing.begin(); - ledRing.setBrightness(50); - ledRing.show(); - get_encoder_shift(); - #ifdef DEBUG - debugSerial.println(mode_str[static_cast(currentMode)]); - #endif /*DEBUG*/ +#ifdef DEBUG + debugSerial.println(mode_str[static_cast(currentMode)]); +#endif /*DEBUG*/ } void loop() { int shift{get_encoder_shift()}; - + if (button.is_button_pressed()) { - while(button.is_button_pressed()){ + while (button.is_button_pressed()) { delay(150); } ++currentMode; - #ifdef DEBUG - debugSerial.println(mode_str[static_cast(currentMode)]); - #endif /*DEBUG*/ +#ifdef DEBUG + debugSerial.println(mode_str[static_cast(currentMode)]); +#endif /*DEBUG*/ } if (shift != 0) { switch (currentMode) { - case Mode_e::ControlOff: - ControlOff_execute(shift); - break; - - case Mode_e::LightOn: - LightOn_execute(shift); - break; - - case Mode_e::SetColor: - SetColor_execute(shift); - break; - - case Mode_e::SetBrightness: - SetBrightness_execute(shift); - break; + case Mode_e::ControlOff: + ControlOff_execute(shift); + break; - case Mode_e::SetSaturation: - SetSaturation_execute(shift); - break; + case Mode_e::LightOn: + LightOn_execute(shift); + break; - case Mode_e::Shift: - Shift_execute(shift); - break; + case Mode_e::SetColor: + SetColor_execute(shift); + break; - default: - break; + case Mode_e::SetBrightness: + SetBrightness_execute(shift); + break; + + case Mode_e::SetSaturation: + SetSaturation_execute(shift); + break; + + case Mode_e::Shift: + Shift_execute(shift); + break; + + default: + break; } } @@ -175,11 +171,10 @@ void loop() { } } -void ControlOff_execute (int shift) { -} +void ControlOff_execute(int shift) {} -void LightOn_execute (int shift) { - uint16_t & ledOnCounter = ledRingState.ledOnCounter; +void LightOn_execute(int shift) { + uint16_t &ledOnCounter = ledRingState.ledOnCounter; if (shift > 0) { ++ledOnCounter; @@ -192,52 +187,52 @@ void LightOn_execute (int shift) { ledOnCounter = LedCount; } } - - #if defined(DEBUG) && defined(ARDUINO_AVR_UNO) - if (shift != 0) { - debugSerial.print(__func__); - debugSerial.print(" : shift="); - debugSerial.print(shift, DEC); - debugSerial.print(", ledOnCounter="); - debugSerial.println(ledOnCounter, DEC); - } - #endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ + +#if defined(DEBUG) && defined(ARDUINO_AVR_UNO) + if (shift != 0) { + debugSerial.print(__func__); + debugSerial.print(" : shift="); + debugSerial.print(shift, DEC); + debugSerial.print(", ledOnCounter="); + debugSerial.println(ledOnCounter, DEC); + } +#endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ } - -void SetColor_execute (int shift) { - uint16_t & hue = ledRingState.hue; + +void SetColor_execute(int shift) { + uint16_t &hue = ledRingState.hue; hue += (shift << 8); - - #if defined(DEBUG) && defined(ARDUINO_AVR_UNO) - if (shift != 0) { - debugSerial.print(__func__); - debugSerial.print(" : shift="); - debugSerial.print(shift, DEC); - debugSerial.print(", hue="); - debugSerial.println(hue, DEC); - } - #endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ + +#if defined(DEBUG) && defined(ARDUINO_AVR_UNO) + if (shift != 0) { + debugSerial.print(__func__); + debugSerial.print(" : shift="); + debugSerial.print(shift, DEC); + debugSerial.print(", hue="); + debugSerial.println(hue, DEC); + } +#endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ } - -void SetBrightness_execute (int shift) { - uint8_t & brightness = ledRingState.brightness; + +void SetBrightness_execute(int shift) { + uint8_t &brightness = ledRingState.brightness; brightness += (shift << 2); - - #if defined(DEBUG) && defined(ARDUINO_AVR_UNO) - if (shift != 0) { - debugSerial.print(__func__); - debugSerial.print(" : shift="); - debugSerial.print(shift, DEC); - debugSerial.print(", brightness="); - debugSerial.println(brightness, DEC); - } - #endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ + +#if defined(DEBUG) && defined(ARDUINO_AVR_UNO) + if (shift != 0) { + debugSerial.print(__func__); + debugSerial.print(" : shift="); + debugSerial.print(shift, DEC); + debugSerial.print(", brightness="); + debugSerial.println(brightness, DEC); + } +#endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ } -void Shift_execute (int shift) { - uint16_t & ledOnShift = ledRingState.ledOnShift; +void Shift_execute(int shift) { + uint16_t &ledOnShift = ledRingState.ledOnShift; if (shift > 0) { ++ledOnShift; @@ -250,32 +245,32 @@ void Shift_execute (int shift) { ledOnShift = LedCount - 1; } } - - #if defined(DEBUG) && defined(ARDUINO_AVR_UNO) - if (shift != 0) { - debugSerial.print(__func__); - debugSerial.print(" : shift="); - debugSerial.print(shift, DEC); - debugSerial.print(", ledOnShift="); - debugSerial.println(ledOnShift, DEC); - } - #endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ + +#if defined(DEBUG) && defined(ARDUINO_AVR_UNO) + if (shift != 0) { + debugSerial.print(__func__); + debugSerial.print(" : shift="); + debugSerial.print(shift, DEC); + debugSerial.print(", ledOnShift="); + debugSerial.println(ledOnShift, DEC); + } +#endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ } -void SetSaturation_execute (int shift) { - uint8_t & saturation = ledRingState.saturation; +void SetSaturation_execute(int shift) { + uint8_t &saturation = ledRingState.saturation; saturation += (shift << 2); - - #if defined(DEBUG) && defined(ARDUINO_AVR_UNO) - if (shift != 0) { - debugSerial.print(__func__); - debugSerial.print(" : shift="); - debugSerial.print(shift, DEC); - debugSerial.print(", saturation="); - debugSerial.println(saturation, DEC); - } - #endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ + +#if defined(DEBUG) && defined(ARDUINO_AVR_UNO) + if (shift != 0) { + debugSerial.print(__func__); + debugSerial.print(" : shift="); + debugSerial.print(shift, DEC); + debugSerial.print(", saturation="); + debugSerial.println(saturation, DEC); + } +#endif /*defined(DEBUG) && defined(ARDUINO_AVR_UNO)*/ } int get_encoder_shift(void) { @@ -304,43 +299,38 @@ void refresh_led_ring(void) { if (ledId >= LedCount) { ledId -= LedCount; } - ledRing.setPixelColor(ledId, Adafruit_NeoPixel::ColorHSV - (ledRingState.hue, ledRingState.saturation, ledRingState.brightness)); + ledRing.setPixelColor(ledId, Adafruit_NeoPixel::ColorHSV( + ledRingState.hue, ledRingState.saturation, + ledRingState.brightness)); } ledRing.show(); } void analog_button_calibration(void) { - int hRef; + int highRef, lowRef; do { - hRef = analogRead(AnalogButtonPin); - delay(300); + highRef = analogRead(AnalogButtonPin); + delay(300); - #ifdef DEBUG - debugSerial.println(hRef); - #endif /*DEBUG*/ - } while (hRef < 1000); +#ifdef DEBUG + debugSerial.println(highRef); +#endif /*DEBUG*/ + } while (highRef < 1000); + lowRef = analogRead(AnalogButtonPin); + while (highRef - lowRef < 50) { +#ifdef DEBUG + debugSerial.println(lowRef); +#endif /*DEBUG*/ - int lRef = analogRead(AnalogButtonPin); - while (hRef - lRef < 50) { - #ifdef DEBUG - debugSerial.println(lRef); - #endif /*DEBUG*/ - - lRef = analogRead(AnalogButtonPin); - delay(300); + lowRef = analogRead(AnalogButtonPin); + delay(300); } - #ifdef DEBUG - debugSerial.println(lRef); - #endif /*DEBUG*/ - - button = AnalogButton{AnalogButtonPin, lRef + 10}; - - while(analogRead(AnalogButtonPin) < lRef + 10){ - delay(150); - } +#ifdef DEBUG + debugSerial.println(lowRef); +#endif /*DEBUG*/ + button = AnalogButton{AnalogButtonPin, lowRef + 10}; } \ No newline at end of file