From f63b37a9deab3ebbb8c6b0210da79151dc435a80 Mon Sep 17 00:00:00 2001 From: wiebel Date: Tue, 30 Oct 2018 17:49:04 +0100 Subject: [PATCH] More talking to CAN (state change, new TWids) --- src/CANNode.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++---- src/CANNode.h | 4 ++-- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/CANNode.cpp b/src/CANNode.cpp index e4d387c..1a79b1e 100644 --- a/src/CANNode.cpp +++ b/src/CANNode.cpp @@ -3,9 +3,10 @@ // ------------------------------------------------------------- // CANNode for Teensy 3.1/3.2 // GPLv2 -// by wiebel (c) 2015-2018 +// by wiebel (c) 2015-2018 // github_push_test_01 +#include #include #include #include @@ -121,10 +122,31 @@ uint8_t toggle_Pin(uint8_t pin){ return digitalRead(pin); } -uint32_t forgeid(event_t event){ +uint32_t event2id(event_t event){ return (event.prio<<26)+(event.dst<<16)+(NODE_ID<<8)+event.cmd; } +uint32_t forgeid(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t type=0){ + // CMD: + // Type: 0: SINGLE, 1: FIRST, 2: CONT, 3: LAST + return (prio<<26)+(type<<24)+(dst<<16)+(NODE_ID<<8)+cmd; +} +int CAN_send(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t data[], uint8_t type=0){ + txmsg.id = forgeid(prio, dst, cmd, type); + txmsg.len = sizeof(data); + for (uint8_t i = 0; i < txmsg.len; i++) { txmsg.buf[i] = data[i]; } + CANbus.write(txmsg); +} + +int CAN_send(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t data, uint8_t type=0){ + txmsg.id = forgeid(prio, dst, cmd, type); + //txmsg.len = sizeof(data); + txmsg.len = 1; + txmsg.buf[0] = data; + CANbus.write(txmsg); +} + + telegram_comp_t parse_CAN(CAN_message_t mesg){ telegram_comp_t tmp; tmp.prio=mesg.id>>26; @@ -142,7 +164,7 @@ void send_event (uint8_t trig_event){ for (uint8_t e_idx = 0; tx_events[e_idx].tag != 0; e_idx++) if ( tx_events[e_idx].tag == trig_event ) { - txmsg.id = forgeid(tx_events[e_idx]); + txmsg.id = event2id(tx_events[e_idx]); txmsg.len = 1; // txmsg.timeout = 100; txmsg.buf[0]= tx_events[e_idx].data; @@ -154,9 +176,11 @@ void send_event (uint8_t trig_event){ txmsg.len = 0; } } -void take_action (action_type type, uint8_t tag ){ + +void take_action (cmd_type type, uint8_t tag ){ for (uint8_t i = 0; action_map[i].tag != 0 ; i++) { if ( action_map[i].tag == tag ) { + bool old_state = digitalRead(outputs[action_map[i].outputs_idx].address); switch ( type ) { case OFF: digitalWrite(outputs[action_map[i].outputs_idx].address,LOW ^ outputs[action_map[i].outputs_idx].invert); @@ -179,6 +203,23 @@ for (uint8_t i = 0; action_map[i].tag != 0 ; i++) { Serial.println(F("TBD")); break; } + bool new_state = digitalRead(outputs[action_map[i].outputs_idx].address); + if ( old_state == new_state) { + switch ( new_state ) { + case 0: + CAN_send(NOTIFY, 0xFF, OFF, action_map[i].outputs_idx); + case 1: + CAN_send(NOTIFY, 0xFF, ON, action_map[i].outputs_idx); + } + } + else { + switch ( new_state ) { + case 0: + CAN_send(NOTIFY, 0xFF, T_OFF, action_map[i].outputs_idx); + case 1: + CAN_send(NOTIFY, 0xFF, T_ON, action_map[i].outputs_idx); + } + } } } } @@ -252,8 +293,11 @@ void loop(void) } } if (new_owd) { + // send new ID to all + CAN_send(NOTIFY, 0xFF, NEW_TWID, addr); Serial.print("Found a device: "); print_OW_Device(addr); + Serial.println(); } diff --git a/src/CANNode.h b/src/CANNode.h index 8f78b25..79df55e 100644 --- a/src/CANNode.h +++ b/src/CANNode.h @@ -4,8 +4,8 @@ enum out_type { GPIO, PWM, OW, I2C, SPI, WS2811, DMX, NOP }; enum event_type { LOCAL, SEND}; -enum action_type { OFF, ON, VALUE, TOGGLE }; -enum telegram_type { ALERT, EVENT, NOTIFY, INFO }; +enum cmd_type { OFF, ON, VALUE, TOGGLE, T_OFF, T_ON, BIN_DUMP, NEW_TWID }; +enum telegram_prio { ALERT, EVENT, NOTIFY, INFO }; typedef struct CAN_telegram_t { uint32_t id;