Art-Net node http://mbed.org/users/okini3939/notebook/art-net/

Dependencies:   EthernetNetIf mbed DmxArtNet

Committer:
okini3939
Date:
Thu Oct 06 04:13:35 2011 +0000
Revision:
0:e3d0bc58141e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:e3d0bc58141e 1 /*
okini3939 0:e3d0bc58141e 2 * "Node" Device
okini3939 0:e3d0bc58141e 3 * "Universe" 512 DMX datas
okini3939 0:e3d0bc58141e 4 * "Sub-Net" 16 Universe
okini3939 0:e3d0bc58141e 5 * "Server" Controller
okini3939 0:e3d0bc58141e 6 *
okini3939 0:e3d0bc58141e 7 * can use over 40 Sub-Net on network.
okini3939 0:e3d0bc58141e 8 */
okini3939 0:e3d0bc58141e 9
okini3939 0:e3d0bc58141e 10 #include "mbed.h"
okini3939 0:e3d0bc58141e 11 #include "EthernetNetIf.h"
okini3939 0:e3d0bc58141e 12 #include "DmxArtNet.h"
okini3939 0:e3d0bc58141e 13 #include "DMX.h"
okini3939 0:e3d0bc58141e 14
okini3939 0:e3d0bc58141e 15
okini3939 0:e3d0bc58141e 16 #define LED_NET_ACT_ON led_yk = 0
okini3939 0:e3d0bc58141e 17 #define LED_NET_ACT_OFF led_yk = 1
okini3939 0:e3d0bc58141e 18 #define LED_NET_G_ON led_gayk = 1; led_gkya = 0
okini3939 0:e3d0bc58141e 19 #define LED_NET_Y_ON led_gayk = 0; led_gkya = 1
okini3939 0:e3d0bc58141e 20 #define LED_NET_GY_OFF led_gayk = 0; led_gkya = 0
okini3939 0:e3d0bc58141e 21
okini3939 0:e3d0bc58141e 22 extern "C" void mbed_mac_address(char *s);
okini3939 0:e3d0bc58141e 23
okini3939 0:e3d0bc58141e 24 DigitalOut led_red(p22), led_yellow(p23);
okini3939 0:e3d0bc58141e 25 DigitalOut led_gayk(p24),led_gkya(p25), led_yk(p26);
okini3939 0:e3d0bc58141e 26 DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:e3d0bc58141e 27 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 0:e3d0bc58141e 28 EthernetNetIf *eth;
okini3939 0:e3d0bc58141e 29 DmxArtNet art;
okini3939 0:e3d0bc58141e 30 DMX dmx1(p13, p14);
okini3939 0:e3d0bc58141e 31 DMX dmx2(p28, p27);
okini3939 0:e3d0bc58141e 32 Serial pc(USBTX, USBRX);
okini3939 0:e3d0bc58141e 33
okini3939 0:e3d0bc58141e 34 void no_memory () {
okini3939 0:e3d0bc58141e 35 printf("panic: can't allocate to memory!\r\n");
okini3939 0:e3d0bc58141e 36 exit(-1);
okini3939 0:e3d0bc58141e 37 }
okini3939 0:e3d0bc58141e 38
okini3939 0:e3d0bc58141e 39 void shutdown () {
okini3939 0:e3d0bc58141e 40 art.ArtPollReply.NumPorts = 0;
okini3939 0:e3d0bc58141e 41 strcpy(art.ArtPollReply.NodeReport, "Shutdown");
okini3939 0:e3d0bc58141e 42 art.SendArtPollReply();
okini3939 0:e3d0bc58141e 43 art.Done();
okini3939 0:e3d0bc58141e 44 }
okini3939 0:e3d0bc58141e 45
okini3939 0:e3d0bc58141e 46 int main () {
okini3939 0:e3d0bc58141e 47 int i, u;
okini3939 0:e3d0bc58141e 48 char mac[6];
okini3939 0:e3d0bc58141e 49 IpAddr ip;
okini3939 0:e3d0bc58141e 50 EthernetErr ethErr;
okini3939 0:e3d0bc58141e 51
okini3939 0:e3d0bc58141e 52 set_new_handler(no_memory); // new handler function
okini3939 0:e3d0bc58141e 53
okini3939 0:e3d0bc58141e 54 pc.baud(112500);
okini3939 0:e3d0bc58141e 55
okini3939 0:e3d0bc58141e 56 eth_link.mode(PullUp);
okini3939 0:e3d0bc58141e 57 eth_speed.mode(PullUp);
okini3939 0:e3d0bc58141e 58
okini3939 0:e3d0bc58141e 59 if (! eth_link) {
okini3939 0:e3d0bc58141e 60 LED_NET_G_ON;
okini3939 0:e3d0bc58141e 61 }
okini3939 0:e3d0bc58141e 62 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 63
okini3939 0:e3d0bc58141e 64 mbed_mac_address(mac);
okini3939 0:e3d0bc58141e 65 ip = IpAddr(2, mac[3], mac[4], mac[5]);
okini3939 0:e3d0bc58141e 66 eth = new EthernetNetIf(ip, IpAddr(255,0,0,0), IpAddr(0,0,0,0), IpAddr(0,0,0,0));
okini3939 0:e3d0bc58141e 67 ethErr = eth->setup();
okini3939 0:e3d0bc58141e 68 if (ethErr) {
okini3939 0:e3d0bc58141e 69 LED_NET_Y_ON;
okini3939 0:e3d0bc58141e 70 led_red = 1;
okini3939 0:e3d0bc58141e 71 return -1;
okini3939 0:e3d0bc58141e 72 }
okini3939 0:e3d0bc58141e 73 pc.printf("Bind to interface: %d.%d.%d.%d\r\n", (unsigned char)ip[0], (unsigned char)ip[1], (unsigned char)ip[2], (unsigned char)ip[3]);
okini3939 0:e3d0bc58141e 74
okini3939 0:e3d0bc58141e 75 art.BindIpAddress = ip;
okini3939 0:e3d0bc58141e 76 art.BCastAddress = IpAddr(2,255,255,255);
okini3939 0:e3d0bc58141e 77
okini3939 0:e3d0bc58141e 78 art.InitArtPollReplyDefaults();
okini3939 0:e3d0bc58141e 79 // Device
okini3939 0:e3d0bc58141e 80 art.ArtPollReply.PortType[0] = 128; // output
okini3939 0:e3d0bc58141e 81 art.ArtPollReply.PortType[1] = 128; // output
okini3939 0:e3d0bc58141e 82 art.ArtPollReply.PortType[2] = 64; // input
okini3939 0:e3d0bc58141e 83 art.ArtPollReply.GoodInput[2] = 4;
okini3939 0:e3d0bc58141e 84 art.ArtPollReply.PortType[3] = 64; // input
okini3939 0:e3d0bc58141e 85 art.ArtPollReply.GoodInput[3] = 4;
okini3939 0:e3d0bc58141e 86
okini3939 0:e3d0bc58141e 87 art.Init();
okini3939 0:e3d0bc58141e 88 art.SendArtPollReply(); // announce to art-net nodes
okini3939 0:e3d0bc58141e 89
okini3939 0:e3d0bc58141e 90 while (1) {
okini3939 0:e3d0bc58141e 91 Net::poll();
okini3939 0:e3d0bc58141e 92 if (! eth_link) {
okini3939 0:e3d0bc58141e 93 LED_NET_G_ON;
okini3939 0:e3d0bc58141e 94 } else {
okini3939 0:e3d0bc58141e 95 LED_NET_GY_OFF;
okini3939 0:e3d0bc58141e 96 }
okini3939 0:e3d0bc58141e 97
okini3939 0:e3d0bc58141e 98 if (art.Work()) {
okini3939 0:e3d0bc58141e 99 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 100 led_yellow = 1;
okini3939 0:e3d0bc58141e 101 u = art.LastRecievedUniverse;
okini3939 0:e3d0bc58141e 102 if (u == 0) {
okini3939 0:e3d0bc58141e 103 led1 = 1;
okini3939 0:e3d0bc58141e 104 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 105 dmx1.put(i, art.DmxIn[u][i]);
okini3939 0:e3d0bc58141e 106 }
okini3939 0:e3d0bc58141e 107 } else
okini3939 0:e3d0bc58141e 108 if (u == 1) {
okini3939 0:e3d0bc58141e 109 led2 = 1;
okini3939 0:e3d0bc58141e 110 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 111 dmx2.put(i, art.DmxIn[u][i]);
okini3939 0:e3d0bc58141e 112 }
okini3939 0:e3d0bc58141e 113 }
okini3939 0:e3d0bc58141e 114 pc.printf("recv, node %d, data %d\r\n", u, art.DmxIn[u][0]);
okini3939 0:e3d0bc58141e 115 led1 = 0;
okini3939 0:e3d0bc58141e 116 led2 = 0;
okini3939 0:e3d0bc58141e 117 led_yellow = 0;
okini3939 0:e3d0bc58141e 118 }
okini3939 0:e3d0bc58141e 119
okini3939 0:e3d0bc58141e 120 if (dmx1.is_recived) {
okini3939 0:e3d0bc58141e 121 led3 = 1;
okini3939 0:e3d0bc58141e 122 led_yellow = 1;
okini3939 0:e3d0bc58141e 123 dmx1.is_recived = 0;
okini3939 0:e3d0bc58141e 124 u = 0;
okini3939 0:e3d0bc58141e 125 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 126 art.DmxIn[u][i] = dmx1.get(i);
okini3939 0:e3d0bc58141e 127 }
okini3939 0:e3d0bc58141e 128 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 129 art.ArtPollReply.GoodInput[u] = 128;
okini3939 0:e3d0bc58141e 130 art.Send_ArtDmx(u, 0, (char*)art.DmxIn[u], 512);
okini3939 0:e3d0bc58141e 131 pc.printf("send, node %d, data %d\r\n", u, art.DmxIn[u][0]);
okini3939 0:e3d0bc58141e 132 led3 = 0;
okini3939 0:e3d0bc58141e 133 led_yellow = 0;
okini3939 0:e3d0bc58141e 134 }
okini3939 0:e3d0bc58141e 135
okini3939 0:e3d0bc58141e 136 if (dmx2.is_recived) {
okini3939 0:e3d0bc58141e 137 led4 = 1;
okini3939 0:e3d0bc58141e 138 led_yellow = 1;
okini3939 0:e3d0bc58141e 139 dmx2.is_recived = 0;
okini3939 0:e3d0bc58141e 140 u = 1;
okini3939 0:e3d0bc58141e 141 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 142 art.DmxIn[u][i] = dmx2.get(i);
okini3939 0:e3d0bc58141e 143 }
okini3939 0:e3d0bc58141e 144 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 145 art.ArtPollReply.GoodInput[u] = 128;
okini3939 0:e3d0bc58141e 146 art.Send_ArtDmx(u, 0, (char*)art.DmxIn[u], 512);
okini3939 0:e3d0bc58141e 147 pc.printf("send, node %d, data %d\r\n", u, art.DmxIn[u][0]);
okini3939 0:e3d0bc58141e 148 led4 = 0;
okini3939 0:e3d0bc58141e 149 led_yellow = 0;
okini3939 0:e3d0bc58141e 150 }
okini3939 0:e3d0bc58141e 151
okini3939 0:e3d0bc58141e 152 LED_NET_ACT_OFF;
okini3939 0:e3d0bc58141e 153 }
okini3939 0:e3d0bc58141e 154 }
okini3939 0:e3d0bc58141e 155