class library to access fischertechnik interfaces via USB
Dependencies: FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp
ftlib/ftlibclasstxc.h
- Committer:
- networker
- Date:
- 2013-03-11
- Revision:
- 1:4676e8b9b357
- Parent:
- 0:7da612835693
File content as of revision 1:4676e8b9b357:
#ifndef FTLIBCLASSTXC_H #define FTLIBCLASSTXC_H #include "ftlibclassusb.h" #include <string.h> #include "fifo.h" #define FT_TXC 300 typedef unsigned char UINT8; typedef unsigned char BOOL8; typedef unsigned char UCHAR8; typedef unsigned short UINT16; typedef short INT16; typedef unsigned short BOOL16; typedef int INT32; typedef unsigned UINT32; //#include "ROBO_TX_FW.h" //"../PC_programming_RoboTXC_V1-2_11_Dec_2009/PC_Programming_RoboTXC/Demo_Static_Lib_C/Inc/" #include "ROBO_TX_FW_1_24.h" //"../PC_programming_RoboTXC/PC_Programming_RoboTXC/Demo_Static_Lib_C/Inc/" typedef struct { UINT32 snd, rec; UINT16 trans, session; UINT32 cmd, structs; } headerbody; typedef struct { UINT16 start; union { //the message format is HL, the native format is LH, receiver routine swaps HL to LH, send routine writes as HL UINT16 bytes; struct { UINT8 bytesH, bytesL; }/*anonymous*/; //as_bytes; UINT16 bytes; };//winavr allows anonymous structs and unions headerbody body; // UINT32 ta_id;//ta_id is normally not considered part of the header but part of the payload, it is repeated for each struct } header; typedef struct { UINT16 chksum; UCHAR8 etx; } trailer; class ftusbdevtx: public ftusbdev { friend ftusbdev; protected: typedef TA *pTA; pTA ta[TA_N_PARTS]; unsigned short tid, sid; unsigned char *buffer; fifo console; unsigned active; unsigned short checksum(unsigned char *p, unsigned n); void getSlaveInfo(); void (*cbRoboExtState)(unsigned, unsigned); ftusbdevtx(); ftusbdevtx(int d); virtual void FtThreadInit() { busy = false; } virtual void FtThreadBegin() ; virtual void FtThreadEnd() ; virtual unsigned set_baudrate(unsigned br); void dump_buffer(int); //unsigned set_name(unsigned index, char *name) { return send_msg(9, 1<<index, name);} unsigned send_msg(unsigned cmd, unsigned set=0, bool sync = true); unsigned rec_msg(); unsigned rec_msg2(headerbody *hdr, unsigned net_size); static void read_finished_cb(int device, int endpoint, int status, unsigned char* data, int len, void* userData); static void write_finished_cb(int device, int endpoint, int status, unsigned char* data, int len, void* userData); virtual int read_data(unsigned char *data, int size, USBCallback callback = 0, void* userData = 0) { return USBBulkTransfer(device, 0x82, data, size, callback, userData);} virtual int write_data(unsigned char *data, int size, USBCallback callback = 0, void* userData = 0) { return USBBulkTransfer(device, 0x03, data, size, callback, userData);} public: virtual ~ftusbdevtx() { for (int i = 0; i < TA_N_PARTS; i++) if (ta[i]) { delete ta[i]; ta[i]=0; } } //public API: These functions match those of the original ftlib virtual unsigned OpenFtUsbDevice(); //ftxOpenComDevice, we regard a TXC as a USB device virtual unsigned CloseFtDevice(); //ftxCloseDevice, ftxCloseAllDevices (ftlibclass) virtual unsigned IsFtTransferActiv(); virtual unsigned GetFtFirmware() { if (ta[0]) return ta[0]->info.version.firmware.abcd; return 0; } virtual unsigned GetFtSerialNr(); virtual char* GetFtManufacturerStrg() { //ftxGetManufacturerStrg return strdup("MSC Vertriebs GmbH"); } virtual char* GetFtShortNameStrg() {//ftxGetShortNameStrg return strdup("ROBO TX Controller");; } virtual char* GetFtLongNameStrg();//ftxGetLongNameStrg virtual FT_TRANSFER_AREA* GetFtTransferAreaAddress() { #ifdef COMPATIBILITY if (ftdev::ta==0) ftdev::ta = new FT_TRANSFER_AREA; #else printf("TXC does not support Robo TA\n"); //or create a compatible copy #endif return ftdev::ta; } TA* GetFtTransferAreaAddress(int i) ; virtual unsigned StartFtTransferArea(NOTIFICATION_EVENTS* sNEvent ); virtual unsigned StartFtTransferAreaWithCommunication(NOTIFICATION_EVENTS* sNEvent ) { return FTLIB_ERR_NOT_SUPPORTED; } //FtRemoteCmd void SetCBRoboExtState(void(*f)(unsigned, unsigned)) { cbRoboExtState = f; } unsigned GetRoboTxDevName(int dev, char *strbuf, int len) { if (ta[dev]==0) return 0; strncpy(strbuf, ta[dev]->info.device_name, len); return strlen(strbuf); } unsigned SetRoboTxDevName(int dev, char *strbuf) { if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; strncpy(ta[dev]->info.device_name, strbuf, 17); send_msg(9, 1<<dev); return FTLIB_ERR_SUCCESS; } unsigned GetRoboTxBtAddr(int dev, char *strbuf, int len) { if (ta[dev]==0) return 0; strncpy(strbuf, ta[dev]->info.bt_addr, len); return strlen(strbuf); } unsigned GetFirmware(int dev) { if (ta[dev]==0) return 0; return ta[dev]->info.version.firmware.abcd; } //unsigned GetRoboTxFwStr(char *strbuf, int len) { return sprintf(strbuf, "%010d", 123456789);} unsigned GetRoboTxHwStr(int dev, char *strbuf, int len) { if (ta[dev]==0) return 0; if (len>0) { *strbuf = ta[dev]->info.version.hardware.part.a; return 1; } else return 0; } unsigned GetRoboTxDllStr(int dev, char *strbuf, int len) { const char *dll = dev==0 ? "2" : "0";//seems to be '2' for master and '0' for slaves, source unknown strcpy(strbuf, dll); return strlen(dll); } unsigned SetOutCounterReset(int dev, unsigned cnt) { if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; if (cnt >= N_CNT) return -1; ta[dev]->output.cnt_reset[cnt] = true; return FTLIB_ERR_SUCCESS; } unsigned SetOutMotorValues(int dev, unsigned mId, float speed) { int dutyp = 0, dutym = 0; if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; if (mId >= N_MOTOR) return -1; if (speed >= 1) dutyp = 512; else if (speed >= 0) dutyp = 512*speed; else if (speed <= -1) dutym = 512; else dutym = 512*speed; ta[dev]->output.duty[mId<<1] = dutym; ta[dev]->output.duty[(mId<<1)+1] = dutyp; return FTLIB_ERR_SUCCESS; } unsigned SetOutPwmValues(int dev, unsigned mId, float speed) { int duty = 0; if (ta[dev]==0) return FTLIB_ERR_DEVICE_NOT_OPEN; if (mId >= N_PWM_CHAN) return -1; if (speed >= 1) duty = 512; else if (speed >= 0) duty = 512*speed; ta[dev]->output.duty[mId] = duty; return FTLIB_ERR_SUCCESS; } //SetFtUniConfig //SetFtCntConfig //SetMotorExConfig //StopMotorExConfig //ResetMotorExConfig //SetCBMotorExReached //GetInIOValue //GetInCounterValue //GetInDisplayButtonValue //SetRoboTxMessage }; #endif #if 0 class ta_txc: private TA { public: unsigned GetRoboTxDevName(char *strbuf, int len) { strncpy(strbuf, info.device_name, len); return strlen(info.device_name); } unsigned SetRoboTxDevName(char *strbuf); unsigned GetRoboTxBtAddr(char *strbuf, int len) { strncpy(strbuf, info.bt_addr, len); return strlen(info.bt_addr); } unsigned GetRoboTxFwVal(unsigned *buf) { *buf = info.version.firmware.abcd; return 0; } //unsigned GetRoboTxFwStr(char *strbuf, int len) { return sprintf(strbuf, "%010d", 123456789);} unsigned GetRoboTxHwStr(char *strbuf, int len) { if (len>0) { *strbuf = info.version.hardware.part.a; return 1; } else return 0; } unsigned GetRoboTxDllStr(char *strbuf, int len) { char *dll ="0"; strcpy(strbuf, dll); return strlen(dll); } //SetOutCounterReset //SetOutMotorValues //SetOutPwmValues //SetFtUniConfig //SetFtCntConfig //SetMotorExConfig //StopMotorExConfig //ResetMotorExConfig //SetCBMotorExReached //GetInIOValue //GetInCounterValue //GetInDisplayButtonValue //SetRoboTxMessage }; class ftusbdevtx; class ftdevtxslave { ftusbdevtx *mstr; int dev; //protected: ftdevtxslave() {} ftdevtxslave(int d); //unsigned set_name(unsigned index, char *name) { return send_msg(9, 1<<index, name);} public: virtual ~ftdevtxslave() { } //public API: These functions match those of the original ftlib virtual unsigned GetFtFirmware() { if (ta[0]) return ta[0]->info.version.firmware.abcd; return 0; } virtual unsigned GetFtSerialNr(); virtual char* GetFtManufacturerStrg() { //ftxGetManufacturerStrg return strdup("MSC Vertriebs GmbH"); } virtual char* GetFtShortNameStrg() {//ftxGetShortNameStrg return GetFtLongNameStrg(); } virtual char* GetFtLongNameStrg();//ftxGetLongNameStrg virtual FT_TRANSFER_AREA* GetFtTransferAreaAddress() { #ifdef COMPATIBILITY if (ftdev::ta==0) ftdev::ta = new FT_TRANSFER_AREA; #else printf("TXC does not support Robo TA\n"); //or create a compatible copy #endif return ftdev::ta; } TA* GetFtTransferAreaAddress(int i) ; //SetOutCounterReset unsigned SetOutMotorValues(int mId, float speed) { return mstr->SetOutMotorValues(dev, mId, speed); } //SetOutPwmValues //SetFtUniConfig //SetFtCntConfig //SetMotorExConfig //StopMotorExConfig //ResetMotorExConfig //SetCBMotorExReached //GetInIOValue //GetInCounterValue //GetInDisplayButtonValue //SetRoboTxMessage }; #endif