Suga koubou
/
DMX_RDM_test
DMX512, RDM test see: https://os.mbed.com/users/okini3939/notebook/dmx512/
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Fri Jul 15 2022 02:26:36 by 1.7.2