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

Dependencies:   DMX mbed

Committer:
okini3939
Date:
Fri Oct 20 00:50:46 2017 +0000
Revision:
0:d133794054a2
test build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d133794054a2 1 #include "mbed.h"
okini3939 0:d133794054a2 2 #include "DMX.h"
okini3939 0:d133794054a2 3
okini3939 0:d133794054a2 4 #define RDM_MANUFACTURER_ID 0x7ff7
okini3939 0:d133794054a2 5 #define RDM_DEVICE_MODEL 0x0001
okini3939 0:d133794054a2 6 #define RDM_SW_VERSION 0x01020304 // V.1.2.3.4
okini3939 0:d133794054a2 7 #define RDM_DMX_FOOTPRINT 4 // slots
okini3939 0:d133794054a2 8 #define RDM_START_ADDRESS 1
okini3939 0:d133794054a2 9
okini3939 0:d133794054a2 10 Serial pc(USBTX, USBRX);
okini3939 0:d133794054a2 11 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 0:d133794054a2 12 DMX dmx(p9, p10, p21); // rx, tx, xmit
okini3939 0:d133794054a2 13 //DMX dmx(p9, p10);
okini3939 0:d133794054a2 14
okini3939 0:d133794054a2 15 char uid[] = {(RDM_MANUFACTURER_ID >> 8) & 0xff, RDM_MANUFACTURER_ID & 0xff, 0x12, 0x34, 0x56, 0x78};
okini3939 0:d133794054a2 16 int dmx_address = 0;
okini3939 0:d133794054a2 17 int dmx_footprint = 10;
okini3939 0:d133794054a2 18
okini3939 0:d133794054a2 19 int sendRdmDeviceInfoResponse (struct RDM_DATA *rdm) {
okini3939 0:d133794054a2 20 unsigned char data[20];
okini3939 0:d133794054a2 21
okini3939 0:d133794054a2 22 data[ 0] = 1; // RDM Protocol Version
okini3939 0:d133794054a2 23 data[ 1] = 0;
okini3939 0:d133794054a2 24 data[ 2] = (RDM_DEVICE_MODEL >> 8) & 0xff; // Device model
okini3939 0:d133794054a2 25 data[ 3] = RDM_DEVICE_MODEL & 0xff;
okini3939 0:d133794054a2 26 data[ 4] = 1; // Product Category
okini3939 0:d133794054a2 27 data[ 5] = 0;
okini3939 0:d133794054a2 28 data[ 6] = RDM_SW_VERSION & 0xff; // software version
okini3939 0:d133794054a2 29 data[ 7] = (RDM_SW_VERSION >> 8) & 0xff;
okini3939 0:d133794054a2 30 data[ 8] = (RDM_SW_VERSION >> 16) & 0xff;
okini3939 0:d133794054a2 31 data[ 9] = (RDM_SW_VERSION >> 24) & 0xff;
okini3939 0:d133794054a2 32 data[10] = (dmx_footprint >> 8) & 0xff; // DMX512 Footprint
okini3939 0:d133794054a2 33 data[11] = dmx_footprint & 0xff;
okini3939 0:d133794054a2 34 data[12] = 1; // DMX512 Personality
okini3939 0:d133794054a2 35 data[13] = 1;
okini3939 0:d133794054a2 36 data[14] = ((dmx_address + 1) >> 8) & 0xff; // DMX512 Start Address
okini3939 0:d133794054a2 37 data[15] = (dmx_address + 1) & 0xff;
okini3939 0:d133794054a2 38 data[16] = 0; // Sub-Device Count
okini3939 0:d133794054a2 39 data[17] = 0;
okini3939 0:d133794054a2 40 data[18] = 0; // Sensor Count
okini3939 0:d133794054a2 41 return dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 19);
okini3939 0:d133794054a2 42 }
okini3939 0:d133794054a2 43
okini3939 0:d133794054a2 44 void rdmParser (struct RDM_DATA *rdm) {
okini3939 0:d133794054a2 45 unsigned char data[20];
okini3939 0:d133794054a2 46
okini3939 0:d133794054a2 47 led3 = 1;
okini3939 0:d133794054a2 48 switch (rdm->CmdClass) {
okini3939 0:d133794054a2 49 case E120_GET_COMMAND:
okini3939 0:d133794054a2 50 switch (__REV16(rdm->Parameter)) {
okini3939 0:d133794054a2 51 case E120_SUPPORTED_PARAMETERS:
okini3939 0:d133794054a2 52 uint16_t *tmp = (uint16_t*)data;
okini3939 0:d133794054a2 53 tmp[0] = E120_MANUFACTURER_LABEL;
okini3939 0:d133794054a2 54 tmp[1] = E120_DEVICE_MODEL_DESCRIPTION;
okini3939 0:d133794054a2 55 tmp[2] = E120_DEVICE_LABEL;
okini3939 0:d133794054a2 56 tmp[3] = E120_SOFTWARE_VERSION_LABEL;
okini3939 0:d133794054a2 57 tmp[4] = E120_BOOT_SOFTWARE_VERSION_ID;
okini3939 0:d133794054a2 58 tmp[5] = E120_BOOT_SOFTWARE_VERSION_LABEL;
okini3939 0:d133794054a2 59 for (int i = 0; i < 6; i ++) {
okini3939 0:d133794054a2 60 tmp[i] = __REV16(tmp[i]);
okini3939 0:d133794054a2 61 }
okini3939 0:d133794054a2 62 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 2 * 6);
okini3939 0:d133794054a2 63 break;
okini3939 0:d133794054a2 64
okini3939 0:d133794054a2 65 case E120_IDENTIFY_DEVICE:
okini3939 0:d133794054a2 66 data[0] = led4;
okini3939 0:d133794054a2 67 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 1);
okini3939 0:d133794054a2 68 break;
okini3939 0:d133794054a2 69
okini3939 0:d133794054a2 70 case E120_DEVICE_INFO:
okini3939 0:d133794054a2 71 sendRdmDeviceInfoResponse(rdm);
okini3939 0:d133794054a2 72 break;
okini3939 0:d133794054a2 73
okini3939 0:d133794054a2 74 case E120_DMX_START_ADDRESS:
okini3939 0:d133794054a2 75 data[0] = ((dmx_address + 1) >> 8) & 0xff;
okini3939 0:d133794054a2 76 data[1] = (dmx_address + 1) & 0xff;
okini3939 0:d133794054a2 77 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 2);
okini3939 0:d133794054a2 78 break;
okini3939 0:d133794054a2 79
okini3939 0:d133794054a2 80 case E120_SOFTWARE_VERSION_LABEL:
okini3939 0:d133794054a2 81 strcpy((char*)data, "DMX 1.2.3.4");
okini3939 0:d133794054a2 82 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
okini3939 0:d133794054a2 83 break;
okini3939 0:d133794054a2 84
okini3939 0:d133794054a2 85 case E120_MANUFACTURER_LABEL:
okini3939 0:d133794054a2 86 strcpy((char*)data, "ARM Mbed");
okini3939 0:d133794054a2 87 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
okini3939 0:d133794054a2 88 break;
okini3939 0:d133794054a2 89
okini3939 0:d133794054a2 90 case E120_DEVICE_MODEL_DESCRIPTION:
okini3939 0:d133794054a2 91 strcpy((char*)data, "model");
okini3939 0:d133794054a2 92 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
okini3939 0:d133794054a2 93 break;
okini3939 0:d133794054a2 94
okini3939 0:d133794054a2 95 case E120_DEVICE_LABEL:
okini3939 0:d133794054a2 96 strcpy((char*)data, "device");
okini3939 0:d133794054a2 97 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
okini3939 0:d133794054a2 98 break;
okini3939 0:d133794054a2 99
okini3939 0:d133794054a2 100 case E120_BOOT_SOFTWARE_VERSION_ID:
okini3939 0:d133794054a2 101 data[0] = RDM_SW_VERSION & 0xff; // software version
okini3939 0:d133794054a2 102 data[1] = (RDM_SW_VERSION >> 8) & 0xff;
okini3939 0:d133794054a2 103 data[2] = (RDM_SW_VERSION >> 16) & 0xff;
okini3939 0:d133794054a2 104 data[3] = (RDM_SW_VERSION >> 24) & 0xff;
okini3939 0:d133794054a2 105 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 4);
okini3939 0:d133794054a2 106 break;
okini3939 0:d133794054a2 107
okini3939 0:d133794054a2 108 case E120_BOOT_SOFTWARE_VERSION_LABEL:
okini3939 0:d133794054a2 109 strcpy((char*)data, "1.2.3.4");
okini3939 0:d133794054a2 110 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, strlen((char*)data));
okini3939 0:d133794054a2 111 break;
okini3939 0:d133794054a2 112
okini3939 0:d133794054a2 113 case E120_QUEUED_MESSAGE:
okini3939 0:d133794054a2 114 case E120_STATUS_MESSAGES:
okini3939 0:d133794054a2 115 data[0] = E120_STATUS_NONE;
okini3939 0:d133794054a2 116 dmx.sendRdmMsg(rdm, E120_GET_COMMAND_RESPONSE, data, 1);
okini3939 0:d133794054a2 117 break;
okini3939 0:d133794054a2 118
okini3939 0:d133794054a2 119 default:
okini3939 0:d133794054a2 120 printf("Get %04x\r\n", __REV16(rdm->Parameter));
okini3939 0:d133794054a2 121 break;
okini3939 0:d133794054a2 122 }
okini3939 0:d133794054a2 123 break;
okini3939 0:d133794054a2 124
okini3939 0:d133794054a2 125 case E120_SET_COMMAND:
okini3939 0:d133794054a2 126 switch (__REV16(rdm->Parameter)) {
okini3939 0:d133794054a2 127 case E120_IDENTIFY_DEVICE:
okini3939 0:d133794054a2 128 if (rdm->DataLength == 1) {
okini3939 0:d133794054a2 129 led4 = rdm->Data[0];
okini3939 0:d133794054a2 130 dmx.sendRdmMsg(rdm, E120_SET_COMMAND_RESPONSE, rdm->Data, rdm->DataLength);
okini3939 0:d133794054a2 131 }
okini3939 0:d133794054a2 132 break;
okini3939 0:d133794054a2 133
okini3939 0:d133794054a2 134 case E120_DMX_START_ADDRESS:
okini3939 0:d133794054a2 135 if (rdm->DataLength == 2) {
okini3939 0:d133794054a2 136 dmx_address = ((rdm->Data[0] << 8) | rdm->Data[1]) - 1;
okini3939 0:d133794054a2 137 dmx.sendRdmMsg(rdm, E120_SET_COMMAND_RESPONSE, rdm->Data, rdm->DataLength);
okini3939 0:d133794054a2 138 printf("Set addr %04x\r\n", dmx_address);
okini3939 0:d133794054a2 139 }
okini3939 0:d133794054a2 140 break;
okini3939 0:d133794054a2 141
okini3939 0:d133794054a2 142 default:
okini3939 0:d133794054a2 143 printf("Set %04x\r\n", __REV16(rdm->Parameter));
okini3939 0:d133794054a2 144 break;
okini3939 0:d133794054a2 145 }
okini3939 0:d133794054a2 146 }
okini3939 0:d133794054a2 147
okini3939 0:d133794054a2 148 printf("rdm len=%d cmdcls=%02x param=%04x datlen=%d\r\n", rdm->Length, rdm->CmdClass, __REV16(rdm->Parameter), rdm->DataLength);
okini3939 0:d133794054a2 149 for (int i = 0; i < rdm->DataLength; i ++) {
okini3939 0:d133794054a2 150 printf(" %02x", rdm->Data[i]);
okini3939 0:d133794054a2 151 }
okini3939 0:d133794054a2 152 printf("\r\n");
okini3939 0:d133794054a2 153 }
okini3939 0:d133794054a2 154
okini3939 0:d133794054a2 155
okini3939 0:d133794054a2 156 void isr_timer () {
okini3939 0:d133794054a2 157 led2 = led3 = 0;
okini3939 0:d133794054a2 158 }
okini3939 0:d133794054a2 159
okini3939 0:d133794054a2 160 int main() {
okini3939 0:d133794054a2 161 Ticker t;
okini3939 0:d133794054a2 162 unsigned char uid_buf[10 * 6];
okini3939 0:d133794054a2 163
okini3939 0:d133794054a2 164 pc.baud(115200);
okini3939 0:d133794054a2 165 pc.printf("*** DMX RDM\r\n");
okini3939 0:d133794054a2 166 dmx.attachRdmCallback(&rdmParser, uid);
okini3939 0:d133794054a2 167 // dmx.start();
okini3939 0:d133794054a2 168 led1 = 1;
okini3939 0:d133794054a2 169 t.attach(&isr_timer, 0.1);
okini3939 0:d133794054a2 170
okini3939 0:d133794054a2 171 for (;;) {
okini3939 0:d133794054a2 172 dmx.pollRdm();
okini3939 0:d133794054a2 173
okini3939 0:d133794054a2 174 if (dmx.isReceived()) {
okini3939 0:d133794054a2 175 led2 = 1;
okini3939 0:d133794054a2 176 printf("dmx ");
okini3939 0:d133794054a2 177 for (int i = 0; i < dmx_footprint; i ++) {
okini3939 0:d133794054a2 178 printf(" %02x", dmx.get(dmx_address + i));
okini3939 0:d133794054a2 179 }
okini3939 0:d133794054a2 180 printf("\r\n");
okini3939 0:d133794054a2 181 }
okini3939 0:d133794054a2 182
okini3939 0:d133794054a2 183 if (pc.readable()) {
okini3939 0:d133794054a2 184 switch (pc.getc()) {
okini3939 0:d133794054a2 185 case 's':
okini3939 0:d133794054a2 186 dmx.start();
okini3939 0:d133794054a2 187 break;
okini3939 0:d133794054a2 188
okini3939 0:d133794054a2 189 case 't':
okini3939 0:d133794054a2 190 dmx.stop();
okini3939 0:d133794054a2 191 break;
okini3939 0:d133794054a2 192
okini3939 0:d133794054a2 193 case 'd':
okini3939 0:d133794054a2 194 int n = dmx.rdmDiscovery(uid_buf, 10);
okini3939 0:d133794054a2 195
okini3939 0:d133794054a2 196 printf("found %d\r\n", n);
okini3939 0:d133794054a2 197 for (int i = 0; i < n * 6; i ++) {
okini3939 0:d133794054a2 198 printf(" %02x", uid_buf[i]);
okini3939 0:d133794054a2 199 }
okini3939 0:d133794054a2 200 printf("\r\n");
okini3939 0:d133794054a2 201 break;
okini3939 0:d133794054a2 202 }
okini3939 0:d133794054a2 203 }
okini3939 0:d133794054a2 204 }
okini3939 0:d133794054a2 205 }