DMX512, RDM test see: https://os.mbed.com/users/okini3939/notebook/dmx512/

Dependencies:   DMX mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "DMX.h"
00003 
00004 #define RDM_MANUFACTURER_ID 0x7ff7
00005 #define RDM_DEVICE_MODEL    0x0001
00006 #define RDM_SW_VERSION      0x01020304 // V.1.2.3.4
00007 #define RDM_DMX_FOOTPRINT   4 // slots
00008 #define RDM_START_ADDRESS   1
00009 
00010 Serial pc(USBTX, USBRX);
00011 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
00012 DMX dmx(p9, p10, p21); // rx, tx, xmit
00013 //DMX dmx(p9, p10);
00014 
00015 char uid[] = {(RDM_MANUFACTURER_ID >> 8) & 0xff, RDM_MANUFACTURER_ID & 0xff, 0x12, 0x34, 0x56, 0x78};
00016 int dmx_address = 0;
00017 int dmx_footprint = 10;
00018 
00019 int sendRdmDeviceInfoResponse (struct RDM_DATA *rdm) {
00020     unsigned char data[20];
00021 
00022     data[ 0] = 1; // RDM Protocol Version
00023     data[ 1] = 0;
00024     data[ 2] = (RDM_DEVICE_MODEL >> 8) & 0xff; // Device model
00025     data[ 3] = RDM_DEVICE_MODEL & 0xff;
00026     data[ 4] = 1; // Product Category
00027     data[ 5] = 0;
00028     data[ 6] = RDM_SW_VERSION & 0xff; // software version
00029     data[ 7] = (RDM_SW_VERSION >> 8) & 0xff;
00030     data[ 8] = (RDM_SW_VERSION >> 16) & 0xff;
00031     data[ 9] = (RDM_SW_VERSION >> 24) & 0xff;
00032     data[10] = (dmx_footprint >> 8) & 0xff; // DMX512 Footprint
00033     data[11] = dmx_footprint & 0xff;
00034     data[12] = 1; // DMX512 Personality
00035     data[13] = 1;
00036     data[14] = ((dmx_address + 1) >> 8) & 0xff; // DMX512 Start Address
00037     data[15] = (dmx_address + 1) & 0xff;
00038     data[16] = 0; // Sub-Device Count
00039     data[17] = 0;
00040     data[18] = 0; // Sensor Count
00041     return dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 19);
00042 }
00043 
00044 void rdmParser (struct RDM_DATA *rdm) {
00045     unsigned char data[20];
00046 
00047     led3 = 1;
00048     switch (rdm->CmdClass) {
00049     case E120_GET_COMMAND:
00050         switch (__REV16(rdm->Parameter)) {
00051         case E120_SUPPORTED_PARAMETERS:
00052             uint16_t *tmp = (uint16_t*)data;
00053             tmp[0] = E120_MANUFACTURER_LABEL;
00054             tmp[1] = E120_DEVICE_MODEL_DESCRIPTION;
00055             tmp[2] = E120_DEVICE_LABEL;
00056             tmp[3] = E120_SOFTWARE_VERSION_LABEL;
00057             tmp[4] = E120_BOOT_SOFTWARE_VERSION_ID;
00058             tmp[5] = E120_BOOT_SOFTWARE_VERSION_LABEL;
00059             for (int i = 0; i < 6; i ++) {
00060                 tmp[i] = __REV16(tmp[i]);
00061             }
00062             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 2 * 6);
00063             break;
00064 
00065         case E120_IDENTIFY_DEVICE:
00066             data[0] = led4;
00067             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 1);
00068             break;
00069 
00070         case E120_DEVICE_INFO:
00071             sendRdmDeviceInfoResponse(rdm);
00072             break;
00073 
00074         case E120_DMX_START_ADDRESS:
00075             data[0] = ((dmx_address + 1) >> 8) & 0xff;
00076             data[1] = (dmx_address + 1) & 0xff;
00077             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 2);
00078             break;
00079 
00080         case E120_SOFTWARE_VERSION_LABEL:
00081             strcpy((char*)data, "DMX 1.2.3.4");
00082             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
00083             break;
00084 
00085         case E120_MANUFACTURER_LABEL:
00086             strcpy((char*)data, "ARM Mbed");
00087             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
00088             break;
00089 
00090         case E120_DEVICE_MODEL_DESCRIPTION:
00091             strcpy((char*)data, "model");
00092             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
00093             break;
00094 
00095         case E120_DEVICE_LABEL:
00096             strcpy((char*)data, "device");
00097             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
00098             break;
00099 
00100         case E120_BOOT_SOFTWARE_VERSION_ID:
00101             data[0] = RDM_SW_VERSION & 0xff; // software version
00102             data[1] = (RDM_SW_VERSION >> 8) & 0xff;
00103             data[2] = (RDM_SW_VERSION >> 16) & 0xff;
00104             data[3] = (RDM_SW_VERSION >> 24) & 0xff;
00105             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 4);
00106             break;
00107 
00108         case E120_BOOT_SOFTWARE_VERSION_LABEL:
00109             strcpy((char*)data, "1.2.3.4");
00110             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
00111             break;
00112 
00113         case E120_QUEUED_MESSAGE:
00114         case E120_STATUS_MESSAGES:
00115             data[0] = E120_STATUS_NONE;
00116             dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 1);
00117             break;
00118 
00119         default:
00120             printf("Get %04x\r\n", __REV16(rdm->Parameter));
00121             break;
00122         }
00123         break;
00124 
00125     case E120_SET_COMMAND:
00126         switch (__REV16(rdm->Parameter)) {
00127         case E120_IDENTIFY_DEVICE:
00128             if (rdm->DataLength == 1) {
00129                 led4 = rdm->Data[0];
00130                 dmx.sendRdmMsg(rdm, E120_SET_COMMAND_RESPONSE, rdm->Data, rdm->DataLength);
00131             }
00132             break;
00133 
00134         case E120_DMX_START_ADDRESS:
00135             if (rdm->DataLength == 2) {
00136                 dmx_address = ((rdm->Data[0] << 8) | rdm->Data[1]) - 1;
00137                 dmx.sendRdmMsg(rdm, E120_SET_COMMAND_RESPONSE, rdm->Data, rdm->DataLength);
00138                 printf("Set addr %04x\r\n", dmx_address);
00139             }
00140             break;
00141 
00142         default:
00143             printf("Set %04x\r\n", __REV16(rdm->Parameter));
00144             break;
00145         }
00146     }
00147 
00148 printf("rdm len=%d cmdcls=%02x param=%04x datlen=%d\r\n", rdm->Length, rdm->CmdClass, __REV16(rdm->Parameter), rdm->DataLength);
00149 for (int i = 0; i < rdm->DataLength; i ++) {
00150     printf(" %02x", rdm->Data[i]);
00151 }
00152 printf("\r\n");
00153 }
00154 
00155 
00156 void isr_timer () {
00157     led2 = led3 = 0;
00158 }
00159 
00160 int main() {
00161     Ticker t;
00162     unsigned char uid_buf[10 * 6];
00163 
00164     pc.baud(115200);
00165     pc.printf("*** DMX RDM\r\n");
00166     dmx.attachRdmCallback(&rdmParser, uid);
00167 //    dmx.start();
00168     led1 = 1;
00169     t.attach(&isr_timer, 0.1);
00170 
00171     for (;;) {
00172         dmx.pollRdm();
00173 
00174         if (dmx.isReceived()) {
00175             led2 = 1;
00176             printf("dmx ");
00177             for (int i = 0; i < dmx_footprint; i ++) {
00178                 printf(" %02x", dmx.get(dmx_address + i));
00179             }
00180             printf("\r\n");
00181         }
00182 
00183         if (pc.readable()) {
00184             switch (pc.getc()) {
00185             case 's':
00186                 dmx.start();
00187                 break;
00188 
00189             case 't':
00190                 dmx.stop();
00191                 break;
00192 
00193             case 'd':
00194                 int n = dmx.rdmDiscovery(uid_buf, 10);
00195 
00196                 printf("found %d\r\n", n);
00197                 for (int i = 0; i < n * 6; i ++) {
00198                     printf(" %02x", uid_buf[i]);
00199                 }
00200                 printf("\r\n");
00201                 break;
00202             }
00203         }
00204     }
00205 }