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".

Committer:
AkinoriHashimoto
Date:
Mon Oct 19 02:53:39 2015 +0000
Revision:
1:18e2be0c89a4
Parent:
0:f4577c59b4f5
Adj. miss spell.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AkinoriHashimoto 0:f4577c59b4f5 1 #include "ATP3011.h"
AkinoriHashimoto 0:f4577c59b4f5 2
AkinoriHashimoto 0:f4577c59b4f5 3 const int ATP3011::SUCCESS= 10;
AkinoriHashimoto 0:f4577c59b4f5 4 const int ATP3011::READY= 11;
AkinoriHashimoto 0:f4577c59b4f5 5 const int ATP3011::BUSY= 12;
AkinoriHashimoto 0:f4577c59b4f5 6 const int ATP3011::TIME_OUT= 13;
AkinoriHashimoto 0:f4577c59b4f5 7 const int ATP3011::ERR_I2C= 20;
AkinoriHashimoto 0:f4577c59b4f5 8 const int ATP3011::ERR_OTHER= 21;
AkinoriHashimoto 0:f4577c59b4f5 9 const int ATP3011::ERR_TooLeng= 22;
AkinoriHashimoto 0:f4577c59b4f5 10
AkinoriHashimoto 0:f4577c59b4f5 11 ATP3011::ATP3011(PinName sda, PinName scl, char _addr)
AkinoriHashimoto 0:f4577c59b4f5 12 : i2c(sda, scl)
AkinoriHashimoto 0:f4577c59b4f5 13 {
AkinoriHashimoto 0:f4577c59b4f5 14 this->init(_addr);
AkinoriHashimoto 0:f4577c59b4f5 15 }
AkinoriHashimoto 0:f4577c59b4f5 16
AkinoriHashimoto 0:f4577c59b4f5 17 ATP3011::ATP3011(I2C &_i2c, char _addr)
AkinoriHashimoto 0:f4577c59b4f5 18 : i2c(_i2c)
AkinoriHashimoto 0:f4577c59b4f5 19 {
AkinoriHashimoto 0:f4577c59b4f5 20 this->init(_addr);
AkinoriHashimoto 0:f4577c59b4f5 21 }
AkinoriHashimoto 0:f4577c59b4f5 22
AkinoriHashimoto 0:f4577c59b4f5 23 void ATP3011::init(char _addr)
AkinoriHashimoto 0:f4577c59b4f5 24 {
AkinoriHashimoto 0:f4577c59b4f5 25 this->addr= _addr;
AkinoriHashimoto 0:f4577c59b4f5 26 this->timer.reset();
AkinoriHashimoto 0:f4577c59b4f5 27 this->timer.start();
AkinoriHashimoto 0:f4577c59b4f5 28 this->initChar();
AkinoriHashimoto 0:f4577c59b4f5 29 return;
AkinoriHashimoto 0:f4577c59b4f5 30 }
AkinoriHashimoto 0:f4577c59b4f5 31
AkinoriHashimoto 0:f4577c59b4f5 32 void ATP3011::initChar()
AkinoriHashimoto 0:f4577c59b4f5 33 {
AkinoriHashimoto 0:f4577c59b4f5 34 for(int i= 0; i < MAX_CHAR; i++)
AkinoriHashimoto 0:f4577c59b4f5 35 this->chr[i]= 0x00;
AkinoriHashimoto 0:f4577c59b4f5 36 return;
AkinoriHashimoto 0:f4577c59b4f5 37 }
AkinoriHashimoto 0:f4577c59b4f5 38
AkinoriHashimoto 0:f4577c59b4f5 39 int ATP3011::_putc(int val) // for printf()
AkinoriHashimoto 0:f4577c59b4f5 40 {
AkinoriHashimoto 0:f4577c59b4f5 41 int idx= strlen(chr);
AkinoriHashimoto 0:f4577c59b4f5 42 if(idx > MAX_CHAR-4) {
AkinoriHashimoto 0:f4577c59b4f5 43 this->initChar();
AkinoriHashimoto 0:f4577c59b4f5 44 return val;
AkinoriHashimoto 0:f4577c59b4f5 45 }
AkinoriHashimoto 0:f4577c59b4f5 46
AkinoriHashimoto 0:f4577c59b4f5 47 if(val == '\n') {
AkinoriHashimoto 0:f4577c59b4f5 48 chr[idx]= '\r';
AkinoriHashimoto 0:f4577c59b4f5 49 chr[idx+1]= 0x00;
AkinoriHashimoto 0:f4577c59b4f5 50 this->send();
AkinoriHashimoto 0:f4577c59b4f5 51 } else {
AkinoriHashimoto 0:f4577c59b4f5 52 chr[idx]= val;
AkinoriHashimoto 0:f4577c59b4f5 53 }
AkinoriHashimoto 0:f4577c59b4f5 54
AkinoriHashimoto 0:f4577c59b4f5 55 return val;
AkinoriHashimoto 0:f4577c59b4f5 56 }
AkinoriHashimoto 0:f4577c59b4f5 57
AkinoriHashimoto 1:18e2be0c89a4 58 int ATP3011::speech(const char *msg, int timeout_ms)
AkinoriHashimoto 0:f4577c59b4f5 59 {
AkinoriHashimoto 0:f4577c59b4f5 60 if(strlen(msg) > MAX_CHAR-4)
AkinoriHashimoto 0:f4577c59b4f5 61 return this->ERR_TooLeng;
AkinoriHashimoto 0:f4577c59b4f5 62
AkinoriHashimoto 0:f4577c59b4f5 63 // copy message.
AkinoriHashimoto 0:f4577c59b4f5 64 int idx= 0;
AkinoriHashimoto 0:f4577c59b4f5 65 for(idx= 0; idx < MAX_CHAR-2; idx++) {
AkinoriHashimoto 0:f4577c59b4f5 66 chr[idx]= msg[idx];
AkinoriHashimoto 0:f4577c59b4f5 67 if(msg[idx] == 0x00)
AkinoriHashimoto 0:f4577c59b4f5 68 break;
AkinoriHashimoto 0:f4577c59b4f5 69 }
AkinoriHashimoto 0:f4577c59b4f5 70
AkinoriHashimoto 0:f4577c59b4f5 71 // string adj. // there, send[idx] == 0x00
AkinoriHashimoto 0:f4577c59b4f5 72 // if(send[idx-1] == '\r') char: 0 ~ idx-1 -> length= idx
AkinoriHashimoto 0:f4577c59b4f5 73 if(chr[idx-1] != '\r') { // ex. "."
AkinoriHashimoto 0:f4577c59b4f5 74 chr[idx]= '\r';
AkinoriHashimoto 0:f4577c59b4f5 75 chr[idx+1]= 0x00;
AkinoriHashimoto 0:f4577c59b4f5 76 }
AkinoriHashimoto 0:f4577c59b4f5 77
AkinoriHashimoto 0:f4577c59b4f5 78 int status= this->send(timeout_ms);
AkinoriHashimoto 0:f4577c59b4f5 79 return status;
AkinoriHashimoto 0:f4577c59b4f5 80 }
AkinoriHashimoto 0:f4577c59b4f5 81
AkinoriHashimoto 0:f4577c59b4f5 82 int ATP3011::send(int timeout_ms)
AkinoriHashimoto 0:f4577c59b4f5 83 {
AkinoriHashimoto 0:f4577c59b4f5 84 int status;
AkinoriHashimoto 0:f4577c59b4f5 85 Timer tmpTimer;
AkinoriHashimoto 0:f4577c59b4f5 86 tmpTimer.reset();
AkinoriHashimoto 0:f4577c59b4f5 87 tmpTimer.start();
AkinoriHashimoto 1:18e2be0c89a4 88 while(true) {
AkinoriHashimoto 0:f4577c59b4f5 89 status= this->chkBusy();
AkinoriHashimoto 0:f4577c59b4f5 90 if(status == this->ERR_I2C)
AkinoriHashimoto 0:f4577c59b4f5 91 return this->ERR_I2C;
AkinoriHashimoto 0:f4577c59b4f5 92 if(status == this->READY)
AkinoriHashimoto 0:f4577c59b4f5 93 break;
AkinoriHashimoto 0:f4577c59b4f5 94 // loop; busy or other response.
AkinoriHashimoto 0:f4577c59b4f5 95 if(timeout_ms!=0 && tmpTimer.read_ms()>timeout_ms)
AkinoriHashimoto 0:f4577c59b4f5 96 return this->TIME_OUT;
AkinoriHashimoto 0:f4577c59b4f5 97 }
AkinoriHashimoto 0:f4577c59b4f5 98
AkinoriHashimoto 0:f4577c59b4f5 99 status= i2c.write(addr, chr, strlen(chr));
AkinoriHashimoto 0:f4577c59b4f5 100 this->initChar();
AkinoriHashimoto 0:f4577c59b4f5 101 timer.reset();
AkinoriHashimoto 0:f4577c59b4f5 102 if(status != 0)
AkinoriHashimoto 0:f4577c59b4f5 103 return this->ERR_I2C;
AkinoriHashimoto 0:f4577c59b4f5 104 return this->SUCCESS;
AkinoriHashimoto 0:f4577c59b4f5 105 }
AkinoriHashimoto 0:f4577c59b4f5 106
AkinoriHashimoto 0:f4577c59b4f5 107
AkinoriHashimoto 0:f4577c59b4f5 108 int ATP3011::chkBusy()
AkinoriHashimoto 0:f4577c59b4f5 109 {
AkinoriHashimoto 0:f4577c59b4f5 110 int wait_time= 10- timer.read_ms();
AkinoriHashimoto 0:f4577c59b4f5 111 if(wait_time > 0)
AkinoriHashimoto 0:f4577c59b4f5 112 wait_ms(wait_time);
AkinoriHashimoto 0:f4577c59b4f5 113
AkinoriHashimoto 0:f4577c59b4f5 114 char c= 0x00;
AkinoriHashimoto 0:f4577c59b4f5 115 int status= i2c.read(addr+0x01, &c, 1);
AkinoriHashimoto 0:f4577c59b4f5 116 this->timer.reset();
AkinoriHashimoto 0:f4577c59b4f5 117 if(status != 0)
AkinoriHashimoto 0:f4577c59b4f5 118 return this->ERR_I2C;
AkinoriHashimoto 0:f4577c59b4f5 119 if(c == '>')
AkinoriHashimoto 0:f4577c59b4f5 120 return this->READY;
AkinoriHashimoto 0:f4577c59b4f5 121 if(c=='*' || c==0xff)
AkinoriHashimoto 0:f4577c59b4f5 122 return this->BUSY;
AkinoriHashimoto 0:f4577c59b4f5 123
AkinoriHashimoto 0:f4577c59b4f5 124 return this->ERR_OTHER;
AkinoriHashimoto 0:f4577c59b4f5 125 }
AkinoriHashimoto 0:f4577c59b4f5 126
AkinoriHashimoto 0:f4577c59b4f5 127
AkinoriHashimoto 0:f4577c59b4f5 128 int ATP3011::_getc()
AkinoriHashimoto 0:f4577c59b4f5 129 {
AkinoriHashimoto 0:f4577c59b4f5 130 return -1;
AkinoriHashimoto 0:f4577c59b4f5 131 }
AkinoriHashimoto 0:f4577c59b4f5 132
AkinoriHashimoto 0:f4577c59b4f5 133
AkinoriHashimoto 0:f4577c59b4f5 134 // EOF