AquesTalk pico 日本語音声合成LSI ATP3011/3012 をSPIで使用するためのライブラリです。
ATP301x_SPI.cpp@1:f5e4bb173064, 2020-05-24 (annotated)
- Committer:
- hmizuno
- Date:
- Sun May 24 12:07:29 2020 +0000
- Revision:
- 1:f5e4bb173064
- Parent:
- 0:afac3f0b332e
first release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hmizuno | 0:afac3f0b332e | 1 | #include "mbed.h" |
hmizuno | 0:afac3f0b332e | 2 | #include "ATP301x_SPI.h" |
hmizuno | 0:afac3f0b332e | 3 | |
hmizuno | 0:afac3f0b332e | 4 | //public function |
hmizuno | 0:afac3f0b332e | 5 | |
hmizuno | 0:afac3f0b332e | 6 | ATP301x_SPI::ATP301x_SPI(PinName mosi, PinName miso, PinName sck, PinName ss): |
hmizuno | 0:afac3f0b332e | 7 | _spi(mosi, miso, sck), _ss(ss){ |
hmizuno | 0:afac3f0b332e | 8 | atp_initialize(); |
hmizuno | 0:afac3f0b332e | 9 | } |
hmizuno | 0:afac3f0b332e | 10 | |
hmizuno | 0:afac3f0b332e | 11 | |
hmizuno | 0:afac3f0b332e | 12 | void ATP301x_SPI::stop(){ |
hmizuno | 0:afac3f0b332e | 13 | char stop1 = '>'; |
hmizuno | 0:afac3f0b332e | 14 | int rx; |
hmizuno | 0:afac3f0b332e | 15 | |
hmizuno | 0:afac3f0b332e | 16 | //ブレークコマンド $ |
hmizuno | 0:afac3f0b332e | 17 | rx = _spi.write('$'); |
hmizuno | 0:afac3f0b332e | 18 | wait_us(SPI_SEND_PERIOD_US); |
hmizuno | 0:afac3f0b332e | 19 | |
hmizuno | 0:afac3f0b332e | 20 | //breakコマンドに対する応答”E255”がバッファに溜まってるのでダミーデータを送って">"が返ってくるまで取出す |
hmizuno | 0:afac3f0b332e | 21 | //データシート「ブレークコマンド」参照 |
hmizuno | 0:afac3f0b332e | 22 | while(rx != (int)stop1){ |
hmizuno | 0:afac3f0b332e | 23 | rx = _spi.write(0xFF); |
hmizuno | 0:afac3f0b332e | 24 | wait_us(SPI_SEND_PERIOD_US); |
hmizuno | 0:afac3f0b332e | 25 | } |
hmizuno | 0:afac3f0b332e | 26 | } |
hmizuno | 0:afac3f0b332e | 27 | |
hmizuno | 0:afac3f0b332e | 28 | |
hmizuno | 0:afac3f0b332e | 29 | //ATP301xの音声記号を受け取ってしゃべる |
hmizuno | 0:afac3f0b332e | 30 | void ATP301x_SPI::talk(char input[], bool useWait){ |
hmizuno | 0:afac3f0b332e | 31 | _ss = 0; |
hmizuno | 0:afac3f0b332e | 32 | |
hmizuno | 0:afac3f0b332e | 33 | stop(); |
hmizuno | 0:afac3f0b332e | 34 | |
hmizuno | 0:afac3f0b332e | 35 | bool tooLong = false; |
hmizuno | 0:afac3f0b332e | 36 | int i = 0; |
hmizuno | 0:afac3f0b332e | 37 | |
hmizuno | 0:afac3f0b332e | 38 | while(input[i] != 0xFF && input[i] != '\0' && input[i] != NULL){ |
hmizuno | 0:afac3f0b332e | 39 | _spi.write(input[i]); |
hmizuno | 0:afac3f0b332e | 40 | wait_us(SPI_SEND_PERIOD_US); |
hmizuno | 0:afac3f0b332e | 41 | |
hmizuno | 0:afac3f0b332e | 42 | //発音記号の終端(ピリオド)を送ったらbreak |
hmizuno | 0:afac3f0b332e | 43 | //※while終了条件に組み込むと、Whileの外で.を送ることになりチャイムが鳴らせない |
hmizuno | 0:afac3f0b332e | 44 | if(input[i] == '.'){ |
hmizuno | 0:afac3f0b332e | 45 | break; |
hmizuno | 0:afac3f0b332e | 46 | } |
hmizuno | 0:afac3f0b332e | 47 | |
hmizuno | 0:afac3f0b332e | 48 | i++; |
hmizuno | 0:afac3f0b332e | 49 | |
hmizuno | 0:afac3f0b332e | 50 | //ATP301xが受信できる最大文字数を超えたら強制終了 |
hmizuno | 0:afac3f0b332e | 51 | if(i > ATP_MAX_LEN){ |
hmizuno | 0:afac3f0b332e | 52 | tooLong = true; |
hmizuno | 0:afac3f0b332e | 53 | break; |
hmizuno | 0:afac3f0b332e | 54 | } |
hmizuno | 0:afac3f0b332e | 55 | } |
hmizuno | 0:afac3f0b332e | 56 | |
hmizuno | 0:afac3f0b332e | 57 | //ATP301xコマンドの終端を示すキャレッジリターンを送信 |
hmizuno | 0:afac3f0b332e | 58 | _spi.write('\r'); |
hmizuno | 0:afac3f0b332e | 59 | |
hmizuno | 0:afac3f0b332e | 60 | if(useWait){ |
hmizuno | 0:afac3f0b332e | 61 | atp_wait(); |
hmizuno | 0:afac3f0b332e | 62 | } |
hmizuno | 0:afac3f0b332e | 63 | |
hmizuno | 0:afac3f0b332e | 64 | _ss = 1; |
hmizuno | 0:afac3f0b332e | 65 | if(tooLong){ |
hmizuno | 0:afac3f0b332e | 66 | //音声合成「音声記号が長すぎます。」 |
hmizuno | 0:afac3f0b332e | 67 | talk("onnse-ki'go-ga/nagasugima'_su.",true); |
hmizuno | 0:afac3f0b332e | 68 | } |
hmizuno | 0:afac3f0b332e | 69 | } |
hmizuno | 0:afac3f0b332e | 70 | |
hmizuno | 0:afac3f0b332e | 71 | void ATP301x_SPI::chimeJ(bool useWait){ |
hmizuno | 0:afac3f0b332e | 72 | talk("#J", useWait); |
hmizuno | 0:afac3f0b332e | 73 | } |
hmizuno | 0:afac3f0b332e | 74 | |
hmizuno | 0:afac3f0b332e | 75 | void ATP301x_SPI::chimeK(bool useWait){ |
hmizuno | 0:afac3f0b332e | 76 | talk("#K", useWait); |
hmizuno | 0:afac3f0b332e | 77 | } |
hmizuno | 0:afac3f0b332e | 78 | |
hmizuno | 0:afac3f0b332e | 79 | //private functin |
hmizuno | 0:afac3f0b332e | 80 | |
hmizuno | 0:afac3f0b332e | 81 | void ATP301x_SPI::atp_initialize(){ |
hmizuno | 0:afac3f0b332e | 82 | _spi.format(8,3); //bit, mode |
hmizuno | 0:afac3f0b332e | 83 | _spi.frequency(SPI_CLK_HZ); |
hmizuno | 0:afac3f0b332e | 84 | } |
hmizuno | 0:afac3f0b332e | 85 | |
hmizuno | 0:afac3f0b332e | 86 | //発音完了まで別の処理をさせたくない場合にwaitでマイコン全体を止める |
hmizuno | 0:afac3f0b332e | 87 | //ダミーデータを送信し、Busyである(=発音中)ならばwait() |
hmizuno | 0:afac3f0b332e | 88 | //ATP301xに発話完了時のアクションはなく |
hmizuno | 0:afac3f0b332e | 89 | //”Ready待ちはポーリングで行う。”とデータシートに記載あり |
hmizuno | 0:afac3f0b332e | 90 | //データはシート「SPI通信」参照 |
hmizuno | 0:afac3f0b332e | 91 | void ATP301x_SPI::atp_wait(){ |
hmizuno | 0:afac3f0b332e | 92 | //Busy時の返ってくるはずのレスポンス |
hmizuno | 0:afac3f0b332e | 93 | char busyRes = '*'; |
hmizuno | 0:afac3f0b332e | 94 | int rx; |
hmizuno | 0:afac3f0b332e | 95 | |
hmizuno | 0:afac3f0b332e | 96 | //ダミーデータを送信してポーリング |
hmizuno | 0:afac3f0b332e | 97 | do{ |
hmizuno | 0:afac3f0b332e | 98 | wait_ms(POLLING_CYCLE_MS); |
hmizuno | 0:afac3f0b332e | 99 | rx = _spi.write(0xFF); |
hmizuno | 0:afac3f0b332e | 100 | }while(rx == (int)busyRes); |
hmizuno | 0:afac3f0b332e | 101 | } |
hmizuno | 0:afac3f0b332e | 102 |