DMX512, RDM send/recv library http://mbed.org/users/okini3939/notebook/dmx512
Dependents: dmx_test ArtNodeLED SPK-DVIMXR SPK-DMXer ... more
DMX512 send/recv library
DMX512 is protocol for lighting.
調光プロトコル DMX512 を送受信するライブラリです。
see: http://mbed.org/users/okini3939/notebook/dmx512/
LPC1114 support is thanks to Stanly Chen
DMX.h@19:ae8fd2ba7c53, 2017-10-20 (annotated)
- Committer:
- okini3939
- Date:
- Fri Oct 20 00:44:06 2017 +0000
- Revision:
- 19:ae8fd2ba7c53
- Parent:
- 18:69d65ca92bcc
supported RDM
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:cbff6bf41542 | 1 | /* |
okini3939 | 19:ae8fd2ba7c53 | 2 | * DMX512, RDM send/recv library |
okini3939 | 19:ae8fd2ba7c53 | 3 | * Copyright (c) 2017 Hiroshi Suga |
okini3939 | 0:cbff6bf41542 | 4 | * Released under the MIT License: http://mbed.org/license/mit |
okini3939 | 0:cbff6bf41542 | 5 | */ |
okini3939 | 0:cbff6bf41542 | 6 | |
okini3939 | 7:16d6874076dd | 7 | /** @file |
okini3939 | 0:cbff6bf41542 | 8 | * @brief DMX512 send/recv |
okini3939 | 0:cbff6bf41542 | 9 | */ |
okini3939 | 0:cbff6bf41542 | 10 | |
okini3939 | 19:ae8fd2ba7c53 | 11 | #ifndef __DMX_H__ |
okini3939 | 19:ae8fd2ba7c53 | 12 | #define __DMX_H__ |
okini3939 | 19:ae8fd2ba7c53 | 13 | |
okini3939 | 19:ae8fd2ba7c53 | 14 | #define RDM_ENABLE |
okini3939 | 0:cbff6bf41542 | 15 | |
okini3939 | 0:cbff6bf41542 | 16 | #include "mbed.h" |
okini3939 | 14:cef8749fd54d | 17 | #include "RawSerial.h" |
okini3939 | 0:cbff6bf41542 | 18 | |
okini3939 | 19:ae8fd2ba7c53 | 19 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 20 | #include "RDM.h" |
okini3939 | 19:ae8fd2ba7c53 | 21 | #endif |
okini3939 | 19:ae8fd2ba7c53 | 22 | |
okini3939 | 18:69d65ca92bcc | 23 | //#define DMX_UART_DIRECT |
okini3939 | 0:cbff6bf41542 | 24 | |
okini3939 | 18:69d65ca92bcc | 25 | #define DMX_SIZE 512 |
okini3939 | 18:69d65ca92bcc | 26 | #define DMX_START_CODE 0 |
okini3939 | 18:69d65ca92bcc | 27 | |
okini3939 | 19:ae8fd2ba7c53 | 28 | #define RDM_START_CODE E120_SC_RDM |
okini3939 | 19:ae8fd2ba7c53 | 29 | #define RDM_SUB_CODE E120_SC_SUB_MESSAGE |
okini3939 | 19:ae8fd2ba7c53 | 30 | #define XMIT_TX 1 |
okini3939 | 19:ae8fd2ba7c53 | 31 | #define XMIT_RX 0 |
okini3939 | 19:ae8fd2ba7c53 | 32 | |
okini3939 | 18:69d65ca92bcc | 33 | #define DMX_TIME_BREAK 100 // 100us (88us-1s) |
okini3939 | 18:69d65ca92bcc | 34 | #define DMX_TIME_MAB 12 // 12us (8us-1s) |
okini3939 | 18:69d65ca92bcc | 35 | #define DMX_TIME_MBB 200 // 10us (0-1s) |
okini3939 | 19:ae8fd2ba7c53 | 36 | #define RDM_TIME_DELAY 100 |
okini3939 | 0:cbff6bf41542 | 37 | |
okini3939 | 0:cbff6bf41542 | 38 | enum DMX_MODE { |
okini3939 | 0:cbff6bf41542 | 39 | DMX_MODE_BEGIN, |
okini3939 | 0:cbff6bf41542 | 40 | DMX_MODE_START, |
okini3939 | 0:cbff6bf41542 | 41 | DMX_MODE_BREAK, |
okini3939 | 0:cbff6bf41542 | 42 | DMX_MODE_MAB, |
okini3939 | 0:cbff6bf41542 | 43 | DMX_MODE_DATA, |
okini3939 | 0:cbff6bf41542 | 44 | DMX_MODE_ERROR, |
okini3939 | 4:dd0544c80096 | 45 | DMX_MODE_STOP, |
okini3939 | 19:ae8fd2ba7c53 | 46 | DMX_MODE_RDMSUB, |
okini3939 | 19:ae8fd2ba7c53 | 47 | DMX_MODE_RDM, |
okini3939 | 0:cbff6bf41542 | 48 | }; |
okini3939 | 0:cbff6bf41542 | 49 | |
okini3939 | 19:ae8fd2ba7c53 | 50 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 51 | struct RDM_DATA { |
okini3939 | 19:ae8fd2ba7c53 | 52 | // uint8_t StartCode; |
okini3939 | 19:ae8fd2ba7c53 | 53 | uint8_t SubStartCode; |
okini3939 | 19:ae8fd2ba7c53 | 54 | uint8_t Length; |
okini3939 | 19:ae8fd2ba7c53 | 55 | uint8_t DestID[6]; |
okini3939 | 19:ae8fd2ba7c53 | 56 | uint8_t SourceID[6]; |
okini3939 | 19:ae8fd2ba7c53 | 57 | uint8_t TransactionNo; |
okini3939 | 19:ae8fd2ba7c53 | 58 | uint8_t ResponseType; |
okini3939 | 19:ae8fd2ba7c53 | 59 | uint8_t MessageCount; |
okini3939 | 19:ae8fd2ba7c53 | 60 | uint16_t SubDev; |
okini3939 | 19:ae8fd2ba7c53 | 61 | uint8_t CmdClass; |
okini3939 | 19:ae8fd2ba7c53 | 62 | uint16_t Parameter; |
okini3939 | 19:ae8fd2ba7c53 | 63 | uint8_t DataLength; |
okini3939 | 19:ae8fd2ba7c53 | 64 | uint8_t Data[231]; |
okini3939 | 19:ae8fd2ba7c53 | 65 | } __attribute__((packed)); |
okini3939 | 19:ae8fd2ba7c53 | 66 | #endif |
okini3939 | 19:ae8fd2ba7c53 | 67 | |
okini3939 | 0:cbff6bf41542 | 68 | /** DMX512 class (sender/client) |
okini3939 | 0:cbff6bf41542 | 69 | */ |
okini3939 | 0:cbff6bf41542 | 70 | class DMX { |
okini3939 | 0:cbff6bf41542 | 71 | public: |
okini3939 | 0:cbff6bf41542 | 72 | /** init DMX class |
okini3939 | 0:cbff6bf41542 | 73 | * @param p_tx TX serial port (p9, p13, p28) |
okini3939 | 0:cbff6bf41542 | 74 | * @param p_rx RX serial port (p10, p14, p27) |
okini3939 | 19:ae8fd2ba7c53 | 75 | * @param p_re data enable/~receive enable |
okini3939 | 0:cbff6bf41542 | 76 | */ |
okini3939 | 19:ae8fd2ba7c53 | 77 | DMX (PinName p_tx, PinName p_rx, PinName p_xmit = NC); |
okini3939 | 0:cbff6bf41542 | 78 | |
okini3939 | 6:9e7b4eeac6ec | 79 | /** Send the data |
okini3939 | 6:9e7b4eeac6ec | 80 | * @param addr DMX data address (0-511) |
okini3939 | 0:cbff6bf41542 | 81 | * @param data DMX data (0-255) |
okini3939 | 0:cbff6bf41542 | 82 | */ |
okini3939 | 6:9e7b4eeac6ec | 83 | void put (int addr, int data); |
okini3939 | 6:9e7b4eeac6ec | 84 | /** Send the data |
okini3939 | 6:9e7b4eeac6ec | 85 | * @param buf DMX data buffer |
okini3939 | 6:9e7b4eeac6ec | 86 | * @param addr DMX data address |
okini3939 | 6:9e7b4eeac6ec | 87 | * @param len data length |
okini3939 | 6:9e7b4eeac6ec | 88 | */ |
okini3939 | 6:9e7b4eeac6ec | 89 | void put (unsigned char *buf, int addr = 0, int len = DMX_SIZE); |
okini3939 | 0:cbff6bf41542 | 90 | |
okini3939 | 6:9e7b4eeac6ec | 91 | /** Send the data |
okini3939 | 7:16d6874076dd | 92 | * @param addr DMX data address (0-511) |
okini3939 | 0:cbff6bf41542 | 93 | * @return DMX data (0-255) |
okini3939 | 0:cbff6bf41542 | 94 | */ |
okini3939 | 6:9e7b4eeac6ec | 95 | int get (int addr); |
okini3939 | 6:9e7b4eeac6ec | 96 | /** Send the data |
okini3939 | 6:9e7b4eeac6ec | 97 | * @param buf DMX data buffer |
okini3939 | 6:9e7b4eeac6ec | 98 | * @param addr DMX data address |
okini3939 | 6:9e7b4eeac6ec | 99 | * @param len data length |
okini3939 | 6:9e7b4eeac6ec | 100 | */ |
okini3939 | 6:9e7b4eeac6ec | 101 | void get (unsigned char *buf, int addr = 0, int len = DMX_SIZE); |
okini3939 | 0:cbff6bf41542 | 102 | |
okini3939 | 6:9e7b4eeac6ec | 103 | /** Start DMX send operation |
okini3939 | 4:dd0544c80096 | 104 | */ |
okini3939 | 4:dd0544c80096 | 105 | void start (); |
okini3939 | 6:9e7b4eeac6ec | 106 | /** Stop DMX send operation |
okini3939 | 4:dd0544c80096 | 107 | */ |
okini3939 | 4:dd0544c80096 | 108 | void stop (); |
okini3939 | 12:1f176eee2d28 | 109 | /** Clear DMX data |
okini3939 | 12:1f176eee2d28 | 110 | */ |
okini3939 | 12:1f176eee2d28 | 111 | void clear (); |
okini3939 | 3:2eb66b4d99bd | 112 | |
okini3939 | 18:69d65ca92bcc | 113 | int isReceived (); |
okini3939 | 17:c9198630ba05 | 114 | int isSent (); |
okini3939 | 17:c9198630ba05 | 115 | unsigned char *getRxBuffer (); |
okini3939 | 17:c9198630ba05 | 116 | unsigned char *getTxBuffer (); |
okini3939 | 18:69d65ca92bcc | 117 | int setTimingParameters (int breaktime, int mab, int mbb); |
okini3939 | 0:cbff6bf41542 | 118 | |
okini3939 | 19:ae8fd2ba7c53 | 119 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 120 | void pollRdm (); |
okini3939 | 19:ae8fd2ba7c53 | 121 | int sendRdmMsg (struct RDM_DATA *rdm, int CmdClass, unsigned char *data, int len); |
okini3939 | 19:ae8fd2ba7c53 | 122 | int sendRdmMsg (unsigned char *dest, int CmdClass, int Parameter, int Type, unsigned char *data, int len, int block = 0); |
okini3939 | 19:ae8fd2ba7c53 | 123 | void attachRdmCallback (void (*handler)(struct RDM_DATA *), char *uid); |
okini3939 | 19:ae8fd2ba7c53 | 124 | |
okini3939 | 19:ae8fd2ba7c53 | 125 | int sendRdmDiscMute (unsigned char *dest, int mute); |
okini3939 | 19:ae8fd2ba7c53 | 126 | int rdmDiscovery (unsigned char *buf, int size); |
okini3939 | 19:ae8fd2ba7c53 | 127 | #endif |
okini3939 | 19:ae8fd2ba7c53 | 128 | |
okini3939 | 0:cbff6bf41542 | 129 | protected: |
okini3939 | 0:cbff6bf41542 | 130 | |
okini3939 | 0:cbff6bf41542 | 131 | void int_timer (); |
okini3939 | 0:cbff6bf41542 | 132 | void int_tx (); |
okini3939 | 0:cbff6bf41542 | 133 | void int_rx (); |
okini3939 | 0:cbff6bf41542 | 134 | |
okini3939 | 14:cef8749fd54d | 135 | // Serial _dmx; |
okini3939 | 13:9841af9ac344 | 136 | RawSerial _dmx; |
okini3939 | 19:ae8fd2ba7c53 | 137 | DigitalOut *_xmit; |
okini3939 | 0:cbff6bf41542 | 138 | Timeout timeout01; |
okini3939 | 6:9e7b4eeac6ec | 139 | volatile DMX_MODE mode_tx, mode_rx; |
okini3939 | 6:9e7b4eeac6ec | 140 | volatile int addr_tx, addr_rx; |
okini3939 | 6:9e7b4eeac6ec | 141 | unsigned char data_tx[DMX_SIZE]; |
okini3939 | 6:9e7b4eeac6ec | 142 | unsigned char data_rx[DMX_SIZE]; |
okini3939 | 19:ae8fd2ba7c53 | 143 | volatile int is_received, is_sent, is_rdm_received; |
okini3939 | 18:69d65ca92bcc | 144 | int time_break, time_mab, time_mbb; |
okini3939 | 6:9e7b4eeac6ec | 145 | |
okini3939 | 19:ae8fd2ba7c53 | 146 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 147 | volatile int mode_rdm; |
okini3939 | 19:ae8fd2ba7c53 | 148 | unsigned char rdm_uid[6]; |
okini3939 | 19:ae8fd2ba7c53 | 149 | int rdm_mute, rdm_msgcount, rdm_transno; |
okini3939 | 19:ae8fd2ba7c53 | 150 | unsigned char data_rdm[64]; |
okini3939 | 19:ae8fd2ba7c53 | 151 | unsigned char found_uid[6]; |
okini3939 | 19:ae8fd2ba7c53 | 152 | unsigned char *buf_uid; |
okini3939 | 19:ae8fd2ba7c53 | 153 | int buf_uid_count, buf_uid_size; |
okini3939 | 19:ae8fd2ba7c53 | 154 | |
okini3939 | 19:ae8fd2ba7c53 | 155 | int calcCrc (unsigned char *buf, int len, int offset = RDM_START_CODE); |
okini3939 | 19:ae8fd2ba7c53 | 156 | void rdmStart (int block = 0); |
okini3939 | 19:ae8fd2ba7c53 | 157 | void rdmWaitResponse (int ms); |
okini3939 | 19:ae8fd2ba7c53 | 158 | int sendRdmDiscResponse (struct RDM_DATA *rdm); |
okini3939 | 19:ae8fd2ba7c53 | 159 | int sendRdmDiscMuteResponse (struct RDM_DATA *rdm); |
okini3939 | 19:ae8fd2ba7c53 | 160 | |
okini3939 | 19:ae8fd2ba7c53 | 161 | void int_rdm (); |
okini3939 | 19:ae8fd2ba7c53 | 162 | int sendRdmDiscovery (uint64_t uid_begin, uint64_t uid_end); |
okini3939 | 19:ae8fd2ba7c53 | 163 | int rdmDiscoverySub (uint64_t uid_begin, uint64_t uid_end, int ttl); |
okini3939 | 19:ae8fd2ba7c53 | 164 | |
okini3939 | 19:ae8fd2ba7c53 | 165 | void (*cb_RdmParser)(struct RDM_DATA *rdm); |
okini3939 | 19:ae8fd2ba7c53 | 166 | #endif |
okini3939 | 19:ae8fd2ba7c53 | 167 | |
okini3939 | 6:9e7b4eeac6ec | 168 | private: |
okini3939 | 13:9841af9ac344 | 169 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088) |
okini3939 | 8:d4a45bba41d2 | 170 | LPC_UART_TypeDef *_uart; |
okini3939 | 15:4ea4a31c7609 | 171 | #elif defined(TARGET_LPC11UXX) |
okini3939 | 8:d4a45bba41d2 | 172 | LPC_USART_Type *_uart; |
stanly88 | 10:b748aab8404c | 173 | #elif defined(TARGET_LPC11XX) |
stanly88 | 10:b748aab8404c | 174 | LPC_UART_TypeDef *_uart; |
okini3939 | 13:9841af9ac344 | 175 | #else |
okini3939 | 13:9841af9ac344 | 176 | #error "this CPU not supported." |
okini3939 | 5:72039cd4c874 | 177 | #endif |
okini3939 | 0:cbff6bf41542 | 178 | |
okini3939 | 0:cbff6bf41542 | 179 | }; |
okini3939 | 0:cbff6bf41542 | 180 | |
okini3939 | 0:cbff6bf41542 | 181 | #endif |