class library to access fischertechnik interfaces via USB

Dependencies:   FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp

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?

UserRevisionLine numberNew 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