ArtNet node to drive TM1809 LED strips
Dependencies: DMX DmxArtNet EthernetNetIf mbed
Fork of ArtNode by
main.cpp@0:e3d0bc58141e, 2011-10-06 (annotated)
- Committer:
- okini3939
- Date:
- Thu Oct 06 04:13:35 2011 +0000
- Revision:
- 0:e3d0bc58141e
- Child:
- 1:6ea5c460fdf2
Who changed what in which revision?
User | Revision | Line number | New 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 |