class library to access fischertechnik interfaces via USB
Dependencies: FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp
ftlib/ftlibclasstxc.h@1:4676e8b9b357, 2013-03-11 (annotated)
- Committer:
- networker
- Date:
- Mon Mar 11 08:04:37 2013 +0000
- Revision:
- 1:4676e8b9b357
- Parent:
- 0:7da612835693
first publication of this experimental class, just for sharing wip
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
networker |
0:7da612835693 | 1 | #ifndef FTLIBCLASSTXC_H |
networker |
0:7da612835693 | 2 | #define FTLIBCLASSTXC_H |
networker |
0:7da612835693 | 3 | #include "ftlibclassusb.h" |
networker |
0:7da612835693 | 4 | #include <string.h> |
networker |
0:7da612835693 | 5 | #include "fifo.h" |
networker |
0:7da612835693 | 6 | #define FT_TXC 300 |
networker |
0:7da612835693 | 7 | |
networker |
0:7da612835693 | 8 | |
networker |
0:7da612835693 | 9 | typedef unsigned char UINT8; |
networker |
0:7da612835693 | 10 | typedef unsigned char BOOL8; |
networker |
0:7da612835693 | 11 | typedef unsigned char UCHAR8; |
networker |
0:7da612835693 | 12 | typedef unsigned short UINT16; |
networker |
0:7da612835693 | 13 | typedef short INT16; |
networker |
0:7da612835693 | 14 | typedef unsigned short BOOL16; |
networker |
0:7da612835693 | 15 | typedef int INT32; |
networker |
0:7da612835693 | 16 | typedef unsigned UINT32; |
networker |
0:7da612835693 | 17 | |
networker |
0:7da612835693 | 18 | //#include "ROBO_TX_FW.h" //"../PC_programming_RoboTXC_V1-2_11_Dec_2009/PC_Programming_RoboTXC/Demo_Static_Lib_C/Inc/" |
networker |
0:7da612835693 | 19 | #include "ROBO_TX_FW_1_24.h" //"../PC_programming_RoboTXC/PC_Programming_RoboTXC/Demo_Static_Lib_C/Inc/" |
networker |
0:7da612835693 | 20 | typedef struct { |
networker |
0:7da612835693 | 21 | UINT32 snd, rec; |
networker |
0:7da612835693 | 22 | UINT16 trans, session; |
networker |
0:7da612835693 | 23 | UINT32 cmd, structs; |
networker |
0:7da612835693 | 24 | } headerbody; |
networker |
0:7da612835693 | 25 | |
networker |
0:7da612835693 | 26 | typedef struct { |
networker |
0:7da612835693 | 27 | UINT16 start; |
networker |
0:7da612835693 | 28 | union { //the message format is HL, the native format is LH, receiver routine swaps HL to LH, send routine writes as HL UINT16 bytes; |
networker |
0:7da612835693 | 29 | struct { |
networker |
0:7da612835693 | 30 | UINT8 bytesH, bytesL; |
networker |
0:7da612835693 | 31 | }/*anonymous*/; //as_bytes; |
networker |
0:7da612835693 | 32 | UINT16 bytes; |
networker |
0:7da612835693 | 33 | };//winavr allows anonymous structs and unions |
networker |
0:7da612835693 | 34 | headerbody body; |
networker |
0:7da612835693 | 35 | // UINT32 ta_id;//ta_id is normally not considered part of the header but part of the payload, it is repeated for each struct |
networker |
0:7da612835693 | 36 | } header; |
networker |
0:7da612835693 | 37 | |
networker |
0:7da612835693 | 38 | |
networker |
0:7da612835693 | 39 | typedef struct { |
networker |
0:7da612835693 | 40 | UINT16 chksum; |
networker |
0:7da612835693 | 41 | UCHAR8 etx; |
networker |
0:7da612835693 | 42 | } trailer; |
networker |
0:7da612835693 | 43 | |
networker |
0:7da612835693 | 44 | class ftusbdevtx: public ftusbdev { |
networker |
0:7da612835693 | 45 | friend ftusbdev; |
networker |
0:7da612835693 | 46 | protected: |
networker |
0:7da612835693 | 47 | typedef TA *pTA; |
networker |
0:7da612835693 | 48 | pTA ta[TA_N_PARTS]; |
networker |
0:7da612835693 | 49 | unsigned short tid, sid; |
networker |
0:7da612835693 | 50 | unsigned char *buffer; |
networker |
0:7da612835693 | 51 | fifo console; |
networker |
0:7da612835693 | 52 | unsigned active; |
networker |
0:7da612835693 | 53 | unsigned short checksum(unsigned char *p, unsigned n); |
networker |
0:7da612835693 | 54 | void getSlaveInfo(); |
networker |
0:7da612835693 | 55 | void (*cbRoboExtState)(unsigned, unsigned); |
networker |
0:7da612835693 | 56 | ftusbdevtx(); |
networker |
0:7da612835693 | 57 | ftusbdevtx(int d); |
networker |
0:7da612835693 | 58 | virtual void FtThreadInit() { |
networker |
0:7da612835693 | 59 | busy = false; |
networker |
0:7da612835693 | 60 | } |
networker |
0:7da612835693 | 61 | virtual void FtThreadBegin() ; |
networker |
0:7da612835693 | 62 | virtual void FtThreadEnd() ; |
networker |
0:7da612835693 | 63 | virtual unsigned set_baudrate(unsigned br); |
networker |
0:7da612835693 | 64 | void dump_buffer(int); |
networker |
0:7da612835693 | 65 | //unsigned set_name(unsigned index, char *name) { return send_msg(9, 1<<index, name);} |
networker |
0:7da612835693 | 66 | unsigned send_msg(unsigned cmd, unsigned set=0, bool sync = true); |
networker |
0:7da612835693 | 67 | unsigned rec_msg(); |
networker |
0:7da612835693 | 68 | unsigned rec_msg2(headerbody *hdr, unsigned net_size); |
networker |
0:7da612835693 | 69 | static void read_finished_cb(int device, int endpoint, int status, unsigned char* data, int len, void* userData); |
networker |
0:7da612835693 | 70 | static void write_finished_cb(int device, int endpoint, int status, unsigned char* data, int len, void* userData); |
networker |
0:7da612835693 | 71 | virtual int read_data(unsigned char *data, int size, USBCallback callback = 0, void* userData = 0) { return USBBulkTransfer(device, 0x82, data, size, callback, userData);} |
networker |
0:7da612835693 | 72 | virtual int write_data(unsigned char *data, int size, USBCallback callback = 0, void* userData = 0) { return USBBulkTransfer(device, 0x03, data, size, callback, userData);} |
networker |
0:7da612835693 | 73 | public: |
networker |
0:7da612835693 | 74 | virtual ~ftusbdevtx() { |
networker |
0:7da612835693 | 75 | for (int i = 0; i < TA_N_PARTS; i++) if (ta[i]) { |
networker |
0:7da612835693 | 76 | delete ta[i]; |
networker |
0:7da612835693 | 77 | ta[i]=0; |
networker |
0:7da612835693 | 78 | } |
networker |
0:7da612835693 | 79 | } |
networker |
0:7da612835693 | 80 | //public API: These functions match those of the original ftlib |
networker |
0:7da612835693 | 81 | virtual unsigned OpenFtUsbDevice(); //ftxOpenComDevice, we regard a TXC as a USB device |
networker |
0:7da612835693 | 82 | virtual unsigned CloseFtDevice(); //ftxCloseDevice, ftxCloseAllDevices (ftlibclass) |
networker |
0:7da612835693 | 83 | virtual unsigned IsFtTransferActiv(); |
networker |
0:7da612835693 | 84 | virtual unsigned GetFtFirmware() { |
networker |
0:7da612835693 | 85 | if (ta[0]) return ta[0]->info.version.firmware.abcd; |
networker |
0:7da612835693 | 86 | return 0; |
networker |
0:7da612835693 | 87 | } |
networker |
0:7da612835693 | 88 | virtual unsigned GetFtSerialNr(); |
networker |
0:7da612835693 | 89 | virtual char* GetFtManufacturerStrg() { //ftxGetManufacturerStrg |
networker |
0:7da612835693 | 90 | return strdup("MSC Vertriebs GmbH"); |
networker |
0:7da612835693 | 91 | } |
networker |
0:7da612835693 | 92 | virtual char* GetFtShortNameStrg() {//ftxGetShortNameStrg |
networker |
0:7da612835693 | 93 | return strdup("ROBO TX Controller");; |
networker |
0:7da612835693 | 94 | } |
networker |
0:7da612835693 | 95 | virtual char* GetFtLongNameStrg();//ftxGetLongNameStrg |
networker |
0:7da612835693 | 96 | virtual FT_TRANSFER_AREA* GetFtTransferAreaAddress() { |
networker |
0:7da612835693 | 97 | #ifdef COMPATIBILITY |
networker |
0:7da612835693 | 98 | if (ftdev::ta==0) ftdev::ta = new FT_TRANSFER_AREA; |
networker |
0:7da612835693 | 99 | #else |
networker |
0:7da612835693 | 100 | printf("TXC does not support Robo TA\n"); //or create a compatible copy |
networker |
0:7da612835693 | 101 | #endif |
networker |
0:7da612835693 | 102 | return ftdev::ta; |
networker |
0:7da612835693 | 103 | } |
networker |
0:7da612835693 | 104 | TA* GetFtTransferAreaAddress(int i) ; |
networker |
0:7da612835693 | 105 | virtual unsigned StartFtTransferArea(NOTIFICATION_EVENTS* sNEvent ); |
networker |
0:7da612835693 | 106 | virtual unsigned StartFtTransferAreaWithCommunication(NOTIFICATION_EVENTS* sNEvent ) { |
networker |
0:7da612835693 | 107 | return FTLIB_ERR_NOT_SUPPORTED; |
networker |
0:7da612835693 | 108 | } |
networker |
0:7da612835693 | 109 | //FtRemoteCmd |
networker |
0:7da612835693 | 110 | void SetCBRoboExtState(void(*f)(unsigned, unsigned)) { |
networker |
0:7da612835693 | 111 | cbRoboExtState = f; |
networker |
0:7da612835693 | 112 | } |
networker |
0:7da612835693 | 113 | unsigned GetRoboTxDevName(int dev, char *strbuf, int len) { |
networker |
0:7da612835693 | 114 | if (ta[dev]==0) return 0; |
networker |
0:7da612835693 | 115 | strncpy(strbuf, ta[dev]->info.device_name, len); |
networker |
0:7da612835693 | 116 | return strlen(strbuf); |
networker |
0:7da612835693 | 117 | } |
networker |
0:7da612835693 | 118 | unsigned SetRoboTxDevName(int dev, char *strbuf) { |
networker |
0:7da612835693 | 119 | if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; |
networker |
0:7da612835693 | 120 | strncpy(ta[dev]->info.device_name, strbuf, 17); |
networker |
0:7da612835693 | 121 | send_msg(9, 1<<dev); |
networker |
0:7da612835693 | 122 | return FTLIB_ERR_SUCCESS; |
networker |
0:7da612835693 | 123 | } |
networker |
0:7da612835693 | 124 | unsigned GetRoboTxBtAddr(int dev, char *strbuf, int len) { |
networker |
0:7da612835693 | 125 | if (ta[dev]==0) return 0; |
networker |
0:7da612835693 | 126 | strncpy(strbuf, ta[dev]->info.bt_addr, len); |
networker |
0:7da612835693 | 127 | return strlen(strbuf); |
networker |
0:7da612835693 | 128 | } |
networker |
0:7da612835693 | 129 | unsigned GetFirmware(int dev) { |
networker |
0:7da612835693 | 130 | if (ta[dev]==0) return 0; |
networker |
0:7da612835693 | 131 | return ta[dev]->info.version.firmware.abcd; |
networker |
0:7da612835693 | 132 | } |
networker |
0:7da612835693 | 133 | //unsigned GetRoboTxFwStr(char *strbuf, int len) { return sprintf(strbuf, "%010d", 123456789);} |
networker |
0:7da612835693 | 134 | unsigned GetRoboTxHwStr(int dev, char *strbuf, int len) { |
networker |
0:7da612835693 | 135 | if (ta[dev]==0) return 0; |
networker |
0:7da612835693 | 136 | if (len>0) { |
networker |
0:7da612835693 | 137 | *strbuf = ta[dev]->info.version.hardware.part.a; |
networker |
0:7da612835693 | 138 | return 1; |
networker |
0:7da612835693 | 139 | } else return 0; |
networker |
0:7da612835693 | 140 | } |
networker |
0:7da612835693 | 141 | unsigned GetRoboTxDllStr(int dev, char *strbuf, int len) { |
networker |
0:7da612835693 | 142 | const char *dll = dev==0 ? "2" : "0";//seems to be '2' for master and '0' for slaves, source unknown |
networker |
0:7da612835693 | 143 | strcpy(strbuf, dll); |
networker |
0:7da612835693 | 144 | return strlen(dll); |
networker |
0:7da612835693 | 145 | } |
networker |
0:7da612835693 | 146 | unsigned SetOutCounterReset(int dev, unsigned cnt) { |
networker |
0:7da612835693 | 147 | if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; |
networker |
0:7da612835693 | 148 | if (cnt >= N_CNT) return -1; |
networker |
0:7da612835693 | 149 | ta[dev]->output.cnt_reset[cnt] = true; |
networker |
0:7da612835693 | 150 | return FTLIB_ERR_SUCCESS; |
networker |
0:7da612835693 | 151 | } |
networker |
0:7da612835693 | 152 | unsigned SetOutMotorValues(int dev, unsigned mId, float speed) { |
networker |
0:7da612835693 | 153 | int dutyp = 0, dutym = 0; |
networker |
0:7da612835693 | 154 | if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; |
networker |
0:7da612835693 | 155 | if (mId >= N_MOTOR) return -1; |
networker |
0:7da612835693 | 156 | if (speed >= 1) dutyp = 512; |
networker |
0:7da612835693 | 157 | else if (speed >= 0) dutyp = 512*speed; |
networker |
0:7da612835693 | 158 | else if (speed <= -1) dutym = 512; |
networker |
0:7da612835693 | 159 | else dutym = 512*speed; |
networker |
0:7da612835693 | 160 | ta[dev]->output.duty[mId<<1] = dutym; |
networker |
0:7da612835693 | 161 | ta[dev]->output.duty[(mId<<1)+1] = dutyp; |
networker |
0:7da612835693 | 162 | return FTLIB_ERR_SUCCESS; |
networker |
0:7da612835693 | 163 | } |
networker |
0:7da612835693 | 164 | unsigned SetOutPwmValues(int dev, unsigned mId, float speed) { |
networker |
0:7da612835693 | 165 | int duty = 0; |
networker |
0:7da612835693 | 166 | if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; |
networker |
0:7da612835693 | 167 | if (mId >= N_PWM_CHAN) return -1; |
networker |
0:7da612835693 | 168 | if (speed >= 1) duty = 512; |
networker |
0:7da612835693 | 169 | else if (speed >= 0) duty = 512*speed; |
networker |
0:7da612835693 | 170 | ta[dev]->output.duty[mId] = duty; |
networker |
0:7da612835693 | 171 | return FTLIB_ERR_SUCCESS; |
networker |
0:7da612835693 | 172 | } |
networker |
0:7da612835693 | 173 | //SetFtUniConfig |
networker |
0:7da612835693 | 174 | //SetFtCntConfig |
networker |
0:7da612835693 | 175 | //SetMotorExConfig |
networker |
0:7da612835693 | 176 | //StopMotorExConfig |
networker |
0:7da612835693 | 177 | //ResetMotorExConfig |
networker |
0:7da612835693 | 178 | //SetCBMotorExReached |
networker |
0:7da612835693 | 179 | //GetInIOValue |
networker |
0:7da612835693 | 180 | //GetInCounterValue |
networker |
0:7da612835693 | 181 | //GetInDisplayButtonValue |
networker |
0:7da612835693 | 182 | //SetRoboTxMessage |
networker |
0:7da612835693 | 183 | }; |
networker |
0:7da612835693 | 184 | |
networker |
0:7da612835693 | 185 | #endif |
networker |
0:7da612835693 | 186 | |
networker |
0:7da612835693 | 187 | #if 0 |
networker |
0:7da612835693 | 188 | class ta_txc: private TA { |
networker |
0:7da612835693 | 189 | public: |
networker |
0:7da612835693 | 190 | unsigned GetRoboTxDevName(char *strbuf, int len) { |
networker |
0:7da612835693 | 191 | strncpy(strbuf, info.device_name, len); |
networker |
0:7da612835693 | 192 | return strlen(info.device_name); |
networker |
0:7da612835693 | 193 | } |
networker |
0:7da612835693 | 194 | unsigned SetRoboTxDevName(char *strbuf); |
networker |
0:7da612835693 | 195 | unsigned GetRoboTxBtAddr(char *strbuf, int len) { |
networker |
0:7da612835693 | 196 | strncpy(strbuf, info.bt_addr, len); |
networker |
0:7da612835693 | 197 | return strlen(info.bt_addr); |
networker |
0:7da612835693 | 198 | } |
networker |
0:7da612835693 | 199 | unsigned GetRoboTxFwVal(unsigned *buf) { |
networker |
0:7da612835693 | 200 | *buf = info.version.firmware.abcd; |
networker |
0:7da612835693 | 201 | return 0; |
networker |
0:7da612835693 | 202 | } |
networker |
0:7da612835693 | 203 | //unsigned GetRoboTxFwStr(char *strbuf, int len) { return sprintf(strbuf, "%010d", 123456789);} |
networker |
0:7da612835693 | 204 | unsigned GetRoboTxHwStr(char *strbuf, int len) { |
networker |
0:7da612835693 | 205 | if (len>0) { |
networker |
0:7da612835693 | 206 | *strbuf = info.version.hardware.part.a; |
networker |
0:7da612835693 | 207 | return 1; |
networker |
0:7da612835693 | 208 | } else return 0; |
networker |
0:7da612835693 | 209 | } |
networker |
0:7da612835693 | 210 | unsigned GetRoboTxDllStr(char *strbuf, int len) { |
networker |
0:7da612835693 | 211 | char *dll ="0"; |
networker |
0:7da612835693 | 212 | strcpy(strbuf, dll); |
networker |
0:7da612835693 | 213 | return strlen(dll); |
networker |
0:7da612835693 | 214 | } |
networker |
0:7da612835693 | 215 | //SetOutCounterReset |
networker |
0:7da612835693 | 216 | //SetOutMotorValues |
networker |
0:7da612835693 | 217 | //SetOutPwmValues |
networker |
0:7da612835693 | 218 | //SetFtUniConfig |
networker |
0:7da612835693 | 219 | //SetFtCntConfig |
networker |
0:7da612835693 | 220 | //SetMotorExConfig |
networker |
0:7da612835693 | 221 | //StopMotorExConfig |
networker |
0:7da612835693 | 222 | //ResetMotorExConfig |
networker |
0:7da612835693 | 223 | //SetCBMotorExReached |
networker |
0:7da612835693 | 224 | //GetInIOValue |
networker |
0:7da612835693 | 225 | //GetInCounterValue |
networker |
0:7da612835693 | 226 | //GetInDisplayButtonValue |
networker |
0:7da612835693 | 227 | //SetRoboTxMessage |
networker |
0:7da612835693 | 228 | }; |
networker |
0:7da612835693 | 229 | |
networker |
0:7da612835693 | 230 | class ftusbdevtx; |
networker |
0:7da612835693 | 231 | class ftdevtxslave { |
networker |
0:7da612835693 | 232 | ftusbdevtx *mstr; |
networker |
0:7da612835693 | 233 | int dev; |
networker |
0:7da612835693 | 234 | //protected: |
networker |
0:7da612835693 | 235 | ftdevtxslave() {} |
networker |
0:7da612835693 | 236 | ftdevtxslave(int d); |
networker |
0:7da612835693 | 237 | //unsigned set_name(unsigned index, char *name) { return send_msg(9, 1<<index, name);} |
networker |
0:7da612835693 | 238 | public: |
networker |
0:7da612835693 | 239 | virtual ~ftdevtxslave() { } |
networker |
0:7da612835693 | 240 | //public API: These functions match those of the original ftlib |
networker |
0:7da612835693 | 241 | virtual unsigned GetFtFirmware() { |
networker |
0:7da612835693 | 242 | if (ta[0]) return ta[0]->info.version.firmware.abcd; |
networker |
0:7da612835693 | 243 | return 0; |
networker |
0:7da612835693 | 244 | } |
networker |
0:7da612835693 | 245 | virtual unsigned GetFtSerialNr(); |
networker |
0:7da612835693 | 246 | virtual char* GetFtManufacturerStrg() { //ftxGetManufacturerStrg |
networker |
0:7da612835693 | 247 | return strdup("MSC Vertriebs GmbH"); |
networker |
0:7da612835693 | 248 | } |
networker |
0:7da612835693 | 249 | virtual char* GetFtShortNameStrg() {//ftxGetShortNameStrg |
networker |
0:7da612835693 | 250 | return GetFtLongNameStrg(); |
networker |
0:7da612835693 | 251 | } |
networker |
0:7da612835693 | 252 | virtual char* GetFtLongNameStrg();//ftxGetLongNameStrg |
networker |
0:7da612835693 | 253 | virtual FT_TRANSFER_AREA* GetFtTransferAreaAddress() { |
networker |
0:7da612835693 | 254 | #ifdef COMPATIBILITY |
networker |
0:7da612835693 | 255 | if (ftdev::ta==0) ftdev::ta = new FT_TRANSFER_AREA; |
networker |
0:7da612835693 | 256 | #else |
networker |
0:7da612835693 | 257 | printf("TXC does not support Robo TA\n"); //or create a compatible copy |
networker |
0:7da612835693 | 258 | #endif |
networker |
0:7da612835693 | 259 | return ftdev::ta; |
networker |
0:7da612835693 | 260 | } |
networker |
0:7da612835693 | 261 | TA* GetFtTransferAreaAddress(int i) ; |
networker |
0:7da612835693 | 262 | //SetOutCounterReset |
networker |
0:7da612835693 | 263 | unsigned SetOutMotorValues(int mId, float speed) { |
networker |
0:7da612835693 | 264 | return mstr->SetOutMotorValues(dev, mId, speed); |
networker |
0:7da612835693 | 265 | } |
networker |
0:7da612835693 | 266 | //SetOutPwmValues |
networker |
0:7da612835693 | 267 | //SetFtUniConfig |
networker |
0:7da612835693 | 268 | //SetFtCntConfig |
networker |
0:7da612835693 | 269 | //SetMotorExConfig |
networker |
0:7da612835693 | 270 | //StopMotorExConfig |
networker |
0:7da612835693 | 271 | //ResetMotorExConfig |
networker |
0:7da612835693 | 272 | //SetCBMotorExReached |
networker |
0:7da612835693 | 273 | //GetInIOValue |
networker |
0:7da612835693 | 274 | //GetInCounterValue |
networker |
0:7da612835693 | 275 | //GetInDisplayButtonValue |
networker |
0:7da612835693 | 276 | //SetRoboTxMessage |
networker |
0:7da612835693 | 277 | }; |
networker |
0:7da612835693 | 278 | |
networker |
0:7da612835693 | 279 | #endif |