attiny841 support & various improvments

This commit is contained in:
Tropicananass 2025-01-30 17:43:56 +01:00
parent a562810380
commit fff14189ad
17 changed files with 106008 additions and 469 deletions

View File

@ -1,3 +1,4 @@
# LedRing
# LedStrip
Manage one wire RGB led (ws2812b, ws2815, etc) strip with attiny (attiny85, attiny841) and a rotary encoder with a push button
Manage ws2812b ring (neopixel 24 led) with attiny85 and a rotary encoder

View File

@ -14,7 +14,7 @@ default_envs = attiny841_debug
[env]
build_flags = -Wall
lib_deps =
Encoder
paulstoffregen/Encoder@^1.4.4
[env:attiny85]
build_type = release
@ -24,11 +24,10 @@ framework = arduino
upload_protocol = usbtiny
[env:attiny85_debug]
build_type = debug
extends = env:attiny85
build_flags = -D __BUILD_DEBUG__
[env:attiny85_init_debug]
build_type = debug
extends = env:attiny85_debug
build_flags = -D DEBUG_INIT
@ -38,8 +37,6 @@ platform = atmelavr
board = attiny841
framework = arduino
upload_protocol = usbtiny
; default is 42 which divides by 8 internal clock to wich gives a system clock of 1MHz
; whith C2 we do not divide and system runs at 8MHz
board_build.f_cpu = 8000000L
board_fuses.lfuse = 0xC2
board_fuses.hfuse = 0xDF
@ -47,13 +44,18 @@ board_fuses.efuse = 0xFF
[env:attiny841_debug]
extends = env:attiny841
build_flags = -D DEBUG_INIT -D __BUILD_DEBUG__
build_flags = -D __BUILD_DEBUG__
[env:uno]
build_type = debug
lib_deps =
Adafruit NeoPixel
lib_deps =
${env.lib_deps}
Adafruit NeoPixel
platform = atmelavr
board = uno
framework = arduino
build_flags = -D DEBUG
build_flags = -D __BUILD_DEBUG__
[env:uno_analog]
extends = env:uno
build_flags = ${env:uno.build_flags} -D ANALOG_BUTTON

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,83 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "attiny841.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View File

@ -0,0 +1,584 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.762,
"height": 1.524,
"width": 1.524
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_near_hole": "error",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "attiny841.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"bom_export_filename": "",
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
},
{
"group_by": false,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"name": "Grouped By Value",
"sort_asc": true,
"sort_field": "Reference"
},
"connection_grid_size": 50.0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"overbar_offset_ratio": 1.23,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_dissipations": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"cb328b30-5a48-4e50-af91-429e48189072",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
schematics/attiny_841.pdf Normal file

Binary file not shown.

View File

@ -2,9 +2,11 @@
#include <Arduino.h>
#include "global.hpp"
void Button::setup(void) { pinMode(_pin, INPUT_PULLUP); }
bool Button::is_button_pressed(void) { return digitalRead(_pin) == 0; }
bool Button::is_pressed(void) { return digitalRead(_pin) == 0; }
void AnalogButton::setup(void) {
if (_vRef < 0) {
@ -17,8 +19,9 @@ bool AnalogButton::is_button_pressed(void) { return analogRead(_pin) < _vRef; }
void AnalogButton::calibrate(void) {
int highRef, lowRef;
#if defined(__BUILD_DEBUG__) && false
debugSerial.print(__func__);
#if defined(__BUILD_DEBUG__)
debugSerial.println(__func__);
debugSerial.println("Getting high ref > 1000");
#endif /* defined(__BUILD_DEBUG__) */
/* Get the button released (High) state voltage, should be close to 1024 (analogRead max) */
@ -27,23 +30,28 @@ void AnalogButton::calibrate(void) {
delay(300);
} while (highRef < 1000);
#if defined(__BUILD_DEBUG__) && false
debugSerial.println("highRef=");
#if defined(__BUILD_DEBUG__)
debugSerial.print("highRef=");
debugSerial.println(highRef);
debugSerial.print("Getting low ref < ");
debugSerial.println(highRef - 50);
#endif /* defined(__BUILD_DEBUG__) */
/* Get the button pushed (Low) state voltage (min of ~5% difference needed to avoid false detection) */
lowRef = analogRead(_pin);
while (highRef - lowRef < 50) {
do {
lowRef = analogRead(_pin);
delay(300);
}
} while (lowRef > highRef - 50);
#if defined(__BUILD_DEBUG__) && false
#if defined(__BUILD_DEBUG__)
debugSerial.println("lowRef=");
debugSerial.println(lowRef);
#endif /* defined(__BUILD_DEBUG__) */
/* Add ~1% tolerance */
_vRef = lowRef + 10;
#if defined(__BUILD_DEBUG__)
debugSerial.println("vRef=");
debugSerial.println(_vRef);
#endif /* defined(__BUILD_DEBUG__) */
}

View File

@ -10,7 +10,7 @@ public:
~Button() {};
void setup(void);
bool is_button_pressed(void);
bool is_pressed(void);
protected:
uint8_t _pin;

View File

@ -2,6 +2,8 @@
#define __GLOBAL_HPP__
#include <Arduino.h>
#define LED_STRIP_LEGNTH 36
/* debug Serial definition */
#if defined(__BUILD_DEBUG__)
#if defined(ARDUINO_AVR_ATTINYX5)

View File

@ -1,5 +1,4 @@
#include "led_strip.hpp"
#include "global.hpp"
// LedStrip::LedStrip(/* args */) {}
// LedStrip::~LedStrip() {}
@ -25,170 +24,288 @@ void LedStrip::fill(uint32_t c, uint16_t first, uint16_t count) {
}
for (i = first; i < end; i++) {
setPixelColor(i, c);
this->setPixelColor(i, c);
}
}
uint32_t tinyNeoPixel::ColorHSV(uint16_t hue, uint8_t sat, uint8_t val) {
uint8_t r, g, b;
/* Remap 0-65535 to 0-1529. Pure red is CENTERED on the 64K rollover;
* 0 is not the start of pure red, but the midpoint...a few values above
* zero and a few below 65536 all yield pure red (similarly, 32768 is the
* midpoint, not start, of pure cyan). The 8-bit RGB hexcone (256 values
* each for red, green, blue) really only allows for 1530 distinct hues
* (not 1536, more on that below), but the full unsigned 16-bit type was
* chosen for hue so that one's code can easily handle a contiguous color
* wheel by allowing hue to roll over in either direction.
*/
hue = (hue * 1530L + 32768) / 65536;
/* Because red is centered on the rollover point (the +32768 above,
* essentially a fixed-point +0.5), the above actually yields 0 to 1530,
* where 0 and 1530 would yield the same thing. Rather than apply a
* costly modulo operator, 1530 is handled as a special case below.
*
* So you'd think that the color "hexcone" (the thing that ramps from
* pure red, to pure yellow, to pure green and so forth back to red,
* yielding six slices), and with each color component having 256
* possible values (0-255), might have 1536 possible items (6*256),
* but in reality there's 1530. This is because the last element in
* each 256-element slice is equal to the first element of the next
* slice, and keeping those in there this would create small
* discontinuities in the color wheel. So the last element of each
* slice is dropped...we regard only elements 0-254, with item 255
* being picked up as element 0 of the next slice. Like this:
* Red to not-quite-pure-yellow is: 255, 0, 0 to 255, 254, 0
* Pure yellow to not-quite-pure-green is: 255, 255, 0 to 1, 255, 0
* Pure green to not-quite-pure-cyan is: 0, 255, 0 to 0, 255, 254
* and so forth. Hence, 1530 distinct hues (0 to 1529), and hence why
* the constants below are not the multiples of 256 you might expect.
*/
// Convert hue to R,G,B (nested ifs faster than divide+mod+switch):
if (hue < 510) { // Red to Green-1
b = 0;
if (hue < 255) { // Red to Yellow-1
r = 255;
g = hue; // g = 0 to 254
} else { // Yellow to Green-1
r = 510 - hue; // r = 255 to 1
g = 255;
}
} else if (hue < 1020) { // Green to Blue-1
r = 0;
if (hue < 765) { // Green to Cyan-1
g = 255;
b = hue - 510; // b = 0 to 254
} else { // Cyan to Blue-1
g = 1020 - hue; // g = 255 to 1
b = 255;
}
} else if (hue < 1530) { // Blue to Red-1
g = 0;
if (hue < 1275) { // Blue to Magenta-1
r = hue - 1020; // r = 0 to 254
b = 255;
} else { // Magenta to Red-1
r = 255;
b = 1530 - hue; // b = 255 to 1
}
} else { // Last 0.5 Red (quicker than % operator)
r = 255;
g = b = 0;
}
// Apply saturation and value to R,G,B, pack into 32-bit result:
uint32_t v1 = 1 + val; // 1 to 256; allows >>8 instead of /255
uint16_t s1 = 1 + sat; // 1 to 256; same reason
uint8_t s2 = 255 - sat; // 255 to 0
return ((((((r * s1) >> 8) + s2) * v1) & 0xff00) << 8) | (((((g * s1) >> 8) + s2) * v1) & 0xff00) |
(((((b * s1) >> 8) + s2) * v1) >> 8);
}
#endif /* defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX41) */
void LedStrip::setup() {
void LedStrip::setup(bool is_diag_mode) {
pinMode(LedPin, OUTPUT);
setPixelColor(0, 255, 0, 0);
fill(Color(45, 0, 0));
show();
delay(300);
fill(Color(0, 45, 0));
show();
delay(300);
fill(Color(0, 0, 45));
show();
delay(300);
if (is_diag_mode) {
setPixelColor(0, 255, 0, 0);
fill(Color(45, 0, 0));
show();
delay(300);
fill(Color(0, 45, 0));
show();
delay(300);
fill(Color(0, 0, 45));
show();
delay(300);
}
this->refresh();
}
void LedStrip::shiftHue(int shift) {
hue += (shift << 11);
/* | encoder | hue | sat
* values | 20 | 65536 | 256
* step | 1 | 3277 |
* shift | 0 | 11 | 4
* rounded | | 2048 | 16
* total steps | | 32 | 16
*/
#if defined(__BUILD_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(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
}
void LedStrip::shiftSaturation(int shift) {
saturation += (shift << 4);
#if defined(__BUILD_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(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
}
void LedStrip::shiftBrightness(int shift) {
brightness += (shift << 4);
#if defined(__BUILD_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(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
}
void LedStrip::shiftFirstLedOn(int shift) {
if (shift > 0) {
if (firstLedOn > LedCount) {
firstLedOn = 0;
} else {
++firstLedOn;
}
} else {
if (firstLedOn < 1) {
firstLedOn = LedCount - 1;
} else {
--firstLedOn;
}
}
#if defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)
if (shift != 0) {
debugSerial.print(__func__);
debugSerial.print(" : shift=");
debugSerial.print(shift, DEC);
debugSerial.print(", firstLedOn=");
debugSerial.println(firstLedOn, DEC);
}
#endif /*defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
}
void LedStrip::shiftLedOnLenght(int shift) {
if (shift > 0) {
if (ledOnCount < LedCount) {
++ledOnCount;
} else {
ledOnCount = 1;
}
} else {
if (ledOnCount > 1) {
--ledOnCount;
} else {
ledOnCount = LedCount;
}
}
#if defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)
if (shift != 0) {
debugSerial.print(__func__);
debugSerial.print(" : shift=");
debugSerial.print(shift, DEC);
debugSerial.print(", ledOnCount=");
debugSerial.println(ledOnCount, DEC);
}
#endif /*defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
}
void LedStrip::refresh() {
uint16_t const &ledOnMin = ledRingColorState.ledOnMin;
uint16_t const &ledOnMax = ledRingColorState.ledOnMax;
uint16_t LedOnCount = 0;
unsigned int lastLedOn = {firstLedOn + ledOnCount};
/* 0 <= Chunk 1 < x <= Chunk 2 < y <= Chunk 3 < ledcount*/
unsigned int chunk_index[4] = {0, 0, 0, LedCount};
bool isChunkOn;
#if defined(__BUILD_DEBUG__)
debugSerial.print("Color hue,sat,bri=");
debugSerial.print(ledRingColorState.hue);
debugSerial.print(this->hue);
debugSerial.print(",");
debugSerial.print(ledRingColorState.saturation);
debugSerial.print(this->saturation);
debugSerial.print(",");
debugSerial.println(ledRingColorState.brightness);
debugSerial.println(this->brightness);
#endif /* defined(__BUILD_DEBUG__) */
/* reset ring */
fill();
// this->fill(0);
/* compute number of led on */
if (ledOnMin <= ledOnMax) {
LedOnCount = ledOnMax - ledOnMin;
if (lastLedOn < LedCount) {
isChunkOn = false;
/* firstPhysicalLedOn */
chunk_index[1] = firstLedOn;
/* lastPhysicalLedOn */
chunk_index[2] = chunk_index[1] + ledOnCount;
} else {
LedOnCount = LedCount - (ledOnMax - ledOnMax);
isChunkOn = true;
/* firstPhysicalLedOff */
chunk_index[1] = firstLedOn + ledOnCount - LedCount;
/* lastPhysicalLedOff */
chunk_index[2] = chunk_index[1] + LedCount - ledOnCount;
}
#if defined(__BUILD_DEBUG__)
debugSerial.print("Led min,max,count=");
debugSerial.print(ledOnMin);
debugSerial.print(",");
debugSerial.print(ledOnMax);
debugSerial.print(",");
debugSerial.println(LedOnCount);
debugSerial.print("LedStrip=>");
debugSerial.print(chunk_index[0]);
debugSerial.print("<");
debugSerial.print(isChunkOn ? "ON" : "OFF");
debugSerial.print(">");
debugSerial.print(chunk_index[1]);
debugSerial.print("<");
debugSerial.print(isChunkOn ? "OFF" : "ON");
debugSerial.print(">");
debugSerial.print(chunk_index[2]);
debugSerial.print("<");
debugSerial.print(isChunkOn ? "ON" : "OFF");
debugSerial.print(">");
debugSerial.print(chunk_index[3]);
debugSerial.print("<");
debugSerial.print(isChunkOn ? "OFF" : "ON");
debugSerial.println(">");
#endif /* defined(__BUILD_DEBUG__) */
for (size_t i = ledRingColorState.ledOnMin; i < ledRingColorState.ledOnMin + LedOnCount; ++i) {
unsigned int ledId = i;
if (ledId >= LedCount) {
ledId -= LedCount;
for (size_t i = 0; i < 3; ++i) {
unsigned int firstLedOnChunk = chunk_index[i];
unsigned int lastLedOnChunk = chunk_index[i + 1];
uint32_t color;
if (isChunkOn) {
color = ColorHSV(this->hue, this->saturation, this->brightness);
} else {
color = 0;
}
setPixelColor(ledId, ColorHSV(ledRingColorState.hue, ledRingColorState.saturation, ledRingColorState.brightness));
}
show();
}
void LedStrip::next_preset(void) {
++presetState.index;
if (presetState.index >= PresetMax) {
presetState.index = 0;
++presetState.level;
if (presetState.level >= PresetLevelMax) {
presetState.level = 0;
for (size_t j = firstLedOnChunk; j < lastLedOnChunk; ++j) {
this->setPixelColor(j, color);
}
isChunkOn = !isChunkOn;
}
this->show();
}
void LedStrip::previous_preset(void) {
--presetState.index;
if (presetState.index == UINT8_MAX) {
presetState.index = PresetMax - 1;
--presetState.level;
if (presetState.level == UINT8_MAX) {
presetState.level = PresetLevelMax - 1;
void LedStrip::display_mode(unsigned int mode_index) {
for (size_t i = 0; i < 3; ++i) {
this->fill(0);
this->show();
delay(150);
for (size_t i = 0; i < mode_index; ++i) {
this->setPixelColor(i, ColorHSV(0, 255, 16));
}
this->show();
delay(150);
}
}
void LedStrip::display_led_ring(bool is_preset_enabled) {
LedRingColorState_t colorState;
if (is_preset_enabled) {
#if defined(__BUILD_DEBUG__) && false
debugSerial.print("Preset index,level=");
debugSerial.print(presetState.index);
debugSerial.print(",");
debugSerial.print(presetState.level);
debugSerial.println();
#endif /* defined(__BUILD_DEBUG__) */
colorState = {.ledOnMin = this->ledRingColorState.ledOnMin,
.ledOnMax = this->ledRingColorState.ledOnMax,
.hue = PresetHue[presetState.index],
.saturation = (presetState.index == (PresetMax - 1U)) ? 0U : UINT8_MAX,
.brightness = PresetBrightness[presetState.level]};
refresh_led_ring(&colorState);
} else {
refresh_led_ring();
}
}
void LedStrip::refresh_led_ring(LedRingColorState_t const *ledRingColorState) {
if (ledRingColorState == nullptr) {
ledRingColorState = &this->ledRingColorState
}
uint16_t const &ledOnMin = ledRingColorState.ledOnMin;
uint16_t const &ledOnMax = ledRingColorState.ledOnMax;
uint16_t LedOnCount = 0;
#if defined(__BUILD_DEBUG__)
debugSerial.print("Color hue,sat,bri=");
debugSerial.print(ledRingColorState.hue);
debugSerial.print(",");
debugSerial.print(ledRingColorState.saturation);
debugSerial.print(",");
debugSerial.println(ledRingColorState.brightness);
#endif /* defined(__BUILD_DEBUG__) */
/* reset ring */
this->fill(0);
/* compute number of led on */
if (ledOnMin <= ledOnMax) {
LedOnCount = ledOnMax - ledOnMin;
} else {
LedOnCount = ledCount - (ledOnMax - ledOnMax);
}
#if defined(__BUILD_DEBUG__)
debugSerial.print("Led min,max,count=");
debugSerial.print(ledOnMin);
debugSerial.print(",");
debugSerial.print(ledOnMax);
debugSerial.print(",");
debugSerial.println(LedOnCount);
#endif /* defined(__BUILD_DEBUG__) */
for (size_t i = ledRingColorState.ledOnMin; i < ledRingColorState.ledOnMin + LedOnCount; ++i) {
unsigned int ledId = i;
if (ledId >= LedCount) {
ledId -= LedCount;
}
ledRing.setPixelColor(ledId, Adafruit_NeoPixel::ColorHSV(ledRingColorState.hue, ledRingColorState.saturation,
ledRingColorState.brightness));
}
ledRing.show();
}
// void display_mode(Mode_e mode) {
// if (currentMode != Mode_e::ControlOff) {
// for (size_t i = 0; i < 3; ++i) {
// fill(0);
// show();
// delay(300);
// for (Mode_e i = Mode_e::Init; i < currentMode; ++i) {
// setPixelColor(int(i), Adafruit_NeoPixel::ColorHSV(0, 255, 16));
// }
// show();
// delay(300);
// }
// }
// }
this->refresh();
}

View File

@ -9,32 +9,8 @@
#endif /* defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX41) */
#include "pin_map.hpp"
#include "global.hpp"
/* Leds */
/* Led ring color and led count state */
typedef struct {
uint16_t ledOnMin;
uint16_t ledOnMax;
uint16_t hue;
uint8_t saturation;
uint8_t brightness;
} LedRingColorState_t;
uint8_t const PresetMax{8};
// https://hslpicker.com/ = {0, 40, 50, 110, 240, 280, 310, 360 for white}
uint16_t const PresetHue[PresetMax] = {0, 7282, 9102, 20025, 43691, 50972, 56434, 65535};
uint8_t const PresetLevelMax{3};
uint8_t const PresetBrightness[PresetLevelMax] = {16, 64, 127};
/* Preset state */
typedef struct {
uint8_t index;
uint8_t level;
} PresetState_t;
#if defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX41)
class LedStrip : tinyNeoPixel {
@ -44,32 +20,39 @@ class LedStrip : Adafruit_NeoPixel {
public:
#if defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX41)
LedStrip(void) : tinyNeoPixel{LedCount, LedPin, NEO_GRB + NEO_KHZ800, pixels} {}
LedStrip(void)
: tinyNeoPixel{LedCount, LedPin, NEO_GRB + NEO_KHZ800, pixels}, firstLedOn{0},
ledOnCount{LedCount}, hue{2048}, saturation{207}, brightness{239} {}
void fill(uint32_t c = 0, uint16_t first = 0, uint16_t count = 0);
#else
LedStrip(void) : Adafruit_NeoPixel{LedCount, LedPin, NEO_GRB + NEO_KHZ800} {}
LedStrip(void)
: Adafruit_NeoPixel{LedCount, LedPin, NEO_GRB + NEO_KHZ800}, firstLedOn{0}, ledOnCount{LedCount},
hue{2048}, saturation{207}, brightness{239} {}
#endif /* defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX41) */
virtual ~LedStrip() {}
void setup();
void setup(bool is_diag_mode);
void display_mode(unsigned int mode_index);
void refresh();
void next_preset();
void previous_preset();
void display_led_ring(bool is_preset_enabled);
void shiftHue(int shift);
void shiftSaturation(int shift);
void shiftBrightness(int shift);
void shiftFirstLedOn(int shift);
void shiftLedOnLenght(int shift);
private:
uint16_t static const LedCount{24};
uint16_t static const LedCount{LED_STRIP_LEGNTH};
/* IO Objects */
#if defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX41)
byte pixels[LedCount * 3];
#endif /* defined(ARDUINO_AVR_ATTINYX5) || defined(ARDUINO_AVR_ATTINYX41) */
LedRingColorState_t ledRingColorState = {
.ledOnMin = 0, .ledOnMax = LedCount / 2, .hue = 0, .saturation = 255, .brightness = 16};
PresetState_t presetState = {.index = 0, .level = 0};
void refresh_led_ring(LedRingColorState_t const *ledRingColorState = nullptr);
unsigned int firstLedOn, ledOnCount;
uint16_t hue;
uint8_t saturation;
uint8_t brightness;
};
#endif /* __LED_STRIP_HPP__ */

View File

@ -1,4 +1,8 @@
#include <Arduino.h>
#if defined(__BUILD_DEBUG__) && !defined(ARDUINO_AVR_UNO)
/* Using interrupts with serial seems to cause instability */
#define ENCODER_DO_NOT_USE_INTERRUPTS
#endif
#include <Encoder.h>
#include "global.hpp"
@ -12,14 +16,13 @@
/* State machine */
#define FOREACH_MODE(MODE) \
MODE(Init) \
MODE(LightOnMin) \
MODE(LightOnMax) \
MODE(Preset) \
MODE(FirstLedOn) \
MODE(LedOnLength) \
MODE(SetColor) \
MODE(SetSaturation) \
MODE(SetBrightness) \
MODE(ControlOff)
MODE(ControlOff) \
#define GENERATE_MODE_ENUM(ENUM) ENUM,
@ -29,7 +32,7 @@ enum class Mode_e { FOREACH_MODE(GENERATE_MODE_ENUM) };
/* Cyclic increment operator for Mode_e */
Mode_e &operator++(Mode_e &mode) {
if (mode == Mode_e::ControlOff) {
return mode = Mode_e::Init;
return mode = Mode_e::FirstLedOn;
}
return mode = static_cast<Mode_e>(static_cast<int>(mode) + 1);
}
@ -41,7 +44,7 @@ char static const *mode_str[] = {FOREACH_MODE(GENERATE_MODE_STRING)};
#endif /* defined(__BUILD_DEBUG__) */
/* Led ring system state */
Mode_e currentMode{Mode_e::Init};
Mode_e currentMode{Mode_e::ControlOff};
/* Global variables */
/*--------------------------------------------------------------------------------------------------------------------*/
@ -49,12 +52,16 @@ Mode_e currentMode{Mode_e::Init};
/* IO Objects */
Encoder encoder{EncoderPinA, EncoderPinB};
#if defined(ARDUINO_AVR_ATTINYX5)
AnalogButton button{AnalogButtonPin, AnalogButtonVRef};
AnalogButton button{ButtonPin, AnalogButtonVRef};
#elif defined(ARDUINO_AVR_ATTINYX41)
Button button{ButtonPin};
#else
#if defined(ANALOG_BUTTON)
/* No vRef defined force to calibrate for test purpose */
AnalogButton button{AnalogButtonPin};
AnalogButton button{ButtonPin};
#else
Button button{ButtonPin};
#endif /* defined(ANALOG_BUTTON) */
#endif /* defined(ARDUINO_AVR_ATTINYX41) */
LedStrip ledStrip{};
@ -65,7 +72,7 @@ LedStrip ledStrip{};
SoftwareSerial debugSerial{RxPin, TxPin};
#elif defined(ARDUINO_AVR_ATTINYX41)
HardwareSerial &debugSerial = Serial1;
#elif
#else
HardwareSerial &debugSerial = Serial;
#endif
#endif /* defined(__BUILD_DEBUG__) */
@ -77,23 +84,11 @@ HardwareSerial &debugSerial = Serial;
#define GENERATE_MODE_EXEC_DECLARTION(MODE) void MODE##_execute(int shift);
FOREACH_MODE(GENERATE_MODE_EXEC_DECLARTION)
/* Encoder */
void analog_button_calibration(void);
int get_encoder_shift(void);
// void display_mode(Mode_e mode);
// void display_led_ring(void);
// void refresh_led_ring(LedRingColorState_t const &ledRingColorState = ledRingState.ledRingColorState);
/* Function definitions */
/*--------------------------------------------------------------------------------------------------------------------*/
void setup() {
ledStrip.setup();
button.setup();
#if defined(__BUILD_DEBUG__)
debugSerial.begin(9600);
#if defined(DEBUG_INIT)
@ -103,6 +98,9 @@ void setup() {
debugSerial.println("Init ... ");
#endif /* defined(__BUILD_DEBUG__) */
button.setup();
ledStrip.setup(button.is_pressed());
get_encoder_shift();
#if defined(__BUILD_DEBUG__)
@ -111,12 +109,11 @@ void setup() {
}
void loop() {
bool hasModeChanged{false};
int shift{get_encoder_shift()};
if (button.is_button_pressed()) {
while (button.is_button_pressed()) {
delay(150);
if (button.is_pressed()) {
while (button.is_pressed()) {
delay(10);
}
++currentMode;
@ -124,10 +121,10 @@ void loop() {
debugSerial.println(mode_str[static_cast<int>(currentMode)]);
#endif /* defined(__BUILD_DEBUG__) */
// display_mode(currentMode);
hasModeChanged = true;
if (currentMode != Mode_e::ControlOff) {
ledStrip.display_mode(static_cast<unsigned int>(currentMode) + 1);
}
}
ledStrip.setup();
if (shift != 0) {
switch (currentMode) {
@ -135,38 +132,34 @@ void loop() {
ControlOff_execute(shift);
break;
case Mode_e::Preset:
Preset_execute(shift);
case Mode_e::SetColor:
SetColor_execute(shift);
break;
// case Mode_e::SetColor:
// SetColor_execute(shift);
// break;
case Mode_e::SetBrightness:
SetBrightness_execute(shift);
break;
// case Mode_e::SetBrightness:
// SetBrightness_execute(shift);
// break;
case Mode_e::SetSaturation:
SetSaturation_execute(shift);
break;
// case Mode_e::SetSaturation:
// SetSaturation_execute(shift);
// break;
case Mode_e::FirstLedOn:
FirstLedOn_execute(shift);
break;
// case Mode_e::LightOnMin:
// LightOnMin_execute(shift);
// break;
// case Mode_e::LightOnMax:
// LightOnMax_execute(shift);
// break;
case Mode_e::LedOnLength:
LedOnLength_execute(shift);
break;
default:
break;
}
}
// if (currentMode != Mode_e::ControlOff && (shift != 0 || hasModeChanged)) {
// display_led_ring();
// }
if (currentMode != Mode_e::ControlOff && shift != 0) {
ledStrip.refresh();
}
}
/* Private function definitions */
@ -176,135 +169,25 @@ void loop() {
void ControlOff_execute(int shift) {}
void Preset_execute(int shift) {
if (shift > 0) {
ledStrip.next_preset();
} else {
ledStrip.previous_preset();
}
} /* Preset_execute */
void SetColor_execute(int shift) {
ledStrip.shiftHue(shift);
} /* SetColor_execute */
// void SetColor_execute(int shift) {
// uint16_t &hue = ledRingState.ledRingColorState.hue;
void SetBrightness_execute(int shift) {
ledStrip.shiftBrightness(shift);
} /* SetBrightness_execute */
// hue += (shift << 8);
void SetSaturation_execute(int shift) {
ledStrip.shiftSaturation(shift);
} /* SetSaturation_execute */
// #if defined(__BUILD_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(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
// } /* SetColor_execute */
void FirstLedOn_execute(int shift) {
ledStrip.shiftFirstLedOn(shift);
} /* FirstLedOn_execute */
// void SetBrightness_execute(int shift) {
// uint8_t &brightness = ledRingState.ledRingColorState.brightness;
// brightness += (shift << 2);
// #if defined(__BUILD_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(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
// } /* SetBrightness_execute */
// void SetSaturation_execute(int shift) {
// uint8_t &saturation = ledRingState.ledRingColorState.saturation;
// saturation += (shift << 2);
// #if defined(__BUILD_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(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
// } /* SetSaturation_execute */
// void LightOnMin_execute(int shift) {
// uint16_t &ledOnMin = ledRingState.ledRingColorState.ledOnMin;
// uint16_t &ledOnMax = ledRingState.ledRingColorState.ledOnMax;
// if (shift > 0) {
// if (ledOnMin == ledOnMax) {
// currentMode = Mode_e::LightOnMax;
// ++ledOnMax;
// } else {
// ++ledOnMin;
// if (ledOnMin == LedCount) {
// ledOnMin = 0;
// }
// }
// } else {
// if (ledOnMin == ledOnMax) {
// currentMode = Mode_e::LightOnMax;
// --ledOnMax;
// } else {
// --ledOnMin;
// if (ledOnMin == UINT16_MAX) {
// ledOnMin = LedCount - 1;
// }
// }
// }
// #if defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)
// if (shift != 0) {
// debugSerial.print(__func__);
// debugSerial.print(" : shift=");
// debugSerial.print(shift, DEC);
// debugSerial.print(", ledOnMin=");
// debugSerial.println(ledOnMin, DEC);
// }
// #endif /*defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
// } /* LightOnMin_execute */
// void LightOnMax_execute(int shift) {
// uint16_t &ledOnMin = ledRingState.ledRingColorState.ledOnMin;
// uint16_t &ledOnMax = ledRingState.ledRingColorState.ledOnMax;
// if (shift > 0) {
// if (ledOnMax == ledOnMin) {
// currentMode = Mode_e::LightOnMin;
// ++ledOnMin;
// } else {
// ++ledOnMax;
// if (ledOnMax == LedCount) {
// ledOnMax = 0;
// }
// }
// } else {
// if (ledOnMax == ledOnMin) {
// currentMode = Mode_e::LightOnMin;
// --ledOnMin;
// } else {
// --ledOnMax;
// if (ledOnMax == UINT16_MAX) {
// ledOnMax = LedCount - 1;
// }
// }
// }
// #if defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)
// if (shift != 0) {
// debugSerial.print(__func__);
// debugSerial.print(" : shift=");
// debugSerial.print(shift, DEC);
// debugSerial.print(", ledOnMax=");
// debugSerial.println(ledOnMax, DEC);
// }
// #endif /*defined(__BUILD_DEBUG__) && defined(ARDUINO_AVR_UNO)*/
// } /* LightOnMax_execute */
void LedOnLength_execute(int shift) {
ledStrip.shiftLedOnLenght(shift);
} /* LedOnLength_execute */
/* Others functions */
int get_encoder_shift(void) {
@ -324,86 +207,4 @@ int get_encoder_shift(void) {
} else {
return 0;
}
}
// void display_mode(Mode_e mode) {
// if (currentMode != Mode_e::ControlOff) {
// for (size_t i = 0; i < 3; ++i) {
// ledRing.fill(0);
// ledRing.show();
// delay(300);
// for (Mode_e i = Mode_e::Init; i < currentMode; ++i) {
// ledRing.setPixelColor(int(i), Adafruit_NeoPixel::ColorHSV(0, 255, 16));
// }
// ledRing.show();
// delay(300);
// }
// }
// }
// void display_led_ring(void) {
// PresetState_t &preset = ledRingState.presetState;
// LedRingColorState_t ledRingColorState;
// if (currentMode == Mode_e::Preset) {
// #if defined(__BUILD_DEBUG__) && false
// debugSerial.print("Preset index,level=");
// debugSerial.print(preset.index);
// debugSerial.print(",");
// debugSerial.print(preset.level);
// debugSerial.println();
// #endif /* defined(__BUILD_DEBUG__) */
// ledRingColorState = {.ledOnMin = ledRingState.ledRingColorState.ledOnMin,
// .ledOnMax = ledRingState.ledRingColorState.ledOnMax,
// .hue = PresetHue[preset.index],
// .saturation = (preset.index == (PresetMax - 1)) ? 0 : UINT8_MAX,
// .brightness = PresetBrightness[preset.level]};
// refresh_led_ring(ledRingColorState);
// } else {
// refresh_led_ring();
// }
// }
// void refresh_led_ring(LedRingColorState_t const &ledRingColorState) {
// uint16_t const &ledOnMin = ledRingColorState.ledOnMin;
// uint16_t const &ledOnMax = ledRingColorState.ledOnMax;
// uint16_t LedOnCount = 0;
// #if defined(__BUILD_DEBUG__)
// debugSerial.print("Color hue,sat,bri=");
// debugSerial.print(ledRingColorState.hue);
// debugSerial.print(",");
// debugSerial.print(ledRingColorState.saturation);
// debugSerial.print(",");
// debugSerial.println(ledRingColorState.brightness);
// #endif /* defined(__BUILD_DEBUG__) */
// /* reset ring */
// ledRing.fill(0);
// /* compute number of led on */
// if (ledOnMin <= ledOnMax) {
// LedOnCount = ledOnMax - ledOnMin;
// } else {
// LedOnCount = LedCount - (ledOnMax - ledOnMax);
// }
// #if defined(__BUILD_DEBUG__)
// debugSerial.print("Led min,max,count=");
// debugSerial.print(ledOnMin);
// debugSerial.print(",");
// debugSerial.print(ledOnMax);
// debugSerial.print(",");
// debugSerial.println(LedOnCount);
// #endif /* defined(__BUILD_DEBUG__) */
// for (size_t i = ledRingColorState.ledOnMin; i < ledRingColorState.ledOnMin + LedOnCount; ++i) {
// unsigned int ledId = i;
// if (ledId >= LedCount) {
// ledId -= LedCount;
// }
// ledRing.setPixelColor(ledId, Adafruit_NeoPixel::ColorHSV(ledRingColorState.hue, ledRingColorState.saturation,
// ledRingColorState.brightness));
// }
// ledRing.show();
// }
}

View File

@ -3,47 +3,51 @@
#if defined(ARDUINO_AVR_ATTINYX5)
/* LedStrip output pin */
uint8_t const LedPin{PB0};
uint8_t const LedPin{PIN_PB0};
/* Button analog input pin */
/* Note: we use PB5 as button input which is also the reset pin, to avoid reseting we read an analogic value with
* lower voltage than the triger value of reset */
int const AnalogButtonVRef{970};
uint8_t const AnalogButtonPin{0};
uint8_t const ButtonPin{PINA0};
/* Rotary encoder input pins */
uint8_t const EncoderPinA{PB3};
uint8_t const EncoderPinB{PB4};
/* TODO: change to PB2 for using int0 */
uint8_t const EncoderPinA{PIN_PB3};
uint8_t const EncoderPinB{PIN_PB4};
/* Uart for serial debug pins */
#if defined(__BUILD_DEBUG__)
uint8_t const TxPin{PB1};
uint8_t const RxPin{PB2};
uint8_t const TxPin{PIN_PB1};
uint8_t const RxPin{PIN_PB2};
#endif /* defined(__BUILD_DEBUG__) */
#elif defined(ARDUINO_AVR_ATTINYX41)
/* LedStrip output pin */
uint8_t const LedPin{PA1};
uint8_t const LedPin{PIN_PA1};
/* Button input pin (internally pulled up) */
uint8_t const ButtonPin{ADC11D};
uint8_t const ButtonPin{PIN_PA0};
/* Rotary encoder input pins */
uint8_t const EncoderPinA{PA2};
uint8_t const EncoderPinB{PA3};
/* PB1 is interrupt pin (int0)*/
uint8_t const EncoderPinA{PIN_PB1};
uint8_t const EncoderPinB{PIN_PB0};
/* Uart for serial debug pins */
#if defined(__BUILD_DEBUG__)
uint8_t const TxPin{PA5};
uint8_t const RxPin{PA4};
uint8_t const TxPin{PIN_PA5};
uint8_t const RxPin{PIN_PA4};
#endif /* defined(__BUILD_DEBUG__) */
#elif defined(ARDUINO_AVR_UNO)
/* LedStrip output pin */
uint8_t const LedPin{6};
uint8_t const LedPin{11};
/* Button analog input pin */
uint8_t const AnalogButtonPin{A0};
uint8_t const ButtonPin{A0};
/* Rotary encoder input pins */
uint8_t const EncoderPinA{8};
uint8_t const EncoderPinB{9};
/* INT0 and INT1 */
uint8_t const EncoderPinA{2};
uint8_t const EncoderPinB{3};
#endif /* Hardware selection */
#endif /* __PIN_MAP_HPP__ */