BlackOneとAndroidの連携デモプログラム AndroidAccessoryを改造してBlackOneとAndroidが連携できるようにしました。 サポートしているのは、デモアプリの ”Buttons” B1-SW1, B2-SW2, B3-SW3 ”LED2” RGB-LED のみです。 LCDに表示するイメージをマイクロSDカードに入れてLCDのソケットに挿入しておく必要があります。 イメージは、320X240ドットで”\Image”という名前のフォルダの直下に”10.jpg”という名前で入れてください。
ADK.cpp
- Committer:
- techand
- Date:
- 2011-12-23
- Revision:
- 0:7b556109fd46
File content as of revision 0:7b556109fd46:
#include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include "USBHost.h" #include "Utils.h" #include "ps3.h" #include "ADK.h" #include "mbed.h" //#define ADKLOG 1 #define ADKLOG 0 #if ADKLOG #define LOG(...) printf(__VA_ARGS__) #define Log(...) printf(__VA_ARGS__) #define log(...) printf(__VA_ARGS__) #else #define LOG(...) do {} while(0) #define Log(...) do {} while(0) #define log(...) do {} while(0) #endif PwmOut red1(p26); PwmOut gren1(p24); PwmOut blue1(p25); PwmOut red2(p22); PwmOut gren2(p23); PwmOut blue2(p21); PwmOut led1(LED1); PwmOut led2(LED2); PwmOut led3(LED3); PwmOut led4(LED4); /* InterruptIn sw1(p21); InterruptIn sw2(p22); InterruptIn sw3(p23); DigitalIn sw1(p21); DigitalIn sw2(p22); DigitalIn sw3(p23); */ DigitalIn sw1(p17); DigitalIn sw2(p19); DigitalIn sw3(p20); u8 readbuff[3]; u8 writebuf[3]; //switch data backup u8 sw1b,sw2b,sw3b; void AdkUSB::setup() { sw1.mode(PullUp); sw2.mode(PullUp); sw3.mode(PullUp); sw1b=sw2b=sw3b=sw1; } void AdkUSB::loop() { log("enter loop\r\n"); u8 buf[3]; int ret=-1; //booting wait //wait(10); while (!this->_loopend) { bool w_flag=false; //wait_ms(4); buf[0]=0x01; //switch1 if (sw1!=sw1b) { log("sw1=%d\r\n",sw1.read()); buf[1]=0; buf[2]=!sw1; ret=this->write(buf,sizeof(buf)); //wait_ms(4); sw1b=sw1; w_flag=true; } //switch2 if (sw2!=sw2b) { log("sw2=%d\r\n",sw2.read()); buf[1]=1; buf[2]=!sw2; ret=this->write(buf,sizeof(buf)); //wait_ms(4); sw2b=sw2; w_flag=true; } //switch3 if (sw3!=sw3b) { log("sw3=%d\r\n",sw3.read()); buf[1]=2; buf[2]=!sw3; ret=this->write(buf,sizeof(buf)); //wait_ms(4); sw3b=sw3; w_flag=true; } if (!w_flag) { buf[0]=buf[1]=buf[2]=0; ret=this->write(buf,sizeof(buf)); } } //reset // led1=led2=led3=led4=0.0; red1=gren1=blue1=led4=0.0; red2=gren2=blue2=0.0; log("---------------------------------------------------------------loop end\r\n"); } 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); AdkUSB* t = (AdkUSB*)userData; if (status!=0) { log("loop end.\r\n"); t->loopend(); return; } // gren=((float)buf[2])/255.0; if (buf[0] == 0x2) { if (buf[1] == 0x0) { log("led1=%d\r\n",buf[2]); // led1=((float)buf[2])/255.0; gren2=((float)buf[2])/255.0; // } else if (buf[1]==0x3) { } else if (buf[1]==0x1) { // led2=((float)buf[2])/255.0; red2=((float)buf[2])/255.0; // } else if (buf[1]==0x6) { } else if (buf[1]==0x2) { // led3=((float)buf[2])/255.0; blue2=((float)buf[2])/255.0; } else if (buf[1]==0x3) { red1=((float)buf[2])/255.0; } else if (buf[1]==0x4) { blue1=((float)buf[2])/255.0; } else if (buf[1]==0x5) { gren1=((float)buf[2])/255.0; } } else if (buf[0] ==0x3) { if (buf[1] == 0x0) { led4=buf[2]? 1.0:0.0; } } USBBulkTransfer(device, endpoint , buf, len, AdkreadCallback, userData); wait_ms(4); } /* 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); AdkUSB* t = (AdkUSB*)userData; } */ int getProtocol(int device); void sendString(int device, int index, const char *str); bool 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,"Google, Inc."); sendString(device,ACCESSORY_STRING_MODEL,"DemoKit"); sendString(device,ACCESSORY_STRING_DESCRIPTION,"DemoKit Arduino Board"); sendString(device,ACCESSORY_STRING_VERSION,"1.0"); sendString(device,ACCESSORY_STRING_URI,"http://www.android.com"); sendString(device,ACCESSORY_STRING_SERIAL,"0000000012345678"); USBControlTransfer(device, HOST_TO_DEVICE |REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, ACCESSORY_START, 0,//value 0, //index 0, 0, 0, 0 ); wait_ms(400); return true; } int 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 ); //printf("return %d\r\n",data); return data; } void sendString(int device, int index, const char *str) { LOG("send_string start(%d,%d,%s) %d \r\n",device,index,str,strlen(str)+1); u8 buffer[255]; strcpy((char*)buffer,str); //thankyou curryman san USBControlTransfer(device, HOST_TO_DEVICE|REQUEST_TYPE_VENDOR|RECIPIENT_DEVICE, ACCESSORY_SEND_STRING, 0,//value index, buffer, strlen(str)+1 ); LOG("send_string end(%d,%d,%s)\r\n",device,index,str); } //int USBBulkTransfer(int device, int ep, u8* data, int length, USBCallback callback, void* userData) int AdkUSB::read(u8 *buff, int len) { int ret=USBBulkTransfer(_device,input_ep|0x80,buff,len,0,0); log("adkUSB read ret=%d \r\n",ret); return ret; } void AdkwriteCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); int AdkUSB::write(u8 *buff, int len) { log("adkUSB write ------- xxx \r\n"); int ret=USBBulkTransfer(_device,output_ep,buff,len/*,AdkwriteCallback,this*/); log("ret=%d \r\n",ret); return ret; } void AdkreadCallback(int device, int endpoint, int status, u8* buf, int len, void* userData); AdkUSB::AdkUSB(int device, int configuration, int interfaceNumber) { log("connecting Android \r\n"); _device = device; _configuration = configuration; _interfaceNumber = interfaceNumber; //for loop() _loopend=false; printf("device = %d configuration = %d interfaceNumber = %d\r\n", device, configuration, interfaceNumber); int err; u8 buffer[255]; 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 > sizeof(buffer)) { 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 int ret=USBBulkTransfer(_device,input_ep|0x80,readbuff,sizeof(readbuff),AdkreadCallback,this); log("ret=%d \r\n",ret); log("ADK Standby\r\n"); this->setup(); }