Browse Source

new node and FastLED

led
wiebel 7 years ago
parent
commit
4730087f9e
  1. 196
      src/CANNode.cpp
  2. 3
      src/CANNode.h
  3. 26
      src/Node_2_def.h
  4. 1
      src/Node_3_def.h

196
src/CANNode.cpp

@ -9,11 +9,12 @@
#include <Metro.h> #include <Metro.h>
#include <FlexCAN.h> #include <FlexCAN.h>
#include <OneWire.h> #include <OneWire.h>
#include <FastLED.h>
#include "CANNode.h" #include "CANNode.h"
// For Node definition: // For Node definition:
#include "Node_3_def.h" #include "Node_2_def.h"
// Metro ticks in ms // Metro ticks in ms
#define METRO_CAN_tick 1 #define METRO_CAN_tick 1
@ -50,9 +51,12 @@
uint8_t led = LED; uint8_t led = ONBOARD_LED;
uint8_t state; uint8_t state;
uint8_t pin_state; uint8_t pin_state;
uint8_t led_current_value;
uint8_t led_last_value;
int serial_in;
bool action[2]; bool action[2];
// Metro // Metro
Metro METRO_CAN = Metro(METRO_CAN_tick); Metro METRO_CAN = Metro(METRO_CAN_tick);
@ -69,6 +73,8 @@ OneWire OW_1(OW_pin);
telegram_comp_t mesg_comp; telegram_comp_t mesg_comp;
// event info = { 1, 0x03, 0x01, OFF, 0x01};
static CAN_message_t txmsg,rxmsg; static CAN_message_t txmsg,rxmsg;
static uint8_t hex[17] = "0123456789abcdef"; static uint8_t hex[17] = "0123456789abcdef";
@ -76,6 +82,9 @@ int txCount,rxCount;
unsigned int txTimer,rxTimer; unsigned int txTimer,rxTimer;
CRGB leds[NUM_LEDS];
// Functions ------------------------------^------------------------- // Functions ------------------------------^-------------------------
void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) { void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) {
for (uint8_t i = 0; i < count; i++) { 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){ 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){ telegram_comp_t parse_CAN(CAN_message_t mesg){
@ -154,35 +163,94 @@ void send_event (uint8_t trig_event){
txmsg.len = 0; 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 ){ void take_action (action_type type, uint8_t tag ){
for (uint8_t i = 0; action_map[i].tag != 0 ; i++) { for (uint8_t i = 0; action_map[i].tag != 0 ; i++) {
if ( action_map[i].tag == tag ) { if ( action_map[i].tag == tag ) {
switch ( type ) { switch ( type ) {
case OFF: 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.print(F("Switching OFF Output: "));
Serial.println(action_map[i].outputs_idx); Serial.println(action_map[i].outputs_idx);
break; break;
case ON: 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); digitalWrite(outputs[action_map[i].outputs_idx].address, HIGH ^ outputs[action_map[i].outputs_idx].invert);
Serial.print(F("Switching ON Output: ")); Serial.print(F("Switching ON Output: "));
Serial.println(action_map[i].outputs_idx); Serial.println(action_map[i].outputs_idx);
break; break;
case TOGGLE: case TOGGLE:
pin_state = toggle_Pin(outputs[action_map[i].outputs_idx].address);
Serial.print(F("Toggeling Output: ")); Serial.print(F("Toggeling Output: "));
Serial.print(action_map[i].outputs_idx); Serial.print(action_map[i].outputs_idx);
Serial.print(F(" to new state: ")); 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; break;
case VALUE: 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; break;
} }
} }
} }
} }
// ------------------------------------------------------------- // -------------------------------------------------------------
void setup(void) void setup(void)
{ {
@ -198,6 +266,11 @@ void setup(void)
CANbus.begin(); CANbus.begin();
txmsg.ext = 1; txmsg.ext = 1;
txmsg.timeout = 100; txmsg.timeout = 100;
// FastLED
//delay(3000); // sanity delay
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
FastLED.setTemperature( TEMP );
// outputs // outputs
for (size_t i = 0; outputs[i].type != NOP; i++) { for (size_t i = 0; outputs[i].type != NOP; i++) {
@ -319,52 +392,71 @@ void loop(void)
--rxTimer; --rxTimer;
} }
} }
while ( CANbus.read(rxmsg) ) { while ( CANbus.read(rxmsg) ) {
//hexDump( sizeof(rxmsg), (uint8_t *)&rxmsg ); //hexDump( sizeof(rxmsg), (uint8_t *)&rxmsg );
DEBUG_WRITE(rxmsg.buf[0]); DEBUG_WRITE(rxmsg.buf[0]);
rxCount++; rxCount++;
Serial.print("GOT="); Serial.print("GOT=");
Serial.print(rxmsg.id,HEX); Serial.print(rxmsg.id,HEX);
for (uint8_t i=0; i<rxmsg.len; i++){ for (uint8_t i=0; i<rxmsg.len; i++){
Serial.print(":"); Serial.print(":");
Serial.print(rxmsg.buf[i],HEX); Serial.print(rxmsg.buf[i],HEX);
} }
Serial.println(); Serial.println();
mesg_comp= parse_CAN(rxmsg); mesg_comp= parse_CAN(rxmsg);
if (mesg_comp.dst == 0xFF || mesg_comp.dst == NODE_ID ) { if (mesg_comp.dst == 0xFF || mesg_comp.dst == NODE_ID ) {
switch (mesg_comp.cmd) { switch (mesg_comp.cmd) {
// OFF // OFF
case 0x00 : case 0x00 :
take_action(OFF, mesg_comp.buf[0]); take_action(OFF, mesg_comp.buf[0]);
break; break;
// ON // ON
case 0x01 : case 0x01 :
take_action(ON, mesg_comp.buf[0]); take_action(ON, mesg_comp.buf[0]);
break; break;
// VALUE // VALUE
case 0x02 : case 0x02 :
break; break;
// TOGGLE // TOGGLE
case 0x03: case 0x03:
take_action(TOGGLE, mesg_comp.buf[0]); take_action(TOGGLE, mesg_comp.buf[0]);
break; break;
}
} }
rxCount = 0;
} }
txTimer = 100;//milliseconds rxCount = 0;
if (txmsg.len != 0){ }
Serial.print("PUT="); txTimer = 100;//milliseconds
Serial.print(txmsg.id,HEX); if (txmsg.len != 0){
for (uint8_t i=0; i<txmsg.len; i++){ Serial.print("PUT=");
Serial.print(":"); Serial.print(txmsg.id,HEX);
Serial.print(txmsg.buf[i],HEX); for (uint8_t i=0; i<txmsg.len; i++){
} Serial.print(":");
Serial.print("\n"); Serial.print(txmsg.buf[i],HEX);
CANbus.write(txmsg); }
txmsg.buf[0]++; Serial.print("\n");
txmsg.len = 0; CANbus.write(txmsg);
txmsg.buf[0]++;
txmsg.len = 0;
}
if (Serial.available() > 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);
}
} }

3
src/CANNode.h

@ -1,13 +1,14 @@
#include <Arduino.h> #include <Arduino.h>
#ifndef CANNODE_TYPES #ifndef CANNODE_TYPES
#define 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 event_type { LOCAL, SEND};
enum action_type { OFF, ON, VALUE, TOGGLE }; enum action_type { OFF, ON, VALUE, TOGGLE };
enum telegram_type { ALERT, EVENT, NOTIFY, INFO }; enum telegram_type { ALERT, EVENT, NOTIFY, INFO };
typedef struct CAN_telegram_t { typedef struct CAN_telegram_t {
// 3bit prio -
uint32_t id; uint32_t id;
uint8_t length; uint8_t length;
uint8_t buf[8]; uint8_t buf[8];

26
src/Node_2_def.h

@ -10,16 +10,16 @@
#define N_ACTIONS 64 #define N_ACTIONS 64
#define DEBUG 0 // 1 for noisy serial #define DEBUG 0 // 1 for noisy serial
#define LED 13 #define ONBOARD_LED 13
#define RELAY1 0 #define LED_PIN 20
#define RELAY2 1 #define COLOR_ORDER GRB
#define RELAY3 23 #define CHIPSET WS2812
#define RELAY4 22 #define NUM_LEDS 4
#define RELAY5 17
#define RELAY6 16 #define BRIGHTNESS 255
#define RELAY7 9 //#define TEMP Tungsten100W
#define RELAY8 10 #define TEMP Candle
// OneWire // OneWire
#define OW_pin 14 #define OW_pin 14
@ -45,9 +45,10 @@ static outputs_t outputs[N_OUTPUTS] PROGMEM={
{ GPIO, 22, 0, true }, // 3 { GPIO, 22, 0, true }, // 3
{ GPIO, 17, 0, true }, // 4 { GPIO, 17, 0, true }, // 4
{ GPIO, 16, 0, true }, // 5 { GPIO, 16, 0, true }, // 5
{ GPIO, 9, 255, true }, // 6 { GPIO, 19, 255, true }, // 6
{ GPIO, 10, 0, true }, // 7 { GPIO, 18, 0, true }, // 7
{ NOP, 0xFF, 0, 0 } { LED, 21, 0, false }, // 8
{ NOP, 0xFF, 0, 0 },
}; };
static uint8_t outputs_state[N_OUTPUTS]; static uint8_t outputs_state[N_OUTPUTS];
// ID: // ID:
@ -99,6 +100,7 @@ static action_t action_map[N_ACTIONS] PROGMEM={
{7, 6}, {7, 6},
{8, 7}, {8, 7},
{9, 0},{9, 1},{9, 2},{9, 3},{9, 4},{9, 5},{9, 6},{9, 7}, {9, 0},{9, 1},{9, 2},{9, 3},{9, 4},{9, 5},{9, 6},{9, 7},
{10, 8},
{210, 210}, {210, 210},
{211, 211}, {211, 211},
{220, 220}, {220, 220},

1
src/Node_3_def.h

@ -1,4 +1,3 @@
#include "CANNode.h"
// Configuration // Configuration
#define NODE_ID 0x03 #define NODE_ID 0x03

Loading…
Cancel
Save