From 4730087f9e0407dac3795dfea3b10a3f22bc8b54 Mon Sep 17 00:00:00 2001 From: wiebel Date: Fri, 22 Sep 2017 00:25:09 +0200 Subject: [PATCH] new node and FastLED --- src/CANNode.cpp | 196 ++++++++++++++++++++++++++++++++++------------- src/CANNode.h | 3 +- src/Node_2_def.h | 26 ++++--- src/Node_3_def.h | 1 - 4 files changed, 160 insertions(+), 66 deletions(-) diff --git a/src/CANNode.cpp b/src/CANNode.cpp index acb93eb..bcfd014 100644 --- a/src/CANNode.cpp +++ b/src/CANNode.cpp @@ -9,11 +9,12 @@ #include #include #include +#include #include "CANNode.h" // For Node definition: -#include "Node_3_def.h" +#include "Node_2_def.h" // Metro ticks in ms #define METRO_CAN_tick 1 @@ -50,9 +51,12 @@ -uint8_t led = LED; +uint8_t led = ONBOARD_LED; uint8_t state; uint8_t pin_state; +uint8_t led_current_value; +uint8_t led_last_value; +int serial_in; bool action[2]; // Metro Metro METRO_CAN = Metro(METRO_CAN_tick); @@ -69,6 +73,8 @@ OneWire OW_1(OW_pin); telegram_comp_t mesg_comp; +// event info = { 1, 0x03, 0x01, OFF, 0x01}; + static CAN_message_t txmsg,rxmsg; static uint8_t hex[17] = "0123456789abcdef"; @@ -76,6 +82,9 @@ int txCount,rxCount; unsigned int txTimer,rxTimer; +CRGB leds[NUM_LEDS]; + + // Functions ------------------------------^------------------------- void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) { for (uint8_t i = 0; i < count; i++) { @@ -122,7 +131,7 @@ uint8_t toggle_Pin(uint8_t pin){ } uint32_t forgeid(event_t event){ - return (event.prio<<26)+(event.dst<<16)+(NODE_ID<<8)+event.cmd; + return (event.prio<<26)+(event.dst<<18)+(NODE_ID<<8)+event.cmd; } telegram_comp_t parse_CAN(CAN_message_t mesg){ @@ -154,35 +163,94 @@ void send_event (uint8_t trig_event){ txmsg.len = 0; } } +void switch_leds (uint8_t value) { + led_last_value = led_current_value; +// FastLED.setTemperature( TEMP ); +// FastLED.setBrightness( BRIGHTNESS ); + memset8( leds, value, NUM_LEDS * sizeof(CRGB)); + led_current_value = value; + FastLED.show(); +} +void toggle_leds ( void ) { + if ( led_current_value != 0) { + switch_leds(0); + } else { + if ( led_current_value == led_last_value){ + switch_leds(255); + } else { + switch_leds(led_last_value); + } + } +} + void take_action (action_type type, uint8_t tag ){ for (uint8_t i = 0; action_map[i].tag != 0 ; i++) { if ( action_map[i].tag == tag ) { switch ( type ) { case OFF: - digitalWrite(outputs[action_map[i].outputs_idx].address,LOW ^ outputs[action_map[i].outputs_idx].invert); + switch ( outputs[action_map[i].outputs_idx].type ){ + case GPIO: + digitalWrite(outputs[action_map[i].outputs_idx].address,LOW ^ outputs[action_map[i].outputs_idx].invert); + break; + case LED: + switch_leds(0); + break; + } Serial.print(F("Switching OFF Output: ")); Serial.println(action_map[i].outputs_idx); break; case ON: + switch ( outputs[action_map[i].outputs_idx].type ){ + case GPIO: + digitalWrite(outputs[action_map[i].outputs_idx].address,HIGH ^ outputs[action_map[i].outputs_idx].invert); + break; + case LED: + switch_leds(255); + break; + } digitalWrite(outputs[action_map[i].outputs_idx].address, HIGH ^ outputs[action_map[i].outputs_idx].invert); Serial.print(F("Switching ON Output: ")); Serial.println(action_map[i].outputs_idx); break; case TOGGLE: - pin_state = toggle_Pin(outputs[action_map[i].outputs_idx].address); Serial.print(F("Toggeling Output: ")); Serial.print(action_map[i].outputs_idx); Serial.print(F(" to new state: ")); - Serial.println(pin_state ^ outputs[action_map[i].outputs_idx].invert); + switch ( outputs[action_map[i].outputs_idx].type ){ + case GPIO: + pin_state = toggle_Pin(outputs[action_map[i].outputs_idx].address); + Serial.println(pin_state ^ outputs[action_map[i].outputs_idx].invert); + break; + case LED: + toggle_leds(); + Serial.println(led_current_value); + break; + } break; case VALUE: - Serial.println(F("TBD")); + switch ( outputs[action_map[i].outputs_idx].type ){ + case GPIO: + if (VALUE == 0) { + digitalWrite(outputs[action_map[i].outputs_idx].address,LOW ^ outputs[action_map[i].outputs_idx].invert); + } else { + digitalWrite(outputs[action_map[i].outputs_idx].address, HIGH ^ outputs[action_map[i].outputs_idx].invert); + } + break; + case LED: + switch_leds(VALUE); + break; + } + Serial.print(F("Setting Output: ")); + Serial.print(action_map[i].outputs_idx); + Serial.print(F(" to value: ")); + Serial.println(VALUE); break; } } } } + // ------------------------------------------------------------- void setup(void) { @@ -198,6 +266,11 @@ void setup(void) CANbus.begin(); txmsg.ext = 1; txmsg.timeout = 100; + // FastLED + //delay(3000); // sanity delay + FastLED.addLeds(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); + FastLED.setBrightness( BRIGHTNESS ); + FastLED.setTemperature( TEMP ); // outputs for (size_t i = 0; outputs[i].type != NOP; i++) { @@ -319,52 +392,71 @@ void loop(void) --rxTimer; } } - while ( CANbus.read(rxmsg) ) { - //hexDump( sizeof(rxmsg), (uint8_t *)&rxmsg ); - DEBUG_WRITE(rxmsg.buf[0]); - rxCount++; - Serial.print("GOT="); - Serial.print(rxmsg.id,HEX); - for (uint8_t i=0; i 0) { + // read the incoming byte: + serial_in = Serial.read(); + switch (serial_in) { + case 0x31 : take_action(TOGGLE, 1); break; + case 0x32 : take_action(TOGGLE, 2); break; + case 0x33 : take_action(TOGGLE, 3); break; + case 0x34 : take_action(TOGGLE, 4); break; + case 0x35 : take_action(TOGGLE, 5); break; + case 0x36 : take_action(TOGGLE, 6); break; + case 0x37 : take_action(TOGGLE, 7); break; + case 0x38 : take_action(TOGGLE, 8); break; + case 0x39 : take_action(TOGGLE, 10); break; +// case 0x38 : digitalWrite(13, 1); break; +// case 0x39 : digitalWrite(13, 0); break; } - + // say what you got: + Serial.print("I received: "); + Serial.println(serial_in, HEX); + } } diff --git a/src/CANNode.h b/src/CANNode.h index 8f78b25..d8517e6 100644 --- a/src/CANNode.h +++ b/src/CANNode.h @@ -1,13 +1,14 @@ #include #ifndef CANNODE_TYPES #define CANNODE_TYPES -enum out_type { GPIO, PWM, OW, I2C, SPI, WS2811, DMX, NOP }; +enum out_type { GPIO, PWM, OW, I2C, SPI, LED, DMX, NOP }; enum event_type { LOCAL, SEND}; enum action_type { OFF, ON, VALUE, TOGGLE }; enum telegram_type { ALERT, EVENT, NOTIFY, INFO }; typedef struct CAN_telegram_t { + // 3bit prio - uint32_t id; uint8_t length; uint8_t buf[8]; diff --git a/src/Node_2_def.h b/src/Node_2_def.h index bd6743b..481dcb0 100644 --- a/src/Node_2_def.h +++ b/src/Node_2_def.h @@ -10,16 +10,16 @@ #define N_ACTIONS 64 #define DEBUG 0 // 1 for noisy serial -#define LED 13 +#define ONBOARD_LED 13 -#define RELAY1 0 -#define RELAY2 1 -#define RELAY3 23 -#define RELAY4 22 -#define RELAY5 17 -#define RELAY6 16 -#define RELAY7 9 -#define RELAY8 10 +#define LED_PIN 20 +#define COLOR_ORDER GRB +#define CHIPSET WS2812 +#define NUM_LEDS 4 + +#define BRIGHTNESS 255 +//#define TEMP Tungsten100W +#define TEMP Candle // OneWire #define OW_pin 14 @@ -45,9 +45,10 @@ static outputs_t outputs[N_OUTPUTS] PROGMEM={ { GPIO, 22, 0, true }, // 3 { GPIO, 17, 0, true }, // 4 { GPIO, 16, 0, true }, // 5 - { GPIO, 9, 255, true }, // 6 - { GPIO, 10, 0, true }, // 7 - { NOP, 0xFF, 0, 0 } + { GPIO, 19, 255, true }, // 6 + { GPIO, 18, 0, true }, // 7 + { LED, 21, 0, false }, // 8 + { NOP, 0xFF, 0, 0 }, }; static uint8_t outputs_state[N_OUTPUTS]; // ID: @@ -99,6 +100,7 @@ static action_t action_map[N_ACTIONS] PROGMEM={ {7, 6}, {8, 7}, {9, 0},{9, 1},{9, 2},{9, 3},{9, 4},{9, 5},{9, 6},{9, 7}, + {10, 8}, {210, 210}, {211, 211}, {220, 220}, diff --git a/src/Node_3_def.h b/src/Node_3_def.h index c543e5c..4278438 100644 --- a/src/Node_3_def.h +++ b/src/Node_3_def.h @@ -1,4 +1,3 @@ -#include "CANNode.h" // Configuration #define NODE_ID 0x03