ArtNet node to drive TM1809 LED strips

Dependencies:   DMX DmxArtNet EthernetNetIf mbed

Fork of ArtNode by Suga koubou

Committer:
gipmad
Date:
Sun Dec 29 20:03:22 2013 +0000
Revision:
2:6d6e8afeb3b7
Parent:
1:6ea5c460fdf2
LED strip support instead of DMX

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;
gipmad 2:6d6e8afeb3b7 30 //DMX dmx1(p13, p14);
gipmad 2:6d6e8afeb3b7 31 //DMX dmx2(p28, p27);
okini3939 0:e3d0bc58141e 32 Serial pc(USBTX, USBRX);
okini3939 0:e3d0bc58141e 33
gipmad 1:6ea5c460fdf2 34 SPI spi(p11, p12, p13); // mosi, miso, sclk
gipmad 1:6ea5c460fdf2 35
okini3939 0:e3d0bc58141e 36 void no_memory () {
okini3939 0:e3d0bc58141e 37 printf("panic: can't allocate to memory!\r\n");
okini3939 0:e3d0bc58141e 38 exit(-1);
okini3939 0:e3d0bc58141e 39 }
okini3939 0:e3d0bc58141e 40
okini3939 0:e3d0bc58141e 41 void shutdown () {
okini3939 0:e3d0bc58141e 42 art.ArtPollReply.NumPorts = 0;
okini3939 0:e3d0bc58141e 43 strcpy(art.ArtPollReply.NodeReport, "Shutdown");
okini3939 0:e3d0bc58141e 44 art.SendArtPollReply();
okini3939 0:e3d0bc58141e 45 art.Done();
okini3939 0:e3d0bc58141e 46 }
okini3939 0:e3d0bc58141e 47
gipmad 2:6d6e8afeb3b7 48 void PutLed(unsigned long GRB)
gipmad 1:6ea5c460fdf2 49 {
gipmad 1:6ea5c460fdf2 50 int SpiPack = 0;
gipmad 1:6ea5c460fdf2 51 int c = 0;
gipmad 1:6ea5c460fdf2 52 int i;
gipmad 1:6ea5c460fdf2 53 for(i = 0; i < 24; i++)
gipmad 1:6ea5c460fdf2 54 {
gipmad 1:6ea5c460fdf2 55 if(GRB & ((long)(1) << (23-i)))
gipmad 1:6ea5c460fdf2 56 SpiPack += 6;
gipmad 1:6ea5c460fdf2 57 else
gipmad 1:6ea5c460fdf2 58 SpiPack += 4;
gipmad 1:6ea5c460fdf2 59
gipmad 1:6ea5c460fdf2 60 if(c++ >= 3)
gipmad 1:6ea5c460fdf2 61 {
gipmad 1:6ea5c460fdf2 62
gipmad 1:6ea5c460fdf2 63 // First don't write to the FIFO buffer if it is full
gipmad 1:6ea5c460fdf2 64 while (!(LPC_SSP0->SR & 2)) // While TNF-Bit = 0 (FIFO full)...
gipmad 1:6ea5c460fdf2 65 ; // Wait
gipmad 1:6ea5c460fdf2 66 LPC_SSP0->DR = SpiPack; // Write to FIFO buffer
gipmad 1:6ea5c460fdf2 67
gipmad 1:6ea5c460fdf2 68
gipmad 1:6ea5c460fdf2 69 // spi.write(SpiPack);
gipmad 1:6ea5c460fdf2 70 SpiPack = 0;
gipmad 1:6ea5c460fdf2 71 c = 0;
gipmad 1:6ea5c460fdf2 72 }
gipmad 1:6ea5c460fdf2 73
gipmad 1:6ea5c460fdf2 74 SpiPack = SpiPack << 3;
gipmad 1:6ea5c460fdf2 75
gipmad 1:6ea5c460fdf2 76 }
gipmad 1:6ea5c460fdf2 77 }
gipmad 1:6ea5c460fdf2 78
gipmad 1:6ea5c460fdf2 79
okini3939 0:e3d0bc58141e 80 int main () {
okini3939 0:e3d0bc58141e 81 int i, u;
okini3939 0:e3d0bc58141e 82 char mac[6];
okini3939 0:e3d0bc58141e 83 IpAddr ip;
okini3939 0:e3d0bc58141e 84 EthernetErr ethErr;
gipmad 1:6ea5c460fdf2 85
gipmad 1:6ea5c460fdf2 86 uint32_t PixIn;
gipmad 1:6ea5c460fdf2 87
gipmad 1:6ea5c460fdf2 88 spi.format(12,0); //4 bit alla volta
gipmad 1:6ea5c460fdf2 89 //spi.frequency(1000000);
gipmad 1:6ea5c460fdf2 90 spi.frequency(3125000);
gipmad 1:6ea5c460fdf2 91
gipmad 2:6d6e8afeb3b7 92 /*
gipmad 2:6d6e8afeb3b7 93 unsigned long j = 0;
gipmad 2:6d6e8afeb3b7 94 while(1){
gipmad 2:6d6e8afeb3b7 95 PutLed(0x000055);
gipmad 2:6d6e8afeb3b7 96 PutLed(0x005500);
gipmad 2:6d6e8afeb3b7 97 PutLed(0x550000);
gipmad 2:6d6e8afeb3b7 98 PutLed(j+10);
gipmad 2:6d6e8afeb3b7 99 PutLed(j+10);
gipmad 2:6d6e8afeb3b7 100 PutLed(j+10);
gipmad 2:6d6e8afeb3b7 101 PutLed(j+10);
gipmad 2:6d6e8afeb3b7 102 j+=10;
gipmad 2:6d6e8afeb3b7 103 wait_ms(1);
gipmad 2:6d6e8afeb3b7 104
gipmad 2:6d6e8afeb3b7 105 //wait_ms(25);
gipmad 2:6d6e8afeb3b7 106 };
gipmad 2:6d6e8afeb3b7 107 */
okini3939 0:e3d0bc58141e 108
okini3939 0:e3d0bc58141e 109 set_new_handler(no_memory); // new handler function
okini3939 0:e3d0bc58141e 110
okini3939 0:e3d0bc58141e 111 pc.baud(112500);
okini3939 0:e3d0bc58141e 112
okini3939 0:e3d0bc58141e 113 eth_link.mode(PullUp);
okini3939 0:e3d0bc58141e 114 eth_speed.mode(PullUp);
okini3939 0:e3d0bc58141e 115
okini3939 0:e3d0bc58141e 116 if (! eth_link) {
okini3939 0:e3d0bc58141e 117 LED_NET_G_ON;
okini3939 0:e3d0bc58141e 118 }
okini3939 0:e3d0bc58141e 119 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 120
okini3939 0:e3d0bc58141e 121 mbed_mac_address(mac);
okini3939 0:e3d0bc58141e 122 ip = IpAddr(2, mac[3], mac[4], mac[5]);
okini3939 0:e3d0bc58141e 123 eth = new EthernetNetIf(ip, IpAddr(255,0,0,0), IpAddr(0,0,0,0), IpAddr(0,0,0,0));
okini3939 0:e3d0bc58141e 124 ethErr = eth->setup();
okini3939 0:e3d0bc58141e 125 if (ethErr) {
okini3939 0:e3d0bc58141e 126 LED_NET_Y_ON;
okini3939 0:e3d0bc58141e 127 led_red = 1;
okini3939 0:e3d0bc58141e 128 return -1;
okini3939 0:e3d0bc58141e 129 }
okini3939 0:e3d0bc58141e 130 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 131
okini3939 0:e3d0bc58141e 132 art.BindIpAddress = ip;
okini3939 0:e3d0bc58141e 133 art.BCastAddress = IpAddr(2,255,255,255);
okini3939 0:e3d0bc58141e 134
okini3939 0:e3d0bc58141e 135 art.InitArtPollReplyDefaults();
okini3939 0:e3d0bc58141e 136 // Device
okini3939 0:e3d0bc58141e 137 art.ArtPollReply.PortType[0] = 128; // output
okini3939 0:e3d0bc58141e 138 art.ArtPollReply.PortType[1] = 128; // output
okini3939 0:e3d0bc58141e 139 art.ArtPollReply.PortType[2] = 64; // input
okini3939 0:e3d0bc58141e 140 art.ArtPollReply.GoodInput[2] = 4;
okini3939 0:e3d0bc58141e 141 art.ArtPollReply.PortType[3] = 64; // input
okini3939 0:e3d0bc58141e 142 art.ArtPollReply.GoodInput[3] = 4;
okini3939 0:e3d0bc58141e 143
okini3939 0:e3d0bc58141e 144 art.Init();
okini3939 0:e3d0bc58141e 145 art.SendArtPollReply(); // announce to art-net nodes
okini3939 0:e3d0bc58141e 146
okini3939 0:e3d0bc58141e 147 while (1) {
okini3939 0:e3d0bc58141e 148 Net::poll();
okini3939 0:e3d0bc58141e 149 if (! eth_link) {
okini3939 0:e3d0bc58141e 150 LED_NET_G_ON;
okini3939 0:e3d0bc58141e 151 } else {
okini3939 0:e3d0bc58141e 152 LED_NET_GY_OFF;
okini3939 0:e3d0bc58141e 153 }
gipmad 1:6ea5c460fdf2 154
okini3939 0:e3d0bc58141e 155 if (art.Work()) {
gipmad 1:6ea5c460fdf2 156 u = art.LastRecievedUniverse;
gipmad 1:6ea5c460fdf2 157 if(u == 0){
gipmad 1:6ea5c460fdf2 158 led1 = 1;
gipmad 1:6ea5c460fdf2 159 for(i = 0; i < 510; i += 3)
gipmad 1:6ea5c460fdf2 160 {
gipmad 1:6ea5c460fdf2 161 PixIn = art.DmxIn[u][i+1];
gipmad 1:6ea5c460fdf2 162 PixIn <<= 8;
gipmad 1:6ea5c460fdf2 163 PixIn += art.DmxIn[u][i];
gipmad 1:6ea5c460fdf2 164 PixIn <<= 8;
gipmad 1:6ea5c460fdf2 165 PixIn += art.DmxIn[u][i+2];
gipmad 1:6ea5c460fdf2 166 PutLed(PixIn);
gipmad 1:6ea5c460fdf2 167 }
gipmad 1:6ea5c460fdf2 168 wait_us(25);
gipmad 2:6d6e8afeb3b7 169 wait_us(25);
gipmad 2:6d6e8afeb3b7 170 wait_us(25);
gipmad 2:6d6e8afeb3b7 171 wait_us(25);
gipmad 1:6ea5c460fdf2 172 led1 = 0;
gipmad 1:6ea5c460fdf2 173 }
gipmad 1:6ea5c460fdf2 174 pc.printf("recv, node %d, data %x %x %x\r\n", u, art.DmxIn[u][0], art.DmxIn[u][1], art.DmxIn[u][2]);
gipmad 1:6ea5c460fdf2 175 /*if (u == 0) {
gipmad 1:6ea5c460fdf2 176 led1 = 1;
gipmad 1:6ea5c460fdf2 177 for (i = 0; i < 512; i ++) {
gipmad 1:6ea5c460fdf2 178 dmx1.put(i, art.DmxIn[u][i]);
gipmad 1:6ea5c460fdf2 179 }
gipmad 1:6ea5c460fdf2 180 } else
gipmad 1:6ea5c460fdf2 181 if (u == 1) {
gipmad 1:6ea5c460fdf2 182 led2 = 1;
gipmad 1:6ea5c460fdf2 183 for (i = 0; i < 512; i ++) {
gipmad 1:6ea5c460fdf2 184 dmx2.put(i, art.DmxIn[u][i]);
gipmad 1:6ea5c460fdf2 185 }
gipmad 1:6ea5c460fdf2 186 }*/
gipmad 1:6ea5c460fdf2 187 // pc.printf("recv, node %d, data %d\r\n", u, art.DmxIn[u][0]);
gipmad 1:6ea5c460fdf2 188 }
gipmad 1:6ea5c460fdf2 189
gipmad 1:6ea5c460fdf2 190
gipmad 1:6ea5c460fdf2 191 /*if (art.Work()) {
okini3939 0:e3d0bc58141e 192 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 193 led_yellow = 1;
okini3939 0:e3d0bc58141e 194 u = art.LastRecievedUniverse;
okini3939 0:e3d0bc58141e 195 if (u == 0) {
okini3939 0:e3d0bc58141e 196 led1 = 1;
okini3939 0:e3d0bc58141e 197 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 198 dmx1.put(i, art.DmxIn[u][i]);
okini3939 0:e3d0bc58141e 199 }
okini3939 0:e3d0bc58141e 200 } else
okini3939 0:e3d0bc58141e 201 if (u == 1) {
okini3939 0:e3d0bc58141e 202 led2 = 1;
okini3939 0:e3d0bc58141e 203 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 204 dmx2.put(i, art.DmxIn[u][i]);
okini3939 0:e3d0bc58141e 205 }
okini3939 0:e3d0bc58141e 206 }
okini3939 0:e3d0bc58141e 207 pc.printf("recv, node %d, data %d\r\n", u, art.DmxIn[u][0]);
okini3939 0:e3d0bc58141e 208 led1 = 0;
okini3939 0:e3d0bc58141e 209 led2 = 0;
okini3939 0:e3d0bc58141e 210 led_yellow = 0;
gipmad 1:6ea5c460fdf2 211 }*/
okini3939 0:e3d0bc58141e 212
gipmad 1:6ea5c460fdf2 213 /*if (dmx1.is_recived) {
okini3939 0:e3d0bc58141e 214 led3 = 1;
okini3939 0:e3d0bc58141e 215 led_yellow = 1;
okini3939 0:e3d0bc58141e 216 dmx1.is_recived = 0;
okini3939 0:e3d0bc58141e 217 u = 0;
okini3939 0:e3d0bc58141e 218 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 219 art.DmxIn[u][i] = dmx1.get(i);
okini3939 0:e3d0bc58141e 220 }
okini3939 0:e3d0bc58141e 221 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 222 art.ArtPollReply.GoodInput[u] = 128;
okini3939 0:e3d0bc58141e 223 art.Send_ArtDmx(u, 0, (char*)art.DmxIn[u], 512);
okini3939 0:e3d0bc58141e 224 pc.printf("send, node %d, data %d\r\n", u, art.DmxIn[u][0]);
okini3939 0:e3d0bc58141e 225 led3 = 0;
okini3939 0:e3d0bc58141e 226 led_yellow = 0;
okini3939 0:e3d0bc58141e 227 }
okini3939 0:e3d0bc58141e 228
okini3939 0:e3d0bc58141e 229 if (dmx2.is_recived) {
okini3939 0:e3d0bc58141e 230 led4 = 1;
okini3939 0:e3d0bc58141e 231 led_yellow = 1;
okini3939 0:e3d0bc58141e 232 dmx2.is_recived = 0;
okini3939 0:e3d0bc58141e 233 u = 1;
okini3939 0:e3d0bc58141e 234 for (i = 0; i < 512; i ++) {
okini3939 0:e3d0bc58141e 235 art.DmxIn[u][i] = dmx2.get(i);
okini3939 0:e3d0bc58141e 236 }
okini3939 0:e3d0bc58141e 237 LED_NET_ACT_ON;
okini3939 0:e3d0bc58141e 238 art.ArtPollReply.GoodInput[u] = 128;
okini3939 0:e3d0bc58141e 239 art.Send_ArtDmx(u, 0, (char*)art.DmxIn[u], 512);
okini3939 0:e3d0bc58141e 240 pc.printf("send, node %d, data %d\r\n", u, art.DmxIn[u][0]);
okini3939 0:e3d0bc58141e 241 led4 = 0;
okini3939 0:e3d0bc58141e 242 led_yellow = 0;
okini3939 0:e3d0bc58141e 243 }
okini3939 0:e3d0bc58141e 244
gipmad 1:6ea5c460fdf2 245 LED_NET_ACT_OFF;*/
okini3939 0:e3d0bc58141e 246 }
okini3939 0:e3d0bc58141e 247 }
okini3939 0:e3d0bc58141e 248