new node and FastLED
This commit is contained in:
parent
26ac6558e4
commit
4730087f9e
198
src/CANNode.cpp
198
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();
|
|
||||||
mesg_comp= parse_CAN(rxmsg);
|
|
||||||
if (mesg_comp.dst == 0xFF || mesg_comp.dst == NODE_ID ) {
|
|
||||||
|
|
||||||
switch (mesg_comp.cmd) {
|
|
||||||
// OFF
|
|
||||||
case 0x00 :
|
|
||||||
take_action(OFF, mesg_comp.buf[0]);
|
|
||||||
break;
|
|
||||||
// ON
|
|
||||||
case 0x01 :
|
|
||||||
take_action(ON, mesg_comp.buf[0]);
|
|
||||||
break;
|
|
||||||
// VALUE
|
|
||||||
case 0x02 :
|
|
||||||
break;
|
|
||||||
// TOGGLE
|
|
||||||
case 0x03:
|
|
||||||
take_action(TOGGLE, mesg_comp.buf[0]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
rxCount = 0;
|
Serial.println();
|
||||||
}
|
mesg_comp= parse_CAN(rxmsg);
|
||||||
txTimer = 100;//milliseconds
|
if (mesg_comp.dst == 0xFF || mesg_comp.dst == NODE_ID ) {
|
||||||
if (txmsg.len != 0){
|
|
||||||
Serial.print("PUT=");
|
|
||||||
Serial.print(txmsg.id,HEX);
|
|
||||||
for (uint8_t i=0; i<txmsg.len; i++){
|
|
||||||
Serial.print(":");
|
|
||||||
Serial.print(txmsg.buf[i],HEX);
|
|
||||||
}
|
|
||||||
Serial.print("\n");
|
|
||||||
CANbus.write(txmsg);
|
|
||||||
txmsg.buf[0]++;
|
|
||||||
txmsg.len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
switch (mesg_comp.cmd) {
|
||||||
|
// OFF
|
||||||
|
case 0x00 :
|
||||||
|
take_action(OFF, mesg_comp.buf[0]);
|
||||||
|
break;
|
||||||
|
// ON
|
||||||
|
case 0x01 :
|
||||||
|
take_action(ON, mesg_comp.buf[0]);
|
||||||
|
break;
|
||||||
|
// VALUE
|
||||||
|
case 0x02 :
|
||||||
|
break;
|
||||||
|
// TOGGLE
|
||||||
|
case 0x03:
|
||||||
|
take_action(TOGGLE, mesg_comp.buf[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rxCount = 0;
|
||||||
|
}
|
||||||
|
txTimer = 100;//milliseconds
|
||||||
|
if (txmsg.len != 0){
|
||||||
|
Serial.print("PUT=");
|
||||||
|
Serial.print(txmsg.id,HEX);
|
||||||
|
for (uint8_t i=0; i<txmsg.len; i++){
|
||||||
|
Serial.print(":");
|
||||||
|
Serial.print(txmsg.buf[i],HEX);
|
||||||
|
}
|
||||||
|
Serial.print("\n");
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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];
|
||||||
|
@ -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,4 +1,3 @@
|
|||||||
#include "CANNode.h"
|
|
||||||
// Configuration
|
// Configuration
|
||||||
#define NODE_ID 0x03
|
#define NODE_ID 0x03
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user