ATP3011 is text speech LSI by AquesTalk pico. This librarry supports I2C interface and "printf()" C format. If ATP3011 talk number or alphabet you select printf(), otherwise, you have to use speech(). When you use printf(), the string must have "\n".
Diff: ATP3011.cpp
- Revision:
- 0:f4577c59b4f5
- Child:
- 1:18e2be0c89a4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ATP3011.cpp Mon Sep 14 06:46:02 2015 +0000 @@ -0,0 +1,134 @@ +#include "ATP3011.h" + +const int ATP3011::SUCCESS= 10; +const int ATP3011::READY= 11; +const int ATP3011::BUSY= 12; +const int ATP3011::TIME_OUT= 13; +const int ATP3011::ERR_I2C= 20; +const int ATP3011::ERR_OTHER= 21; +const int ATP3011::ERR_TooLeng= 22; + +ATP3011::ATP3011(PinName sda, PinName scl, char _addr) + : i2c(sda, scl) +{ + this->init(_addr); +} + +ATP3011::ATP3011(I2C &_i2c, char _addr) + : i2c(_i2c) +{ + this->init(_addr); +} + +void ATP3011::init(char _addr) +{ + this->addr= _addr; + this->timer.reset(); + this->timer.start(); + this->initChar(); + return; +} + +void ATP3011::initChar() +{ + for(int i= 0; i < MAX_CHAR; i++) + this->chr[i]= 0x00; + return; +} + +int ATP3011::_putc(int val) // for printf() +{ + int idx= strlen(chr); + if(idx > MAX_CHAR-4) { + this->initChar(); + return val; + } + + if(val == '\n') { + chr[idx]= '\r'; + chr[idx+1]= 0x00; + this->send(); + } else { + chr[idx]= val; + } + + return val; +} + +int ATP3011::speach(const char *msg, int timeout_ms) +{ + if(strlen(msg) > MAX_CHAR-4) + return this->ERR_TooLeng; + + // copy message. + int idx= 0; + for(idx= 0; idx < MAX_CHAR-2; idx++) { + chr[idx]= msg[idx]; + if(msg[idx] == 0x00) + break; + } + + // string adj. // there, send[idx] == 0x00 +// if(send[idx-1] == '\r') char: 0 ~ idx-1 -> length= idx + if(chr[idx-1] != '\r') { // ex. "." + chr[idx]= '\r'; + chr[idx+1]= 0x00; + } + + int status= this->send(timeout_ms); + return status; +} + +int ATP3011::send(int timeout_ms) +{ + int status; + Timer tmpTimer; + tmpTimer.reset(); + tmpTimer.start(); + while(1) { + status= this->chkBusy(); + if(status == this->ERR_I2C) + return this->ERR_I2C; + if(status == this->READY) + break; + // loop; busy or other response. + if(timeout_ms!=0 && tmpTimer.read_ms()>timeout_ms) + return this->TIME_OUT; + } + + status= i2c.write(addr, chr, strlen(chr)); + this->initChar(); + timer.reset(); + if(status != 0) + return this->ERR_I2C; + return this->SUCCESS; +} + + +int ATP3011::chkBusy() +{ + int wait_time= 10- timer.read_ms(); + if(wait_time > 0) + wait_ms(wait_time); + + char c= 0x00; + int status= i2c.read(addr+0x01, &c, 1); + this->timer.reset(); + if(status != 0) + return this->ERR_I2C; + if(c == '>') + return this->READY; + if(c=='*' || c==0xff) + return this->BUSY; + + return this->ERR_OTHER; +} + + +int ATP3011::_getc() +{ + return -1; +} + + +// EOF \ No newline at end of file