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

Committer:
okini3939
Date:
2012-03-01
Revision:
0:41b699bbda83

File content as of revision 0:41b699bbda83:

/*
 * DMX Station - mbed DMX Platform
 * Copyright (c) 2012 Hiroshi Suga
 * Released under the MIT License: http://mbed.org/license/mit
 */

/*
 * "patch#.csv" (#=dest port)
 *  |dest ch,src port,src ch|
 *
 * dest port: 1=dmx out 1 / 2=dmx out 2 / 3=ArtNet 1 / 4=ArtNet 2 / 5=RF(NEC950MHz)
 * src port: 1=dmx in 1 / 2=dmx in 2 / 3=ArtNet 1 / 4=ArtNet 2 / 5=UDP2DMX
 */
#include "dbg.h"
#include "mbed.h"
#include "SDFileSystem.h"
#include "DmxArtNet.h"
#include "DMX.h"
#include "dmx_patch.h"


SDFileSystem sd(p5, p6, p7, p8, "sd");

struct TPatch dmx_patch[DEST_NUM][512] __attribute__((section("AHBSRAM0")));

extern DmxArtNet art;
extern DMX dmx1;
extern DMX dmx2;

extern volatile int patch_update;
extern volatile int art_update[2];
extern volatile int rf_update;
extern char dmx_art[2][512];
extern char dmx_udp[512];
extern char dmx_rf[512];


int load_patch () {
    int i, j, dest, src, port;
    FILE *fp;
    char file[32];

    for (i = 0; i < DEST_NUM; i ++) {
        for (j = 0; j < 512; j ++) {
            dmx_patch[i][j].port = i < 2 ? i + 2 : i - 2;
            dmx_patch[i][j].addr = j;
        }
    }

    if (sd.disk_initialize()) {
        DBG("no SD\r\n");
        return -1;
    }

    for (i = 0; i < DEST_NUM; i ++) {
        sprintf(file, "/sd/patch%d.csv", i + 1);
        fp = fopen(file, "r");
        if (! fp) continue;
        
        while (1) {
            // load csv
            if (feof(fp)) break;
            if (fscanf(fp, "%d,%d,%d", &dest, &port, &src) == 3) {
                if (dest < 1 && dest > 512) continue;
                if (src < 1 && src > 512) continue;
                if (port < 1 && port > 5) continue;
                dmx_patch[i][dest - 1].port = port - 1;
                dmx_patch[i][dest - 1].addr = src - 1;
                DBG("%d %d <- %d %d\r\n", i + 1, dest, port, src);
            }
        }
        fclose(fp);
    }
    return 0;
}

void patch () {
    int i, j, dmx;

    for (i = 0; i < DEST_NUM; i ++) {
        for (j = 0; j < 512; j ++) {
            // src
            switch (dmx_patch[i][j].port) {
            case 0: // dmx in 1
                dmx = dmx1.get(dmx_patch[i][j].addr);
                break;
            case 1: // dmx in 2
                dmx = dmx2.get(dmx_patch[i][j].addr);
                break;
            case 2: // ArtNet 1
                dmx = art.DmxIn[0][dmx_patch[i][j].addr];
                break;
            case 3: // ArtNet 2
                dmx = art.DmxIn[1][dmx_patch[i][j].addr];
                break;
            case 4: // UDP2DMX
                dmx = dmx_udp[dmx_patch[i][j].addr];
                break;
            default:
                continue;
            }
            
            // dest
            switch (i) {
            case 0: // dmx out 1
                dmx1.put(j, dmx);
                break;
            case 1: // dmx out 2
                dmx2.put(j, dmx);
                break;
            case 2: // ArtNet 1
                if (dmx_art[0][j] != dmx) {
                    dmx_art[0][j] = dmx;
                    art_update[0] = 1;
                }
                break;
            case 3: // ArtNet 2
                if (dmx_art[1][j] != dmx) {
                    dmx_art[1][j] = dmx;
                    art_update[1] = 1;
                }
                break;
            case 4: // RF(NEC950MHz)
                if (dmx_rf[j] != dmx) {
                    dmx_rf[j] = dmx;
                    rf_update = 1;
                }
                break;
            }
        }
    }
}