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

NEC950MHz.cpp

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

File content as of revision 0:41b699bbda83:

/*
 * NEC 950MHz RF module
 * H001-000003-001
 */

#include "mbed.h"
#include "NEC950MHz.h"
#include "dbg.h"
#include <string.h>

#define RXD p10
#define TXD p9
#define RST p12


// host to network short
#define htons( x ) ( (( (x) << 8 ) & 0xFF00) | (( (x) >> 8 ) & 0x00FF) )
#define ntohs( x ) htons(x)
// host to network long
#define htonl( x ) ( (( (x) << 24 ) & 0xFF000000)  \
                   | (( (x) <<  8 ) & 0x00FF0000)  \
                   | (( (x) >>  8 ) & 0x0000FF00)  \
                   | (( (x) >> 24 ) & 0x000000FF)  )
#define ntohl( x ) htonl(x)


static Serial rf(TXD, RXD);
static DigitalOut rst(RST);

int send_rf (int msgid, unsigned long dest, char *param, int len) {
    int i;
    static int msgno = 0;
    struct ifMessage ifmsg;
    unsigned char *buf = (unsigned char *)&ifmsg;

    if (len > 240) len = 240;
    msgno ++;
    ifmsg.start = htons(0x0f5a);
    ifmsg.length = 13 + len;
    ifmsg.msgid = msgid;
    ifmsg.msgno = msgno;
    ifmsg.dstid = htonl(dest);
    ifmsg.srcid = htonl(0xffffffff);
    memcpy(ifmsg.parameter, param, len);
    DBG("send_rf %d / %d\r\n", ifmsg.length, len);
    
    for (i = 0; i < ifmsg.length; i ++) {
        rf.putc(buf[i]);
    }

    return ifmsg.msgno;
}

int read_rf (struct ifMessage *ifmsg) {
    Timer timeout;
    int i = 0, len = 0;
    unsigned char buf[sizeof(struct ifMessage)];

    timeout.start();
    while (timeout.read_ms() < TIMEOUT) {
        if (rf.readable()) {
            buf[i] = rf.getc();
            if (i == 0 && buf[i] == 0x0f) {
                i ++;
            } else
            if (i == 1 && buf[i] == 0x5a) {
                i ++;
            } else
            if (i == 2) {
                len = buf[i];
                i ++;
            } else
            if (i >= 3) {
                i ++;
                if (i >= len || i >= sizeof(buf)) break;
            }
            timeout.reset();
        }
    }
    timeout.stop();
 
    if (len) {
        DBG("read_rf %d / %d\r\n", i, len);
        memcpy(ifmsg, buf, len);
    }
    return len;
}

int init_rf (int ch) {
    int no;
    struct ifMessage ifmsg;
    // high power, 100kbps, retry 0
    char rfconf[] = {POWER_HIGH, ch, BAUD_100k, 1, 0, UART_115200, 1, 0xff, 0xff,
        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
        0x00, 0x00, 0x83, 0x41};
    
    rf.baud(38400);

    rst = 0; // reset
    wait_ms(50);
    rst = 1;
    wait_ms(100);

    no = send_rf(MSGID_WRITE_CONFIG, 0xffffffff, rfconf, sizeof(rfconf));
    DBG("rfconf %d\r\n", no);
    // responce
    if (! read_rf(&ifmsg) || ifmsg.msgid != MSGID_ACK || ifmsg.msgno != no) {
        return -1;
    }

    rf.baud(115200);

    return 0;
}