update demokit sketch to use AndroidAccessory library
Change-Id: If1c4c5e8db1be7cb15169145f90fc986a7dffe7c
diff --git a/demokit/demokit.pde b/demokit/demokit.pde
index 69e75bc..5a4d29a 100644
--- a/demokit/demokit.pde
+++ b/demokit/demokit.pde
@@ -1,23 +1,9 @@
-#include <Max3421e.h>
-#include <Usb.h>
#include <Wire.h>
#include <Servo.h>
-#define USB_ACCESSORY_VENDOR_ID 0x18D1
-#define USB_ACCESSORY_PRODUCT_ID 0x2D00
-
-#define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01
-#define ACCESSORY_STRING_MANUFACTURER 0
-#define ACCESSORY_STRING_MODEL 1
-#define ACCESSORY_STRING_DESCRIPTION 2
-#define ACCESSORY_STRING_VERSION 3
-#define ACCESSORY_STRING_URI 4
-#define ACCESSORY_STRING_SERIAL 5
-
-#define ACCESSORY_GET_PROTOCOL 51
-#define ACCESSORY_SEND_STRING 52
-#define ACCESSORY_START 53
-
+#include <Max3421e.h>
+#include <Usb.h>
+#include <AndroidAccessory.h>
#define LED3_RED 2
#define LED3_GREEN 4
@@ -51,18 +37,17 @@
#define JOY_nINT A10 // active low interrupt input
#define JOY_nRESET A11 // active low reset output
-
-MAX3421E Max;
-USB Usb;
+AndroidAccessory acc("Google, Inc.",
+ "DemoKit",
+ "DemoKit Arduino Board",
+ "1.0",
+ "http://www.android.com",
+ "0000000012345678");
Servo servos[3];
-
void setup();
void loop();
-uint8_t usbBuff[256];
-
-
void init_buttons()
{
pinMode( BUTTON1, INPUT );
@@ -111,6 +96,7 @@
void init_joystick( int threshold );
+byte b1, b2, b3, c;
void setup()
{
Serial.begin( 115200 );
@@ -129,324 +115,141 @@
servos[2].attach(SERVO3);
servos[2].write(90);
- Max.powerOn();
- delay( 200 );
+
+ b1 = digitalRead(BUTTON1);
+ b2 = digitalRead(BUTTON2);
+ b3 = digitalRead(BUTTON3);
+ c = captouched();
+
+ acc.powerOn();
}
-bool isAndroidVendor(USB_DEVICE_DESCRIPTOR *desc)
-{
- return desc->idVendor == 0x18d1 || desc->idVendor == 0x22B8;
-}
-
-bool isAccessoryDevice(USB_DEVICE_DESCRIPTOR *desc)
-{
- return desc->idProduct == 0x2D00 || desc->idProduct == 0x2D01;
-}
-
-int getProtocol(byte addr)
-{
- uint16_t protocol = -1;
- Usb.ctrlReq(addr, 0, USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE,
- ACCESSORY_GET_PROTOCOL, 0, 0, 0, 2, (char *)&protocol);
- return protocol;
-}
-
-void sendString(byte addr, int index, char *str)
-{
- Usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE,
- ACCESSORY_SEND_STRING, 0, 0, index, strlen(str) + 1, str);
-
-}
-
-bool switchDevice(byte addr)
-{
- int protocol = getProtocol(addr);
- if (protocol == 1)
- Serial.print("device supports protcol 1\n");
- else {
- Serial.print("could not read device protocol version\n");
- return false;
- }
- sendString(addr, ACCESSORY_STRING_MANUFACTURER, "Google, Inc.");
- sendString(addr, ACCESSORY_STRING_MODEL, "DemoKit");
- sendString(addr, ACCESSORY_STRING_DESCRIPTION, "DemoKit test board");
- sendString(addr, ACCESSORY_STRING_VERSION, "1.0");
- sendString(addr, ACCESSORY_STRING_URI, "http://www.android.com");
- sendString(addr, ACCESSORY_STRING_SERIAL, "0000000012345678");
-
- Usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE,
- ACCESSORY_START, 0, 0, 0, 0, NULL);
- return true;
-}
-
-bool findEndpoints(byte addr, EP_RECORD *inEp, EP_RECORD *outEp)
-{
- int len;
- byte err;
- uint8_t *p;
-
- err = Usb.getConfDescr(addr, 0, 4, 0, (char *)usbBuff);
- if (err) {
- Serial.print("Can't get config descriptor length\n");
- return false;
- }
-
- len = usbBuff[2] | ((int)usbBuff[3] << 8);
- Serial.print("Config Desc Length: ");
- Serial.println(len, DEC);
- if (len > sizeof(usbBuff)) {
- Serial.print("config descriptor too large\n");
- /* might want to truncate here */
- return false;
- }
-
- err = Usb.getConfDescr(addr, 0, len, 0, (char *)usbBuff);
- if (err) {
- Serial.print("Can't get config descriptor\n");
- return false;
- }
-
- p = usbBuff;
- inEp->epAddr = 0;
- outEp->epAddr = 0;
- while (p < (usbBuff + len)){
- uint8_t descLen = p[0];
- uint8_t descType = p[1];
- USB_ENDPOINT_DESCRIPTOR *epDesc;
- EP_RECORD *ep;
-
- switch (descType) {
- case USB_DESCRIPTOR_CONFIGURATION:
- Serial.print("config desc\n");
- break;
-
- case USB_DESCRIPTOR_INTERFACE:
- Serial.print("interface desc\n");
- break;
-
- case USB_DESCRIPTOR_ENDPOINT:
- epDesc = (USB_ENDPOINT_DESCRIPTOR *)p;
- if (!inEp->epAddr && (epDesc->bEndpointAddress & 0x80))
- ep = inEp;
- else if (!outEp->epAddr)
- ep = outEp;
- else
- ep = NULL;
-
- if (ep) {
- ep->epAddr = epDesc->bEndpointAddress & 0x7f;
- ep->Attr = epDesc->bmAttributes;
- ep->MaxPktSize = epDesc->wMaxPacketSize;
- ep->sndToggle = bmSNDTOG0;
- ep->rcvToggle = bmRCVTOG0;
- }
- break;
-
- default:
- Serial.print("unkown desc type ");
- Serial.println( descType, HEX);
- break;
- }
-
- p += descLen;
- }
-
- return inEp->epAddr && outEp->epAddr;
-}
-
-EP_RECORD ep_record[ 8 ]; //endpoint record structure for the mouse
-
-
-void doAndroid(void)
-{
- byte err;
- byte idle;
- byte b1, b2, b3, c;
- EP_RECORD inEp, outEp;
- byte count = 0;
-
- if (findEndpoints(1, &inEp, &outEp)) {
-
- ep_record[inEp.epAddr] = inEp;
- if (outEp.epAddr != inEp.epAddr)
- ep_record[outEp.epAddr] = outEp;
-
- Serial.print("inEp: ");
- Serial.println(inEp.epAddr, HEX);
- Serial.print("outEp: ");
- Serial.println(outEp.epAddr, HEX);
-
- ep_record[0] = *(Usb.getDevTableEntry(0,0));
- Usb.setDevTableEntry(1, ep_record);
-
- err = Usb.setConf( 1, 0, 1 );
- if (err)
- Serial.print("Can't set config to 1\n");
-
- Usb.setUsbTaskState( USB_STATE_RUNNING );
-
- b1 = digitalRead(BUTTON1);
- b2 = digitalRead(BUTTON2);
- b3 = digitalRead(BUTTON3);
- c = captouched();
-
- while(1) {
- int len = Usb.newInTransfer(1, inEp.epAddr, sizeof(usbBuff),
- (char *)usbBuff, 1);
- int i;
- byte b;
- byte msg[3];
- msg[0] = 0x1;
-
- if (len > 0) {
- // XXX: assumes only one command per packet
- Serial.print(usbBuff[0], HEX);
- Serial.print(":");
- Serial.print(usbBuff[1], HEX);
- Serial.print(":");
- Serial.println(usbBuff[2], HEX);
- if (usbBuff[0] == 0x2) {
- if (usbBuff[1] == 0x0)
- analogWrite( LED1_RED, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x1)
- analogWrite( LED1_GREEN, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x2)
- analogWrite( LED1_BLUE, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x3)
- analogWrite( LED2_RED, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x4)
- analogWrite( LED2_GREEN, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x5)
- analogWrite( LED2_BLUE, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x6)
- analogWrite( LED3_RED, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x7)
- analogWrite( LED3_GREEN, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x8)
- analogWrite( LED3_BLUE, 255 - usbBuff[2]);
- else if (usbBuff[1] == 0x10)
- servos[0].write(map(usbBuff[2], 0, 255, 0, 180));
- else if (usbBuff[1] == 0x11)
- servos[1].write(map(usbBuff[2], 0, 255, 0, 180));
- else if (usbBuff[1] == 0x12)
- servos[2].write(map(usbBuff[2], 0, 255, 0, 180));
- } else if (usbBuff[0] == 0x3) {
- if (usbBuff[1] == 0x0)
- digitalWrite( RELAY1, usbBuff[2] ? HIGH : LOW );
- else if (usbBuff[1] == 0x1)
- digitalWrite( RELAY2, usbBuff[2] ? HIGH : LOW );
-
- }
-
-// for (i = 0; i < len; i++)
-// Serial.print('\n');
- }
-
- b = digitalRead(BUTTON1);
- if (b != b1) {
- msg[1] = 0;
- msg[2] = b ? 0 : 1;
- Usb.outTransfer(1, outEp.epAddr, 3, (char *)msg);
- b1 = b;
- }
-
- b = digitalRead(BUTTON2);
- if (b != b2) {
- msg[1] = 1;
- msg[2] = b ? 0 : 1;
- Usb.outTransfer(1, outEp.epAddr, 3, (char *)msg);
- b2 = b;
- }
-
- b = digitalRead(BUTTON3);
- if (b != b3) {
- msg[1] = 2;
- msg[2] = b ? 0 : 1;
- Usb.outTransfer(1, outEp.epAddr, 3, (char *)msg);
- b3 = b;
- }
-
- if ((count++ % 16) == 0) {
- uint16_t val;
- int x, y;
-
- val = analogRead(TEMP_SENSOR);
- msg[0] = 0x4;
- msg[1] = val >> 8;
- msg[2] = val & 0xff;
- Usb.outTransfer(1, outEp.epAddr, 3, (char *)msg);
-
- val = analogRead(LIGHT_SENSOR);
- msg[0] = 0x5;
- msg[1] = val >> 8;
- msg[2] = val & 0xff;
- Usb.outTransfer(1, outEp.epAddr, 3, (char *)msg);
-
- read_joystick(&x, &y);
- msg[0] = 0x6;
- msg[1] = constrain(x, -128, 127);
- msg[2] = constrain(y, -128, 127);
- Usb.outTransfer(1, outEp.epAddr, 3, (char *)msg);
-
- char c0 = captouched();
- if (c0 != c) {
- msg[0] = 0x1;
- msg[1] = 3;
- msg[2] = c0 ? 0 : 1;
- Usb.outTransfer(1, outEp.epAddr, 3, (char *)msg);
- c = c0;
- }
- }
-
- delay(10);
-
- }
-
- }
-
-}
-
-
void loop()
{
- USB_DEVICE_DESCRIPTOR *devDesc = (USB_DEVICE_DESCRIPTOR *) usbBuff;
byte err;
+ byte idle;
+ static byte count = 0;
+ byte msg[3];
- Max.Task();
- Usb.Task();
- if( Usb.getUsbTaskState() >= USB_STATE_CONFIGURING ) {
- Serial.print("\nDevice addressed... ");
- Serial.print("Requesting device descriptor.");
+ if (acc.isConnected()) {
+ int len = acc.read(msg, sizeof(msg), 1);
+ int i;
+ byte b;
+ uint16_t val;
+ int x, y;
+ char c0;
- err = Usb.getDevDescr(1, 0, 0x12, (char *) devDesc);
- if (err) {
- Serial.print("\nDevice descriptor cannot be retrieved. Program Halted\n");
- while(1);
- }
+ if (len > 0) {
+ // XXX: assumes only one command per packet
+ Serial.print(msg[0], HEX);
+ Serial.print(":");
+ Serial.print(msg[1], HEX);
+ Serial.print(":");
+ Serial.println(msg[2], HEX);
+ if (msg[0] == 0x2) {
+ if (msg[1] == 0x0)
+ analogWrite( LED1_RED, 255 - msg[2]);
+ else if (msg[1] == 0x1)
+ analogWrite( LED1_GREEN, 255 - msg[2]);
+ else if (msg[1] == 0x2)
+ analogWrite( LED1_BLUE, 255 - msg[2]);
+ else if (msg[1] == 0x3)
+ analogWrite( LED2_RED, 255 - msg[2]);
+ else if (msg[1] == 0x4)
+ analogWrite( LED2_GREEN, 255 - msg[2]);
+ else if (msg[1] == 0x5)
+ analogWrite( LED2_BLUE, 255 - msg[2]);
+ else if (msg[1] == 0x6)
+ analogWrite( LED3_RED, 255 - msg[2]);
+ else if (msg[1] == 0x7)
+ analogWrite( LED3_GREEN, 255 - msg[2]);
+ else if (msg[1] == 0x8)
+ analogWrite( LED3_BLUE, 255 - msg[2]);
+ else if (msg[1] == 0x10)
+ servos[0].write(map(msg[2], 0, 255, 0, 180));
+ else if (msg[1] == 0x11)
+ servos[1].write(map(msg[2], 0, 255, 0, 180));
+ else if (msg[1] == 0x12)
+ servos[2].write(map(msg[2], 0, 255, 0, 180));
+ } else if (msg[0] == 0x3) {
+ if (msg[1] == 0x0)
+ digitalWrite( RELAY1, msg[2] ? HIGH : LOW );
+ else if (msg[1] == 0x1)
+ digitalWrite( RELAY2, msg[2] ? HIGH : LOW );
- if (isAndroidVendor(devDesc)) {
- Serial.print("found android device\n");
-
- if (isAccessoryDevice(devDesc)) {
- Serial.print("found android acessory device\n");
- doAndroid();
- } else {
- Serial.print("found possible device. swithcing to serial mode\n");
- switchDevice(1);
}
- }
-
- while (Usb.getUsbTaskState() != USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
- Max.Task();
- Usb.Task();
-
}
- Serial.print("detached\n");
+ msg[0] = 0x1;
+ b = digitalRead(BUTTON1);
+ if (b != b1) {
+ msg[1] = 0;
+ msg[2] = b ? 0 : 1;
+ acc.write(msg, 3);
+ b1 = b;
+ }
+
+ b = digitalRead(BUTTON2);
+ if (b != b2) {
+ msg[1] = 1;
+ msg[2] = b ? 0 : 1;
+ acc.write(msg, 3);
+ b2 = b;
+ }
+
+ b = digitalRead(BUTTON3);
+ if (b != b3) {
+ msg[1] = 2;
+ msg[2] = b ? 0 : 1;
+ acc.write(msg, 3);
+ b3 = b;
+ }
+
+ switch (count++ % 0x10) {
+
+ case 0:
+ val = analogRead(TEMP_SENSOR);
+ msg[0] = 0x4;
+ msg[1] = val >> 8;
+ msg[2] = val & 0xff;
+ acc.write(msg, 3);
+ break;
+
+ case 0x4:
+ val = analogRead(LIGHT_SENSOR);
+ msg[0] = 0x5;
+ msg[1] = val >> 8;
+ msg[2] = val & 0xff;
+ acc.write(msg, 3);
+ break;
+
+ case 0x8:
+ read_joystick(&x, &y);
+ msg[0] = 0x6;
+ msg[1] = constrain(x, -128, 127);
+ msg[2] = constrain(y, -128, 127);
+ acc.write(msg, 3);
+ break;
+
+#if 0
+ /* captoutched needs to be asynchonous */
+ case 0xc:
+ c0 = captouched();
+ if (c0 != c) {
+ msg[0] = 0x1;
+ msg[1] = 3;
+ msg[2] = c0 ? 0 : 1;
+ acc.write(msg, 3);
+ c = c0;
+ }
+ break;
+#endif
+ }
}
+ delay(10);
}
// ==============================================================================