DMX interface (DMX in/out, Art-Net in/out, DMX patch) http://mbed.org/users/okini3939/notebook/dmx-platform/

Dependencies:   ChaNFSSD EthernetNetIf mbed ConfigFile ChaNFS DmxArtNet

Committer:
okini3939
Date:
Thu Mar 01 01:40:07 2012 +0000
Revision:
0:41b699bbda83

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:41b699bbda83 1 /*
okini3939 0:41b699bbda83 2 * DMX Station - mbed DMX Platform
okini3939 0:41b699bbda83 3 * Copyright (c) 2012 Hiroshi Suga
okini3939 0:41b699bbda83 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:41b699bbda83 5 */
okini3939 0:41b699bbda83 6
okini3939 0:41b699bbda83 7 /*
okini3939 0:41b699bbda83 8 * "patch#.csv" (#=dest port)
okini3939 0:41b699bbda83 9 * |dest ch,src port,src ch|
okini3939 0:41b699bbda83 10 *
okini3939 0:41b699bbda83 11 * dest port: 1=dmx out 1 / 2=dmx out 2 / 3=ArtNet 1 / 4=ArtNet 2 / 5=RF(NEC950MHz)
okini3939 0:41b699bbda83 12 * src port: 1=dmx in 1 / 2=dmx in 2 / 3=ArtNet 1 / 4=ArtNet 2 / 5=UDP2DMX
okini3939 0:41b699bbda83 13 */
okini3939 0:41b699bbda83 14 #include "dbg.h"
okini3939 0:41b699bbda83 15 #include "mbed.h"
okini3939 0:41b699bbda83 16 #include "SDFileSystem.h"
okini3939 0:41b699bbda83 17 #include "DmxArtNet.h"
okini3939 0:41b699bbda83 18 #include "DMX.h"
okini3939 0:41b699bbda83 19 #include "dmx_patch.h"
okini3939 0:41b699bbda83 20
okini3939 0:41b699bbda83 21
okini3939 0:41b699bbda83 22 SDFileSystem sd(p5, p6, p7, p8, "sd");
okini3939 0:41b699bbda83 23
okini3939 0:41b699bbda83 24 struct TPatch dmx_patch[DEST_NUM][512] __attribute__((section("AHBSRAM0")));
okini3939 0:41b699bbda83 25
okini3939 0:41b699bbda83 26 extern DmxArtNet art;
okini3939 0:41b699bbda83 27 extern DMX dmx1;
okini3939 0:41b699bbda83 28 extern DMX dmx2;
okini3939 0:41b699bbda83 29
okini3939 0:41b699bbda83 30 extern volatile int patch_update;
okini3939 0:41b699bbda83 31 extern volatile int art_update[2];
okini3939 0:41b699bbda83 32 extern volatile int rf_update;
okini3939 0:41b699bbda83 33 extern char dmx_art[2][512];
okini3939 0:41b699bbda83 34 extern char dmx_udp[512];
okini3939 0:41b699bbda83 35 extern char dmx_rf[512];
okini3939 0:41b699bbda83 36
okini3939 0:41b699bbda83 37
okini3939 0:41b699bbda83 38 int load_patch () {
okini3939 0:41b699bbda83 39 int i, j, dest, src, port;
okini3939 0:41b699bbda83 40 FILE *fp;
okini3939 0:41b699bbda83 41 char file[32];
okini3939 0:41b699bbda83 42
okini3939 0:41b699bbda83 43 for (i = 0; i < DEST_NUM; i ++) {
okini3939 0:41b699bbda83 44 for (j = 0; j < 512; j ++) {
okini3939 0:41b699bbda83 45 dmx_patch[i][j].port = i < 2 ? i + 2 : i - 2;
okini3939 0:41b699bbda83 46 dmx_patch[i][j].addr = j;
okini3939 0:41b699bbda83 47 }
okini3939 0:41b699bbda83 48 }
okini3939 0:41b699bbda83 49
okini3939 0:41b699bbda83 50 if (sd.disk_initialize()) {
okini3939 0:41b699bbda83 51 DBG("no SD\r\n");
okini3939 0:41b699bbda83 52 return -1;
okini3939 0:41b699bbda83 53 }
okini3939 0:41b699bbda83 54
okini3939 0:41b699bbda83 55 for (i = 0; i < DEST_NUM; i ++) {
okini3939 0:41b699bbda83 56 sprintf(file, "/sd/patch%d.csv", i + 1);
okini3939 0:41b699bbda83 57 fp = fopen(file, "r");
okini3939 0:41b699bbda83 58 if (! fp) continue;
okini3939 0:41b699bbda83 59
okini3939 0:41b699bbda83 60 while (1) {
okini3939 0:41b699bbda83 61 // load csv
okini3939 0:41b699bbda83 62 if (feof(fp)) break;
okini3939 0:41b699bbda83 63 if (fscanf(fp, "%d,%d,%d", &dest, &port, &src) == 3) {
okini3939 0:41b699bbda83 64 if (dest < 1 && dest > 512) continue;
okini3939 0:41b699bbda83 65 if (src < 1 && src > 512) continue;
okini3939 0:41b699bbda83 66 if (port < 1 && port > 5) continue;
okini3939 0:41b699bbda83 67 dmx_patch[i][dest - 1].port = port - 1;
okini3939 0:41b699bbda83 68 dmx_patch[i][dest - 1].addr = src - 1;
okini3939 0:41b699bbda83 69 DBG("%d %d <- %d %d\r\n", i + 1, dest, port, src);
okini3939 0:41b699bbda83 70 }
okini3939 0:41b699bbda83 71 }
okini3939 0:41b699bbda83 72 fclose(fp);
okini3939 0:41b699bbda83 73 }
okini3939 0:41b699bbda83 74 return 0;
okini3939 0:41b699bbda83 75 }
okini3939 0:41b699bbda83 76
okini3939 0:41b699bbda83 77 void patch () {
okini3939 0:41b699bbda83 78 int i, j, dmx;
okini3939 0:41b699bbda83 79
okini3939 0:41b699bbda83 80 for (i = 0; i < DEST_NUM; i ++) {
okini3939 0:41b699bbda83 81 for (j = 0; j < 512; j ++) {
okini3939 0:41b699bbda83 82 // src
okini3939 0:41b699bbda83 83 switch (dmx_patch[i][j].port) {
okini3939 0:41b699bbda83 84 case 0: // dmx in 1
okini3939 0:41b699bbda83 85 dmx = dmx1.get(dmx_patch[i][j].addr);
okini3939 0:41b699bbda83 86 break;
okini3939 0:41b699bbda83 87 case 1: // dmx in 2
okini3939 0:41b699bbda83 88 dmx = dmx2.get(dmx_patch[i][j].addr);
okini3939 0:41b699bbda83 89 break;
okini3939 0:41b699bbda83 90 case 2: // ArtNet 1
okini3939 0:41b699bbda83 91 dmx = art.DmxIn[0][dmx_patch[i][j].addr];
okini3939 0:41b699bbda83 92 break;
okini3939 0:41b699bbda83 93 case 3: // ArtNet 2
okini3939 0:41b699bbda83 94 dmx = art.DmxIn[1][dmx_patch[i][j].addr];
okini3939 0:41b699bbda83 95 break;
okini3939 0:41b699bbda83 96 case 4: // UDP2DMX
okini3939 0:41b699bbda83 97 dmx = dmx_udp[dmx_patch[i][j].addr];
okini3939 0:41b699bbda83 98 break;
okini3939 0:41b699bbda83 99 default:
okini3939 0:41b699bbda83 100 continue;
okini3939 0:41b699bbda83 101 }
okini3939 0:41b699bbda83 102
okini3939 0:41b699bbda83 103 // dest
okini3939 0:41b699bbda83 104 switch (i) {
okini3939 0:41b699bbda83 105 case 0: // dmx out 1
okini3939 0:41b699bbda83 106 dmx1.put(j, dmx);
okini3939 0:41b699bbda83 107 break;
okini3939 0:41b699bbda83 108 case 1: // dmx out 2
okini3939 0:41b699bbda83 109 dmx2.put(j, dmx);
okini3939 0:41b699bbda83 110 break;
okini3939 0:41b699bbda83 111 case 2: // ArtNet 1
okini3939 0:41b699bbda83 112 if (dmx_art[0][j] != dmx) {
okini3939 0:41b699bbda83 113 dmx_art[0][j] = dmx;
okini3939 0:41b699bbda83 114 art_update[0] = 1;
okini3939 0:41b699bbda83 115 }
okini3939 0:41b699bbda83 116 break;
okini3939 0:41b699bbda83 117 case 3: // ArtNet 2
okini3939 0:41b699bbda83 118 if (dmx_art[1][j] != dmx) {
okini3939 0:41b699bbda83 119 dmx_art[1][j] = dmx;
okini3939 0:41b699bbda83 120 art_update[1] = 1;
okini3939 0:41b699bbda83 121 }
okini3939 0:41b699bbda83 122 break;
okini3939 0:41b699bbda83 123 case 4: // RF(NEC950MHz)
okini3939 0:41b699bbda83 124 if (dmx_rf[j] != dmx) {
okini3939 0:41b699bbda83 125 dmx_rf[j] = dmx;
okini3939 0:41b699bbda83 126 rf_update = 1;
okini3939 0:41b699bbda83 127 }
okini3939 0:41b699bbda83 128 break;
okini3939 0:41b699bbda83 129 }
okini3939 0:41b699bbda83 130 }
okini3939 0:41b699bbda83 131 }
okini3939 0:41b699bbda83 132 }