Sync work
This commit is contained in:
parent
43d1811d2e
commit
d4e346c5a0
7 changed files with 241 additions and 28 deletions
|
|
@ -61,6 +61,20 @@ _Bool send(MyMessage *message, uint8_t data_type)
|
||||||
return transportSend(message);
|
return transportSend(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_Bool sendBattery(uint8_t percent)
|
||||||
|
{
|
||||||
|
_msgTmp.last = MY_NODE_ID;
|
||||||
|
_msgTmp.sender = MY_NODE_ID;
|
||||||
|
_msgTmp.destination = GATEWAY_ADDRESS;
|
||||||
|
_msgTmp.command_echo_payload = ((uint8_t) P_BYTE << 5) + (uint8_t) C_INTERNAL;
|
||||||
|
_msgTmp.type = I_BATTERY_LEVEL;
|
||||||
|
_msgTmp.sensor = NODE_SENSOR_ID;
|
||||||
|
_msgTmp.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION;
|
||||||
|
_msgTmp.bValue = percent;
|
||||||
|
|
||||||
|
return transportSend(&_msgTmp);
|
||||||
|
}
|
||||||
|
|
||||||
_Bool sendHeartbeat(void)
|
_Bool sendHeartbeat(void)
|
||||||
{
|
{
|
||||||
_msgTmp.last = MY_NODE_ID;
|
_msgTmp.last = MY_NODE_ID;
|
||||||
|
|
@ -95,7 +109,7 @@ void registerNode(void)
|
||||||
_msgTmp.destination = GATEWAY_ADDRESS;
|
_msgTmp.destination = GATEWAY_ADDRESS;
|
||||||
_msgTmp.command_echo_payload = (P_BYTE << 5) + C_INTERNAL;
|
_msgTmp.command_echo_payload = (P_BYTE << 5) + C_INTERNAL;
|
||||||
_msgTmp.type = I_REGISTRATION_REQUEST;
|
_msgTmp.type = I_REGISTRATION_REQUEST;
|
||||||
_msgTmp.sensor = 0;
|
_msgTmp.sensor = NODE_SENSOR_ID;
|
||||||
_msgTmp.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION;
|
_msgTmp.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION;
|
||||||
_msgTmp.bValue = MY_CORE_VERSION;
|
_msgTmp.bValue = MY_CORE_VERSION;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -307,6 +307,7 @@ _Bool present(const uint8_t sensorId, const mysensors_sensor_t sensorType, char
|
||||||
_Bool sendSketchInfo(const char *name, const char *version);
|
_Bool sendSketchInfo(const char *name, const char *version);
|
||||||
_Bool send(MyMessage *msg,uint8_t data_type);
|
_Bool send(MyMessage *msg,uint8_t data_type);
|
||||||
_Bool sendHeartbeat(void);
|
_Bool sendHeartbeat(void);
|
||||||
|
_Bool sendBattery(uint8_t percent);
|
||||||
void receive(const MyMessage*);
|
void receive(const MyMessage*);
|
||||||
void transportProcessMessage(void);
|
void transportProcessMessage(void);
|
||||||
_Bool transportSend(MyMessage *message);
|
_Bool transportSend(MyMessage *message);
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ STCP P1.2
|
||||||
OE P1.3
|
OE P1.3
|
||||||
DS P1.4
|
DS P1.4
|
||||||
OCDDA P1.6
|
OCDDA P1.6
|
||||||
|
RESET P2.0
|
||||||
|
|
||||||
LC Relays:
|
LC Relays:
|
||||||
|
|
||||||
|
|
@ -26,6 +27,7 @@ S2 P1.0
|
||||||
RELAY1 P1.2
|
RELAY1 P1.2
|
||||||
RELAY2 P1.5
|
RELAY2 P1.5
|
||||||
OCDDA P1.6
|
OCDDA P1.6
|
||||||
|
RESET P2.0
|
||||||
|
|
||||||
2 Relays RS485
|
2 Relays RS485
|
||||||
|
|
||||||
|
|
@ -38,3 +40,21 @@ RELAY1 P1.3
|
||||||
RS485_DIR P1.4
|
RS485_DIR P1.4
|
||||||
IN2 P1.5
|
IN2 P1.5
|
||||||
OCDDA P1.6
|
OCDDA P1.6
|
||||||
|
RESET P2.0
|
||||||
|
|
||||||
|
4 Relays RS485
|
||||||
|
|
||||||
|
RELAY1 P0.0
|
||||||
|
OCDCK P0.2
|
||||||
|
IN3 P0.3
|
||||||
|
IN4 P0.4
|
||||||
|
TXD P0.6
|
||||||
|
RXD P0.7
|
||||||
|
RELAY3 P1.1
|
||||||
|
RELAY2 P1.2
|
||||||
|
RELAY4 P1.0
|
||||||
|
RS485_DIR P1.5
|
||||||
|
OCDDA P1.6
|
||||||
|
IN2 P1.7
|
||||||
|
RESET P2.0
|
||||||
|
IN1 P3.0
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,5 @@ sdcc-sdcc -mmcs51 --model-large -c MySensors.c -D FOSC_160000 -D MY_NODE_ID=201
|
||||||
sdcc-sdcc -mmcs51 --model-large -o chan8.ihx chan8.c MySensors.rel -D FOSC_160000 -I../include
|
sdcc-sdcc -mmcs51 --model-large -o chan8.ihx chan8.c MySensors.rel -D FOSC_160000 -I../include
|
||||||
sdcc-sdcc -mmcs51 --model-large -c MySensors.c -D FOSC_160000 -D MY_NODE_ID=202 -I../include
|
sdcc-sdcc -mmcs51 --model-large -c MySensors.c -D FOSC_160000 -D MY_NODE_ID=202 -I../include
|
||||||
sdcc-sdcc -mmcs51 --model-large -o rs485relay.ihx rs485relay.c MySensors.rel -D FOSC_160000 -I../include
|
sdcc-sdcc -mmcs51 --model-large -o rs485relay.ihx rs485relay.c MySensors.rel -D FOSC_160000 -I../include
|
||||||
|
sdcc-sdcc -mmcs51 --model-large -c MySensors.c -D FOSC_160000 -D MY_NODE_ID=203 -I../include
|
||||||
|
sdcc-sdcc -mmcs51 --model-large -o rs485relay4.ihx rs485relay4.c MySensors.rel -D FOSC_160000 -I../include
|
||||||
|
|
|
||||||
|
|
@ -69,37 +69,37 @@ void receive(const MyMessage* mymsg)
|
||||||
// We only expect one type of message from controller. But we better check anyway.
|
// We only expect one type of message from controller. But we better check anyway.
|
||||||
if (mymsg->type == V_STATUS) {
|
if (mymsg->type == V_STATUS) {
|
||||||
sensor = mymsg->sensor;
|
sensor = mymsg->sensor;
|
||||||
if (sensor == 1)
|
if (sensor == 0)
|
||||||
relay = (relay & 0xFE) + ((mymsg->data[0]=='1')?1:0);
|
relay = (relay & 0xFE) + ((mymsg->data[0]=='1')?1:0);
|
||||||
if (sensor == 2)
|
if (sensor == 1)
|
||||||
relay = (relay & 0xFD) + ((mymsg->data[0]=='1')?2:0);
|
relay = (relay & 0xFD) + ((mymsg->data[0]=='1')?2:0);
|
||||||
if (sensor == 3)
|
if (sensor == 2)
|
||||||
relay = (relay & 0xFB) + ((mymsg->data[0]=='1')?4:0);
|
relay = (relay & 0xFB) + ((mymsg->data[0]=='1')?4:0);
|
||||||
if (sensor == 4)
|
if (sensor == 3)
|
||||||
relay = (relay & 0xF7) + ((mymsg->data[0]=='1')?8:0);
|
relay = (relay & 0xF7) + ((mymsg->data[0]=='1')?8:0);
|
||||||
if (sensor == 5)
|
if (sensor == 4)
|
||||||
relay = (relay & 0xEF) + ((mymsg->data[0]=='1')?0x10:0);
|
relay = (relay & 0xEF) + ((mymsg->data[0]=='1')?0x10:0);
|
||||||
if (sensor == 6)
|
if (sensor == 5)
|
||||||
relay = (relay & 0xDF) + ((mymsg->data[0]=='1')?0x20:0);
|
relay = (relay & 0xDF) + ((mymsg->data[0]=='1')?0x20:0);
|
||||||
if (sensor == 7)
|
if (sensor == 6)
|
||||||
relay = (relay & 0xBF) + ((mymsg->data[0]=='1')?0x40:0);
|
relay = (relay & 0xBF) + ((mymsg->data[0]=='1')?0x40:0);
|
||||||
if (sensor == 8)
|
if (sensor == 7)
|
||||||
relay = (relay & 0x7F) + ((mymsg->data[0]=='1')?0x80:0);
|
relay = (relay & 0x7F) + ((mymsg->data[0]=='1')?0x80:0);
|
||||||
load();
|
load();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void present_node(void) {
|
void present_node(void) {
|
||||||
present(NODE_SENSOR_ID, S_ARDUINO_NODE,"Nuvoton Relay Board");
|
present(NODE_SENSOR_ID, S_ARDUINO_NODE,"2.3.2");
|
||||||
sendSketchInfo("Relay_Nuvoton", "1.1");
|
sendSketchInfo("Relay_Nuvoton", "1.2");
|
||||||
present(1, S_BINARY, "Relay 1");
|
present(0, S_BINARY, "Relay 1");
|
||||||
present(2, S_BINARY, "Relay 2");
|
present(1, S_BINARY, "Relay 2");
|
||||||
present(3, S_BINARY, "Relay 3");
|
present(2, S_BINARY, "Relay 3");
|
||||||
present(4, S_BINARY, "Relay 4");
|
present(3, S_BINARY, "Relay 4");
|
||||||
present(5, S_BINARY, "Relay 5");
|
present(4, S_BINARY, "Relay 5");
|
||||||
present(6, S_BINARY, "Relay 6");
|
present(5, S_BINARY, "Relay 6");
|
||||||
present(7, S_BINARY, "Relay 7");
|
present(6, S_BINARY, "Relay 7");
|
||||||
present(8, S_BINARY, "Relay 8");
|
present(7, S_BINARY, "Relay 8");
|
||||||
registerNode();
|
registerNode();
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,26 @@ void rs485_out(void) {
|
||||||
RS485_DIR = 1;
|
RS485_DIR = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void send_state(void) {
|
||||||
|
MyMessage state;
|
||||||
|
|
||||||
|
state.data[0] = 0;
|
||||||
|
state.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION;
|
||||||
|
state.sensor = 0;
|
||||||
|
state.type = V_TRIPPED;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.sensor = 1;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.data[0] = RELAY1;
|
||||||
|
state.sensor = 2;
|
||||||
|
state.type = V_STATUS;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.data[0] = RELAY2;
|
||||||
|
state.sensor = 3;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
sendBattery(100);
|
||||||
|
}
|
||||||
|
|
||||||
void receive(const MyMessage* mymsg)
|
void receive(const MyMessage* mymsg)
|
||||||
{
|
{
|
||||||
uint8_t sensor;
|
uint8_t sensor;
|
||||||
|
|
@ -34,22 +54,23 @@ void receive(const MyMessage* mymsg)
|
||||||
// We only expect one type of message from controller. But we better check anyway.
|
// We only expect one type of message from controller. But we better check anyway.
|
||||||
if (mymsg->type == V_STATUS) {
|
if (mymsg->type == V_STATUS) {
|
||||||
sensor = mymsg->sensor;
|
sensor = mymsg->sensor;
|
||||||
if (sensor == 3)
|
if (sensor == 2)
|
||||||
RELAY1 = (mymsg->data[0]=='1')?1:0;
|
RELAY1 = (mymsg->data[0]=='1')?1:0;
|
||||||
if (sensor == 4)
|
if (sensor == 3)
|
||||||
RELAY2 = (mymsg->data[0]=='1')?1:0;
|
RELAY2 = (mymsg->data[0]=='1')?1:0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void present_node(void) {
|
void present_node(void) {
|
||||||
present(NODE_SENSOR_ID, S_ARDUINO_NODE,"Nuvoton Relay Board");
|
present(NODE_SENSOR_ID, S_ARDUINO_NODE,"2.3.2");
|
||||||
sendSketchInfo("Relay_Nuvoton", "1.1");
|
sendSketchInfo("Relay_Nuvoton", "1.2");
|
||||||
present(1, S_DOOR, "IN1");
|
present(0, S_DOOR, "IN1");
|
||||||
present(2, S_DOOR, "IB2");
|
present(1, S_DOOR, "IN2");
|
||||||
present(3, S_BINARY, "Relay 1");
|
present(2, S_BINARY, "Relay 1");
|
||||||
present(4, S_BINARY, "Relay 2");
|
present(3, S_BINARY, "Relay 2");
|
||||||
registerNode();
|
registerNode();
|
||||||
delay(20);
|
delay(20);
|
||||||
|
send_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
void uart_loop() {
|
void uart_loop() {
|
||||||
|
|
@ -83,7 +104,7 @@ int main()
|
||||||
uart_init(9600);
|
uart_init(9600);
|
||||||
|
|
||||||
RS485_DIR = 0;
|
RS485_DIR = 0;
|
||||||
P13_PushPull_Mode;
|
P14_PushPull_Mode;
|
||||||
|
|
||||||
/* Relays */
|
/* Relays */
|
||||||
RELAY1 = 0;
|
RELAY1 = 0;
|
||||||
|
|
|
||||||
155
boards/rs485relay4.c
Normal file
155
boards/rs485relay4.c
Normal file
|
|
@ -0,0 +1,155 @@
|
||||||
|
#include <nuvoton/functions.h>
|
||||||
|
#include <nuvoton/N76E003.h>
|
||||||
|
#include <nuvoton/Common.h>
|
||||||
|
#include <nuvoton/SFR_Macro.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "MySensors.h"
|
||||||
|
|
||||||
|
#define RS485_DIR P15
|
||||||
|
|
||||||
|
#define IN1 P30
|
||||||
|
#define IN2 P17
|
||||||
|
#define IN3 P03
|
||||||
|
#define IN4 P04
|
||||||
|
|
||||||
|
#define RELAY1 P00
|
||||||
|
#define RELAY2 P10
|
||||||
|
#define RELAY3 P12
|
||||||
|
#define RELAY4 P11
|
||||||
|
|
||||||
|
#define MAXCMD 64
|
||||||
|
|
||||||
|
unsigned char relay;
|
||||||
|
|
||||||
|
unsigned char crc;
|
||||||
|
|
||||||
|
void rs485_in(void) {
|
||||||
|
RS485_DIR = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rs485_out(void) {
|
||||||
|
RS485_DIR = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_state(void) {
|
||||||
|
MyMessage state;
|
||||||
|
|
||||||
|
state.data[0] = 0;
|
||||||
|
state.version_length = (1 << 3) + V2_MYS_HEADER_PROTOCOL_VERSION;
|
||||||
|
state.sensor = 0;
|
||||||
|
state.type = V_TRIPPED;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.sensor = 1;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.sensor = 2;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.sensor = 3;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.data[0] = RELAY1;
|
||||||
|
state.sensor = 4;
|
||||||
|
state.type = V_STATUS;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.data[0] = RELAY2;
|
||||||
|
state.sensor = 5;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.data[0] = RELAY3;
|
||||||
|
state.sensor = 6;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
state.data[0] = RELAY4;
|
||||||
|
state.sensor = 7;
|
||||||
|
send(&state, P_BYTE);
|
||||||
|
sendBattery(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
void receive(const MyMessage* mymsg)
|
||||||
|
{
|
||||||
|
uint8_t sensor;
|
||||||
|
|
||||||
|
// We only expect one type of message from controller. But we better check anyway.
|
||||||
|
if (mymsg->type == V_STATUS) {
|
||||||
|
sensor = mymsg->sensor;
|
||||||
|
if (sensor == 4)
|
||||||
|
RELAY1 = (mymsg->data[0]=='1')?1:0;
|
||||||
|
if (sensor == 5)
|
||||||
|
RELAY2 = (mymsg->data[0]=='1')?1:0;
|
||||||
|
if (sensor == 6)
|
||||||
|
RELAY3 = (mymsg->data[0]=='1')?1:0;
|
||||||
|
if (sensor == 7)
|
||||||
|
RELAY4 = (mymsg->data[0]=='1')?1:0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void present_node(void) {
|
||||||
|
present(NODE_SENSOR_ID, S_ARDUINO_NODE,"2.3.2");
|
||||||
|
sendSketchInfo("Relay_Nuvoton", "1.2");
|
||||||
|
present(0, S_DOOR, "IN1");
|
||||||
|
present(1, S_DOOR, "IN2");
|
||||||
|
present(2, S_DOOR, "IN3");
|
||||||
|
present(3, S_DOOR, "IN4");
|
||||||
|
present(4, S_BINARY, "Relay 1");
|
||||||
|
present(5, S_BINARY, "Relay 2");
|
||||||
|
present(6, S_BINARY, "Relay 3");
|
||||||
|
present(7, S_BINARY, "Relay 4");
|
||||||
|
registerNode();
|
||||||
|
delay(20);
|
||||||
|
send_state();
|
||||||
|
}
|
||||||
|
|
||||||
|
void uart_loop() {
|
||||||
|
transportProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
void uart_init(UINT32 u32Baudrate) //T1M = 1, SMOD = 1
|
||||||
|
{
|
||||||
|
P06_PushPull_Mode;
|
||||||
|
P07_Input_Mode;
|
||||||
|
|
||||||
|
SCON = 0x50; //UART0 Mode1,REN=1,TI=1
|
||||||
|
TMOD |= 0x20; //Timer1 Mode1
|
||||||
|
|
||||||
|
set_SMOD; //UART0 Double Rate Enable
|
||||||
|
set_T1M;
|
||||||
|
clr_BRCK; //Serial port 0 baud rate clock source = Timer1
|
||||||
|
|
||||||
|
#ifdef FOSC_160000
|
||||||
|
TH1 = 256 - (1000000 / u32Baudrate + 1); /*16 MHz */
|
||||||
|
#endif
|
||||||
|
#ifdef FOSC_166000
|
||||||
|
TH1 = 256 - (1037500 / u32Baudrate); /*16.6 MHz */
|
||||||
|
#endif
|
||||||
|
set_TR1;
|
||||||
|
set_TI; //For printf function must setting TI = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
uart_init(9600);
|
||||||
|
|
||||||
|
RS485_DIR = 0;
|
||||||
|
P15_PushPull_Mode;
|
||||||
|
|
||||||
|
/* Relays */
|
||||||
|
RELAY1 = 0;
|
||||||
|
RELAY2 = 0;
|
||||||
|
RELAY3 = 0;
|
||||||
|
RELAY4 = 0;
|
||||||
|
|
||||||
|
P00_PushPull_Mode;
|
||||||
|
P12_PushPull_Mode;
|
||||||
|
P11_PushPull_Mode;
|
||||||
|
P10_PushPull_Mode;
|
||||||
|
|
||||||
|
/* Inputs */
|
||||||
|
P30_Input_Mode;
|
||||||
|
P17_Input_Mode;
|
||||||
|
P03_Input_Mode;
|
||||||
|
P04_Input_Mode;
|
||||||
|
|
||||||
|
transportInitialise();
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
uart_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue