This program is for an autonomous robot for the competition at the Hochschule Luzern. http://cruisingcrepe.wordpress.com/ We are one of the 32 teams. http://cruisingcrepe.wordpress.com/ The postition control is based on this Documentation: Control of Wheeled Mobile Robots: An Experimental Overview from Alessandro De Luca, Giuseppe Oriolo, Marilena Vendittelli. For more information see here: http://www.dis.uniroma1.it/~labrob/pub/papers/Ramsete01.pdf
Fork of autonomous Robot Android by
Diff: Android/AndroidAccessory/AndroidAccessory.cpp
- Revision:
- 12:235e318a414f
- Parent:
- 11:775ebb69d5e1
- Child:
- 13:a7c30ee09bae
--- a/Android/AndroidAccessory/AndroidAccessory.cpp Fri Apr 05 10:58:42 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,323 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "USBHost.h" -#include "AndroidAccessory.h" -#include "mbed.h" - -AndroidAccessory* _adk; - -void AdkreadCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); -void AdkwriteCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); - - - -AndroidAccessory::AndroidAccessory(int rbuffsize,int wbuffsize, - const char* manufacturer, - const char *model, - const char *description, - const char *version, - const char *uri, - const char *serial - ) { - - _adk=this; - - this->manufacturer=manufacturer; - this->model=model; - this->description=description; - this->version=version; - this->uri=uri; - this->serial=serial; - - u32 len; - u8* p=USBGetBuffer(&len); - if (len<(rbuffsize+wbuffsize+255)) { - error("buff size too big.please resize max=%d. currentSize=%d\r\n",len,(rbuffsize+wbuffsize+255)); - } - - _readbuff=p; - _readbuffsize=rbuffsize; - p+=rbuffsize; - _writebuff=p; - _writebuffsize=wbuffsize; - p+=wbuffsize; - _strbuff=p; - p+=255; - -} - - - -int AndroidAccessory::write(u8 *buff, int len) { - log("AndroidAccessory::write "); - // __disable_irq(); - int ret=USBBulkTransfer(_device,output_ep,buff,len,AdkwriteCallback,this); - // __enable_irq(); - log("--ret=%d \r\n",ret); - return ret; -} -int AndroidAccessory::writeNC(u8 *buff, int len) { - log("AndroidAccessory::write "); - // __disable_irq(); - int ret=USBBulkTransfer(_device,output_ep,buff,len); - // __enable_irq(); - log("--ret=%d \r\n",ret); - return ret; -} - - - -int AndroidAccessory::read(u8 *buff, int len) { - // if(_initok==false)return 0; - - log("AndroidAccessory::read "); - // __disable_irq(); - int ret=USBBulkTransfer(_device,input_ep|0x80,buff,len); - // __enable_irq(); - log("--ret=%d \r\n",ret); - return ret; -} - - -void AndroidAccessory::init(int device, int configuration, int interfaceNumber) { - - log("AndroidAccessory::init \r\n"); - -// _initok=false; - _device = device; - _configuration = configuration; - _interfaceNumber = interfaceNumber; - printf("device = %d configuration = %d interfaceNumber = %d\r\n", device, configuration, interfaceNumber); - int err; - - u8* buffer=_strbuff; - err = GetDescriptor(_device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,4); - - if (err < 0) { - log("Failed to get descriptor\r\n"); - return; - } - - - int len = buffer[2] | (buffer[3] << 8); - if (len > 255) { - log("config descriptor too large\n"); - /* might want to truncate here */ - return; - } - err = GetDescriptor(_device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,len); - u8* p = buffer; - input_ep=0; - output_ep=0; - EndpointDescriptor *epDesc; - while (p<(buffer+len)) { - u8 descLen = p[0]; - u8 descType = p[1]; - log("descLen=%d,descType=%d\r\n",descLen,descType); - switch (descType) { - case DESCRIPTOR_TYPE_CONFIGURATION: - log("config desc\r\n"); - break; - case DESCRIPTOR_TYPE_INTERFACE: - log("interface desc\r\n"); - break; - case DESCRIPTOR_TYPE_ENDPOINT: - epDesc=(EndpointDescriptor*)p; - if (!input_ep && (epDesc->bEndpointAddress& 0x80)) { - input_ep=epDesc->bEndpointAddress& 0x7f; - //PacketSize drop - log("input Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); - - } else if (!output_ep) { - output_ep=epDesc->bEndpointAddress& 0x7f; - //PacketSize drop - log("output Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); - } else { - //other - log("non input,output Endpoint address=%d,wMaxPacketSize=%d,bmAttributes=%d\r\n",input_ep,epDesc->wMaxPacketSize,epDesc->bmAttributes); - } - break; - default: - log("unkown desc type(%d) \r\n",descType); - } - p+=descLen; - } - - if (!(input_ep && output_ep)) { - log("can't find accessory endpoints\r\n"); - return; - } - - log("SetConfiguration\r\n"); - err = SetConfiguration(device,configuration); - if (err < 0) { - log("SetConfiguration error\r\n"); - return; - } - - - log("interrupt setup\r\n"); - //interrupt setup - if (_readbuff==NULL || _readbuffsize<=0) { - error("_readbuffer error please setup buffer call setReadBuffer function\r\n"); - } - - if (IO_PENDING!=USBBulkTransfer(_device,input_ep|0x80,_readbuff,_readbuffsize,AdkreadCallback,this)) - return; - - - log("setupDevice\r\n"); - this->setupDevice(); -// _initok=true; -} - - - -bool AndroidAccessory::switchDevice(int device) { - - if (1==getProtocol(device)) { - log("device supports protocol 1\r\n"); - - } else { - log("could not read device protocol version\r\n"); - return false; - } - - - sendString(device,ACCESSORY_STRING_MANUFACTURER,manufacturer); - sendString(device,ACCESSORY_STRING_MODEL,model); - sendString(device,ACCESSORY_STRING_DESCRIPTION,description); - sendString(device,ACCESSORY_STRING_VERSION,version); - sendString(device,ACCESSORY_STRING_URI,uri); - sendString(device,ACCESSORY_STRING_SERIAL,serial); - USBControlTransfer(device, - HOST_TO_DEVICE |REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, - ACCESSORY_START, - 0,//value - 0, //index - 0, - 0, - 0, - 0 ); - - wait_ms(4); - //reset usb host - USBInit(); - - return true; - -} - - -int AndroidAccessory::getProtocol(int device) { - s16 data=-1; - USBControlTransfer(device, - DEVICE_TO_HOST|REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, - ACCESSORY_GET_PROTOCOL, - 0,//value - 0, //index - (u8*)&data, - 2, - 0, - 0 ); - return data; - -} - -void AndroidAccessory::sendString(const char *str) { - sendString(_device,1,str); - -} - -void AndroidAccessory::sendString(int device, int index, const char *str) { - - LOG("send_string start(%d,%d,%s) %d \r\n",device,index,str,strlen(str)+1); - strcpy((char*)_strbuff,str); - //thankyou curryman san - USBControlTransfer(device, - HOST_TO_DEVICE|REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, - ACCESSORY_SEND_STRING, - 0,//value - index, - _strbuff, - strlen(str)+1 - ); - - LOG("send_string end(%d,%d,%s)\r\n",device,index,str); - -} - - -/** from USBHost load function. initialize Android device**/ -void OnLoadDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc) { - printf("LoadDevice %d %02X:%02X:%02X\r\n",device,interfaceDesc->bInterfaceClass,interfaceDesc->bInterfaceSubClass,interfaceDesc->bInterfaceProtocol); - char s[128]; - - for (int i = 1; i < 3; i++) { - if (GetString(device,i,s,sizeof(s)) < 0) - break; - printf("%d: %s\r\n",i,s); - } - - //for android ADK - if ( ( deviceDesc->idVendor != 0x18D1 || - ( deviceDesc->idProduct != 0x2D00 && deviceDesc->idProduct != 0x2D01)) - &&_adk->switchDevice(device)) { - - printf(" try to change accmode.interfaceDesc->bInterfaceClass=%d\r\n",interfaceDesc->bInterfaceClass); - //1th root - //accmode_support=true; - printf("accessory mode ok.\r\n"); - return; - } - - if (deviceDesc->idVendor == 0x18D1 && - (deviceDesc->idProduct == 0x2D00 || deviceDesc->idProduct == 0x2D01)) { - //2th root - printf("connecting Android.\r\n"); - printf("idVender=%x idProduct=%x interfaceDesc->bInterfaceClass=%d\r\n",deviceDesc->idVendor,deviceDesc->idProduct,interfaceDesc->bInterfaceClass); - _adk->init(device,1,0); - //_AdkUSB.loop(); - return; - } -} - -void AdkreadCallback(int device, int endpoint, int status, u8* buf, int len, void* userData) { - log("AdkreadCallback(int device=%d, int endpoint=%x, int status=%d, u8* buf=%p, int len=%d, void* userData=%p)\r\n", - device,endpoint,status,buf,len,userData); -// __disable_irq(); - AndroidAccessory* t = (AndroidAccessory*)userData; - if (status!=0 && status!=8) { - log("adk end.\r\n"); - t->adkEnd(); -// __enable_irq(); - USBInit(); - return; - } - - - //virtual method run - t->callbackRead(buf,len); - - USBBulkTransfer(device, endpoint , buf, len, AdkreadCallback, userData); - -// wait_ms(4); -// __enable_irq(); -} - - - - -void AdkwriteCallback(int device, int endpoint, int status, u8* buf, int len, void* userData) { - - log("AdkwriteCallback(int device=%d, int endpoint=%x, int status=%d, u8* buf=%p, int len=%d, void* userData=%p)\r\n", - device,endpoint,status,buf,len,userData); - - AndroidAccessory* t = (AndroidAccessory*)userData; - t->callbackWrite(); - //wait_ms(4); - //USBBulkTransfer(device, endpoint , buf, len, AdkwriteCallback, userData); -} -