A simple mbed+Android ADK etch-a-sketch example, see cookbook
demokit.cpp
- Committer:
- p07gbar
- Date:
- 2011-08-01
- Revision:
- 0:1165b4e29af3
File content as of revision 0:1165b4e29af3:
#include "mbed.h" #include "AndroidAccessory.h" //device setup PwmOut led1(LED1); PwmOut led2(LED2); PwmOut led3(LED3); PwmOut led4(LED4); DigitalOut ind(p21); #define OUTL 100 #define INBL 100 class AdkTerm :public AndroidAccessory { public: AdkTerm():AndroidAccessory(INBL,OUTL, "ARM", "mbed", "mbed Terminal", "0.1", "http://www.mbed.org", "0000000012345678"),pc(USBTX,USBRX),Right(p19),Left(p20) {}; virtual int callbackRead(u8 *buff, int len); virtual void setupDevice(); virtual void resetDevice(); virtual int callbackWrite(); private: void serialIRQ(); void onTick(); void AttachTick(); char buffer[OUTL]; int bcount; Serial pc; AnalogIn Right; AnalogIn Left; Ticker tick; float right,left,rl,ll; int tl,tr; Timeout n; bool settick; }; void AdkTerm::setupDevice() { pc.baud(112500); pc.printf("Welcome to adkTerm\n\n\n\n\n\n\r"); settick = false; pc.attach(this, &AdkTerm::serialIRQ, Serial::RxIrq); for (int i = 0; i<OUTL; i++) { buffer[i] = 0; } bcount = 0; //n.attach(this,&AdkTerm::AttachTick,5); //tick.attach(this,&AdkTerm::onTick,0.1); } void AdkTerm::AttachTick() { if(!settick)tick.attach(this,&AdkTerm::onTick,0.04); settick = true; } void AdkTerm::onTick() { right = 1-Right; left = 1-Left; bool update = false; int templ, tempr; templ = int(left * 10000); tempr = int(right * 10000); if (abs(templ-tl)>170) { update = true; } if (abs(tempr-tr)>170) { update = true; } if (update) { u8* wbuf = _writebuff; wbuf[0] = 'P'; wbuf[1] = templ&0xFF; wbuf[2] = (templ>>8) & 0xFF; wbuf[3] = tempr&0xFF; wbuf[4] = (tempr>>8) & 0xFF; wbuf[5] = 0; this->write(wbuf,5); } } void AdkTerm::resetDevice() { pc.printf("adkTerm reset\n\r"); for (int i = 0; i<OUTL; i++) { buffer[i] = 0; } bcount = 0; } int AdkTerm::callbackRead(u8 *buf, int len) { pc.printf("%i %s\n\r\n\n\n",len,buf); for (int i = 0; i<INBL; i++) { buf[i] = 0; } AttachTick(); return 0; } int AdkTerm::callbackWrite() { ind = false; return 0; } void AdkTerm::serialIRQ() { buffer[bcount] = pc.getc(); pc.putc(buffer[bcount]); if (buffer[bcount] == '\n' || buffer[bcount] == '\r') { u8* wbuf = _writebuff; for (int i = 0; i<OUTL; i++) { wbuf[i] = buffer[i]; buffer[i] = 0; } pc.printf("Sending: %s\n\r",wbuf); ind = true; this->write(wbuf,bcount); bcount = 0; } else { if (buffer[bcount] != 0x08 && buffer[bcount] != 0x7F ) { bcount++; if (bcount == OUTL) { bcount = 0; } } else { bcount--; } } } AdkTerm AdkTerm; int main() { AdkTerm.setupDevice(); printf("Android Development Kit: start\r\n"); USBInit(); while (1) { USBLoop(); } }