Suga koubou
/
DMX_RDM_test
DMX512, RDM test see: https://os.mbed.com/users/okini3939/notebook/dmx512/
main.cpp@0:d133794054a2, 2017-10-20 (annotated)
- Committer:
- okini3939
- Date:
- Fri Oct 20 00:50:46 2017 +0000
- Revision:
- 0:d133794054a2
test build
Who changed what in which revision?
User | Revision | Line number | New 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 | } |