And here it is:
<?xml version="1.0"?> <configuration> <devices> <device id="0x01" code="DVC_TMP37">Temperature Sensor TMP37</device> <device id="0x02" code="DVC_LIGHT">Light Sensor LDR</device> <device id="0x03" code="DVC_SHT21">Temperature and Humidy Sensor SHT21</device> <device id="0x04" code="DVC_DOORCONTACT">Door Contact Sensor</device> <device id="0x05" code="DVC_WINDOWCONTACT">Window Contact Sensor</device> <device id="0x06" code="DVC_MOTION">Motion Sensor</device> <device id="0x07" code="DVC_2LINEDISPLAY">2 Line Character Display</device> <device id="0x08" code="DVC_POWER30">30A Current Sensor</device> <device id="0x09" code="DVC_POWER100">100A Current Sensor</device> <device id="0x10" code="DVC_SMARTOUTLET">Smart Outlet</device> <device id="0x11" code="DVC_RGBLIGHT">RGN LED Light</device> <device id="0x12" code="DVC_sound">Sound Sensor</device> <device id="0x13" code="DVC_SWITCH">Simple Switch</device> <device id="0x14" code="DVC_STATUSLED">Simple Status LEDS</device> <device id="0x15" code="DVC_BUZZER">Alert Buzzer</device> </devices> <commands> <!-- System Commands Port 0 --> <command id="0x00" code="CMD_ERROR" payload="message" return="CMD_ACK"></command> <command id="0x01" code="CMD_VERSION" payload="" return="CMD_FLOAT"> Get current version of firmware on the node </command> <command id="0x03" code="CMD_BATTERYLEVEL" payload="" return=""> Get current battery level </command> <command id="0x3E" code="CMD_PING" payload="varies" return="CMD_PONG"> Send Test Pack, node should reply back pong </command> <command id="0xE3" code="CMD_PONG" payload="varies" return="CMD_ACK"> Response to a Ping Command </command> <command id="0x11" code="CMD_ACK" payload="packetid" return="CMD_BYTE"> Acknowledge Packet, letting the sender of a packet know that data arriced safely </command> <command id="0x21" code="CMD_GETNODEID" payload="" return="CMD_BYTE"> Get Node's current ID (node id 0 is for broadcast) </command> <command id="0x22" code="CMD_SETNODEID" payload="passcode" return="CMD_ACK"> Changes NODE ID, used for initial setup </command> <command id="0x23" code="CMD_GETPLUG" payload="byte port" return="CMD_BYTE"> Get the device code for what is attached on the node </command> <command id="0x24" code="CMD_SETPLUG" payload="passcode" return="CMD_ACK"> Changes Device ID, used for initial setup </command> <!-- Plug commands Ports 1-15 --> <command id="0xC1" code="CMD_AUTOSENDSTART" payload="node to, int" return="CMD_ACK"> Set up the node to automatically send sensor data to a particular node </command> <command id="0xC2" code="CMD_AUTOSENDSTOP" payload="node to" return="CMD_ACK"> Stop auto sending sensor data </command> <command id="0xD0" code="CMD_GETVALUE" payload="" return="Value"> Get a value from a plug </command> <command id="0xD1" code="CMD_SETVALUE" payload="" return="Value"> Send a value to a plug </command> <command id="0xE0" code="CMD_ON" payload="" return="CMD_ACK"> Simple Turn on </command> <command id="0xE1" code="CMD_OFF" payload="" return="CMD_ACK"> Simple Turn Off </command> <command id="0xE2" code="CMD_LEVEL" payload="byte" return="CMD_ACK"> Set a light to a level 0-255 </command> <!-- Value commands --> <command id="0xF0" code="CMD_BYTE" payload="byte" return="CMD_ACK"></command> <command id="0xF1" code="CMD_STRING" payload="string" return="CMD_ACK"></command> <command id="0xF2" code="CMD_INT" payload="int" return="CMD_ACK"></command> <command id="0xF3" code="CMD_FLOAT" payload="float" return="CMD_ACK"></command> <command id="0xF4" code="CMD_LONG" payload="long" return="CMD_ACK"></command> </commands> <!-- One day more stuff will be setup too --> <pachube> <apikey></apikey> <feeds> <feed name="Bedroom"> <datastream id="0" node="" plug="" device="" /> </feed> </feeds> </pachube> <webserver> <address></address> </webserver> </configuration>
Processing has built in tools for reading XML and this quick sketch reads the XML file a translates it in to list of #defines for the Arduino. this way as the lists of devices and commands evolve, it's very easy to translate it from one language to another.
XMLElement xml; PFont myFont; PrintWriter file; int i; String spaces(int count){ String spaces = ""; for(int a = 0;a<count;a++){ spaces += " "; } return spaces; } void setup() { size(200, 200); myFont = createFont("Consolas", 14); textFont(myFont); xml = new XMLElement(this, "config.txt"); //in txt file = createWriter("define.txt"); XMLElement commands[] = xml.getChildren("commands/command"); for(i = 0; i<commands.length;i++){ file.println("#define "+ commands[i].getAttribute("code")+spaces(20 - commands[i].getAttribute("code").length())+commands[i].getAttribute("id")); } file.println(""); //blank line XMLElement devices[] = xml.getChildren("devices/device"); for(i = 0; i<devices.length;i++){ file.println("#define "+ devices[i].getAttribute("code")+spaces(20 - devices[i].getAttribute("code").length())+devices[i].getAttribute("id")); } file.flush(); // Write the remaining data file.close(); exit(); }And here is the Arduino Code the script above generated for me
#define CMD_ERROR 0x00 #define CMD_VERSION 0x01 #define CMD_BATTERYLEVEL 0x03 #define CMD_PING 0x3E #define CMD_PONG 0xE3 #define CMD_ACK 0x11 #define CMD_SETNODEID 0x21 #define CMD_GETNODEID 0x21 #define CMD_SETNODEID 0x22 #define CMD_GETPLUG 0x23 #define CMD_SETPLUG 0x24 #define CMD_AUTOSENDSTART 0xC1 #define CMD_AUTOSENDSTOP 0xC2 #define CMD_GETVALUE 0xD0 #define CMD_SETVALUE 0xD1 #define CMD_ON 0xE0 #define CMD_OFF 0xE1 #define CMD_LEVEL 0xE2 #define CMD_BYTE 0xF0 #define CMD_STRING 0xF1 #define CMD_INT 0xF2 #define CMD_FLOAT 0xF3 #define CMD_LONG 0xF4 #define DVC_TMP37 0x01 #define DVC_LIGHT 0x02 #define DVC_SHT21 0x03 #define DVC_DOORCONTACT 0x04 #define DVC_WINDOWCONTACT 0x05 #define DVC_MOTION 0x06 #define DVC_2LINEDISPLAY 0x07 #define DVC_POWER30 0x08 #define DVC_POWER100 0x09 #define DVC_SMARTOUTLET 0x10 #define DVC_RGBLIGHT 0x11 #define DVC_sound 0x12 #define DVC_SWITCH 0x13 #define DVC_STATUSLED 0x14 #define DVC_BUZZER 0x15
No comments:
Post a Comment