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
dmx_patch.cpp@0:41b699bbda83, 2012-03-01 (annotated)
- Committer:
- okini3939
- Date:
- Thu Mar 01 01:40:07 2012 +0000
- Revision:
- 0:41b699bbda83
Who changed what in which revision?
User | Revision | Line number | New 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 | } |