iBreathe Breathalyzer can now talk thanks to the Text to Speech Click Board

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351 text_to_speak_mbed

Fork of iBreathe_Breathalyzer by Dave Clarke

Committer:
daveyclk
Date:
Fri Oct 07 20:09:39 2016 +0000
Revision:
9:fe5114551ec3
Parent:
7:5d272a0e250b
First version of the iBreathalyzer that can talk! (using Text to speech click)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daveyclk 5:a27fdb811237 1 /****************************************************************************
daveyclk 5:a27fdb811237 2 * Title : iBreathe Breathalyzer
daveyclk 9:fe5114551ec3 3 * Filename : Talking_breathalyzer
daveyclk 5:a27fdb811237 4 * Author : Dave Clarke
daveyclk 5:a27fdb811237 5 * Origin Date : 27/09/2016
daveyclk 9:fe5114551ec3 6 * Notes : Breathalyzer utilizing Hexiware, Alcohol click and
daveyclk 9:fe5114551ec3 7 Wolksense. Now with added voice thanks to the
daveyclk 9:fe5114551ec3 8 Text-To-Speech Click board
daveyclk 5:a27fdb811237 9 *****************************************************************************/
daveyclk 5:a27fdb811237 10 /**************************CHANGE LIST **************************************
daveyclk 5:a27fdb811237 11 *
daveyclk 5:a27fdb811237 12 * Date Software Version Initials Description
daveyclk 9:fe5114551ec3 13 * 07/10/16 1.0.0 DC Interface Created.
daveyclk 5:a27fdb811237 14 *
daveyclk 5:a27fdb811237 15 *****************************************************************************/
daveyclk 5:a27fdb811237 16
daveyclk 5:a27fdb811237 17 /**
daveyclk 5:a27fdb811237 18 * @page TEST_CFG Test Configurations
daveyclk 5:a27fdb811237 19 * <h3> Test configuration : </h3>
daveyclk 5:a27fdb811237 20 * @par
daveyclk 5:a27fdb811237 21 * <ul>
daveyclk 5:a27fdb811237 22 * <li><b> MCU </b> : MK64FN1M0XXX12 </li>
daveyclk 5:a27fdb811237 23 * <li><b> Dev. Board </b> : HEXIWEAR </li>
daveyclk 5:a27fdb811237 24 * <li><b> Oscillator </b> : 12 MHz external </li>
daveyclk 5:a27fdb811237 25 * <li><b> Ext. Modules </b> : Alcohol Click on mikroBUS 1 </li>
daveyclk 9:fe5114551ec3 26 * <li><b> Ext. Modules </b> : TTS Click on mikroBUS 2 </li>
daveyclk 5:a27fdb811237 27 * <li><b> SW </b> : mBed OS5 </li>
daveyclk 5:a27fdb811237 28 * </ul>
daveyclk 5:a27fdb811237 29 */
daveyclk 5:a27fdb811237 30
daveyclk 5:a27fdb811237 31 /**
daveyclk 5:a27fdb811237 32 * @mainpage
daveyclk 5:a27fdb811237 33 * <h3> Breathalyser created with HEXIWEAR and mBed OS 5 </h3>
daveyclk 5:a27fdb811237 34 * @par This will show you how much you've drunk and tell you with an Emoticon if
daveyclk 5:a27fdb811237 35 * you're too hammered to even consider driving. Using the Hexiware app the readings
daveyclk 5:a27fdb811237 36 * are transmitted to the cloud via bluetooth. Is it time to give up drinking yet?!
daveyclk 9:fe5114551ec3 37 * It now talks to you!
daveyclk 5:a27fdb811237 38
daveyclk 5:a27fdb811237 39 * <h3> Alcohol Features </h3>
daveyclk 9:fe5114551ec3 40 * @par Text to Speech Click, Alcohol click, Hexiwear docking station, Hexiware
daveyclk 5:a27fdb811237 41 */
daveyclk 5:a27fdb811237 42
daveyclk 5:a27fdb811237 43 /******************************************************************************
daveyclk 5:a27fdb811237 44 * Includes
daveyclk 5:a27fdb811237 45 *******************************************************************************/
daveyclk 5:a27fdb811237 46
khuang 0:a1af4ae04b06 47 #include "mbed.h"
daveyclk 5:a27fdb811237 48 #include "Hexi_KW40Z.h"
khuang 0:a1af4ae04b06 49 #include "Hexi_OLED_SSD1351.h"
daveyclk 5:a27fdb811237 50 #include "OLED_types.h"
daveyclk 5:a27fdb811237 51 #include "OpenSans_Font.h"
khuang 0:a1af4ae04b06 52 #include "string.h"
daveyclk 5:a27fdb811237 53 #include "iBreatheImages.h"
daveyclk 9:fe5114551ec3 54 #include "text_to_speech.h"
daveyclk 9:fe5114551ec3 55 #include "text_to_speech_hal.h"
daveyclk 9:fe5114551ec3 56 #include "text_to_speech_hw.h"
daveyclk 9:fe5114551ec3 57 #include "text_to_speech_img.h"
daveyclk 9:fe5114551ec3 58
daveyclk 5:a27fdb811237 59
daveyclk 5:a27fdb811237 60 /******************************************************************************
daveyclk 5:a27fdb811237 61 * Module Variable Definitions
daveyclk 5:a27fdb811237 62 *******************************************************************************/
daveyclk 5:a27fdb811237 63
daveyclk 5:a27fdb811237 64 #define LED_ON 0
daveyclk 5:a27fdb811237 65 #define LED_OFF 1
daveyclk 5:a27fdb811237 66
daveyclk 5:a27fdb811237 67 // Pointers to:
daveyclk 5:a27fdb811237 68 const uint8_t *welcome, // Welcome screen image
daveyclk 5:a27fdb811237 69 *blank, // blank image
daveyclk 5:a27fdb811237 70 *blow, // Start Blowing Image
daveyclk 5:a27fdb811237 71 *drink, // You've been drinking image
daveyclk 5:a27fdb811237 72 *drive, // Don't drive image
daveyclk 5:a27fdb811237 73 *hang, // You'll have a hangover image
daveyclk 5:a27fdb811237 74 *ini, // Initialising image
daveyclk 5:a27fdb811237 75 *sober; // Sober as a judge image
daveyclk 5:a27fdb811237 76
daveyclk 5:a27fdb811237 77 const float Vadc_3V3 = 0.00005035; // 16-Bit ADC step 3V3/65535 = 0.05035 mV
daveyclk 5:a27fdb811237 78
daveyclk 5:a27fdb811237 79 float Vrl = 0, // Output voltage
daveyclk 5:a27fdb811237 80 ambientAlc = 0, // Abmient Output voltage from sensor
daveyclk 5:a27fdb811237 81 SensorRes = 0, // SensorRes (Ohm) - Sensor resistance
daveyclk 5:a27fdb811237 82 SensorRes1 = 0, // SensorRes (Ohm) - Sensor resistance
daveyclk 5:a27fdb811237 83 ppm = 0, // ppm
daveyclk 5:a27fdb811237 84 ppm_1 = 0, // Ambient ppm variable
daveyclk 5:a27fdb811237 85 ratio = 0; // SensorRes/LoadRes ratio
daveyclk 5:a27fdb811237 86
daveyclk 5:a27fdb811237 87 unsigned short adc_rd = 0; //Initialise anologue read variable
daveyclk 5:a27fdb811237 88
daveyclk 5:a27fdb811237 89 const uint8_t ppmText[] = "ppm:"; // text for PPM label
daveyclk 5:a27fdb811237 90
daveyclk 5:a27fdb811237 91 char text[20], // Text array variables
daveyclk 5:a27fdb811237 92 text2[20],
daveyclk 5:a27fdb811237 93 text3[20];
daveyclk 5:a27fdb811237 94
daveyclk 5:a27fdb811237 95 float value[20], // initial sensor set up values
daveyclk 6:7f4ba36b025f 96 value1[20]; // initial sensor set up values
daveyclk 6:7f4ba36b025f 97
daveyclk 6:7f4ba36b025f 98 bool isFirstBoot = true;
daveyclk 9:fe5114551ec3 99
daveyclk 9:fe5114551ec3 100
daveyclk 9:fe5114551ec3 101 /* Indication Flags */
daveyclk 9:fe5114551ec3 102 static volatile bool _tts_rdy_f;
daveyclk 9:fe5114551ec3 103 static volatile bool _spc_rdy_f;
daveyclk 9:fe5114551ec3 104 static volatile bool _tts_fin_f;
daveyclk 9:fe5114551ec3 105 static volatile bool _spc_fin_f;
daveyclk 9:fe5114551ec3 106
daveyclk 9:fe5114551ec3 107 /* Error Buffers */
daveyclk 9:fe5114551ec3 108 static uint16_t _req_err;
daveyclk 9:fe5114551ec3 109 static uint16_t _err_code;
daveyclk 5:a27fdb811237 110
daveyclk 9:fe5114551ec3 111 /* Default Configuration */
daveyclk 9:fe5114551ec3 112 static ACONF_t _audio_conf;
daveyclk 9:fe5114551ec3 113 static TTSCONF_t _tts_conf;
daveyclk 9:fe5114551ec3 114 static PMANCONF_t _pman_conf;
daveyclk 9:fe5114551ec3 115
daveyclk 9:fe5114551ec3 116 static bool _flush_enable;
daveyclk 9:fe5114551ec3 117
daveyclk 9:fe5114551ec3 118 /* Timer flag and counter */
daveyclk 9:fe5114551ec3 119 static volatile bool _ticker_f;
daveyclk 9:fe5114551ec3 120 static volatile uint16_t _ticker;
daveyclk 9:fe5114551ec3 121
daveyclk 9:fe5114551ec3 122 /* Input and output buffers */
daveyclk 9:fe5114551ec3 123 static ISC_REQ_t _last_req;
daveyclk 9:fe5114551ec3 124 static ISC_RESP_t _last_rsp;
daveyclk 9:fe5114551ec3 125
daveyclk 9:fe5114551ec3 126 static uint8_t test[ 8 ] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
daveyclk 9:fe5114551ec3 127 int frequency = 750000;
daveyclk 9:fe5114551ec3 128 VER_t *version;
daveyclk 5:a27fdb811237 129 /******************************************************************************
daveyclk 5:a27fdb811237 130 * Function Prototypes
daveyclk 5:a27fdb811237 131 *******************************************************************************/
daveyclk 9:fe5114551ec3 132 /* Checks for indications */
daveyclk 9:fe5114551ec3 133 static int _parse_ind( void );
daveyclk 5:a27fdb811237 134
daveyclk 9:fe5114551ec3 135 /* Message block and error callback function pointers */
daveyclk 9:fe5114551ec3 136 static void ( *_fatal_err_callback )( uint16_t *err_code );
daveyclk 9:fe5114551ec3 137 static void ( *_err_callback )( uint16_t *err_code );
daveyclk 9:fe5114551ec3 138 static void ( *_msg_block_callback )( uint16_t *msg_code,
daveyclk 9:fe5114551ec3 139 uint16_t *err_code );
daveyclk 9:fe5114551ec3 140
daveyclk 9:fe5114551ec3 141 void voiceinit(void);
daveyclk 5:a27fdb811237 142 void sysinit(void);
daveyclk 5:a27fdb811237 143 void ReadSensor();
daveyclk 5:a27fdb811237 144 void CalculatePPM(int times, bool amb);
daveyclk 5:a27fdb811237 145 void ambient(int times);
daveyclk 5:a27fdb811237 146 void StartHaptic(void);
daveyclk 5:a27fdb811237 147 void StopHaptic(void const *n);
daveyclk 5:a27fdb811237 148 void ButtonUp(void);
daveyclk 5:a27fdb811237 149 void txTask(void);
daveyclk 9:fe5114551ec3 150 void fatal_err( uint16_t *err );
daveyclk 9:fe5114551ec3 151 void msg_blk( uint16_t *req, uint16_t *err );
daveyclk 5:a27fdb811237 152
daveyclk 5:a27fdb811237 153 /******************************************************************************
daveyclk 5:a27fdb811237 154 * Instance setups
daveyclk 5:a27fdb811237 155 *******************************************************************************/
daveyclk 9:fe5114551ec3 156
daveyclk 9:fe5114551ec3 157
daveyclk 6:7f4ba36b025f 158 /* Define timer for haptic feedback */
daveyclk 6:7f4ba36b025f 159 RtosTimer hapticTimer(StopHaptic, osTimerOnce);
daveyclk 6:7f4ba36b025f 160
daveyclk 6:7f4ba36b025f 161 //set up Analog read pin for alcohol sensor
daveyclk 6:7f4ba36b025f 162 AnalogIn Alcohol(PTB2);
khuang 0:a1af4ae04b06 163
daveyclk 5:a27fdb811237 164 /* Instantiate the SSD1351 OLED Driver */
daveyclk 5:a27fdb811237 165 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */
daveyclk 5:a27fdb811237 166
daveyclk 5:a27fdb811237 167 /* Get OLED Class Default Text Properties */
daveyclk 5:a27fdb811237 168 oled_text_properties_t textProperties = {0};
daveyclk 5:a27fdb811237 169
daveyclk 5:a27fdb811237 170 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
daveyclk 5:a27fdb811237 171 KW40Z kw40z_device(PTE24, PTE25);
daveyclk 5:a27fdb811237 172
daveyclk 5:a27fdb811237 173 /* LED and Haptic Set ups */
daveyclk 5:a27fdb811237 174 DigitalOut redLed(LED1);
daveyclk 5:a27fdb811237 175 DigitalOut greenLed(LED2);
daveyclk 5:a27fdb811237 176 DigitalOut blueLed(LED3);
daveyclk 5:a27fdb811237 177 DigitalOut haptic(PTB9);
daveyclk 5:a27fdb811237 178
daveyclk 9:fe5114551ec3 179 /* Instantiate the Click Text to Speech pinout */
daveyclk 9:fe5114551ec3 180 DigitalOut TTS_RST(PTB19);
daveyclk 9:fe5114551ec3 181 DigitalOut TTS_CS(PTC3);
daveyclk 9:fe5114551ec3 182 DigitalOut TTS_MUTE(PTB3);
daveyclk 9:fe5114551ec3 183 DigitalIn TTS_RDY(PTB8);
daveyclk 9:fe5114551ec3 184
daveyclk 9:fe5114551ec3 185 //Instantiate SPI for comms with Speak module
daveyclk 9:fe5114551ec3 186 SPI TextToSpeech(PTC6, PTC7, PTC5); // MOSI, MISO, SCK
daveyclk 9:fe5114551ec3 187
daveyclk 9:fe5114551ec3 188 // Debug Serial
daveyclk 9:fe5114551ec3 189 Serial pc(USBTX, USBRX);
daveyclk 9:fe5114551ec3 190
daveyclk 5:a27fdb811237 191 /******************************************************************************
daveyclk 5:a27fdb811237 192 * Bluetooth button functions and passkey function
daveyclk 5:a27fdb811237 193 *******************************************************************************/
daveyclk 5:a27fdb811237 194
daveyclk 5:a27fdb811237 195 void ButtonRight(void)
daveyclk 5:a27fdb811237 196 {
daveyclk 5:a27fdb811237 197 StartHaptic();
daveyclk 5:a27fdb811237 198 kw40z_device.ToggleAdvertisementMode();
daveyclk 5:a27fdb811237 199 blueLed = kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
daveyclk 5:a27fdb811237 200 redLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
daveyclk 5:a27fdb811237 201 greenLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
daveyclk 5:a27fdb811237 202 }
daveyclk 5:a27fdb811237 203
daveyclk 5:a27fdb811237 204 void ButtonLeft(void)
daveyclk 5:a27fdb811237 205 {
daveyclk 5:a27fdb811237 206 StartHaptic();
daveyclk 5:a27fdb811237 207 kw40z_device.ToggleAdvertisementMode();
daveyclk 5:a27fdb811237 208 blueLed = kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
daveyclk 5:a27fdb811237 209 redLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
daveyclk 5:a27fdb811237 210 greenLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
daveyclk 5:a27fdb811237 211 }
daveyclk 5:a27fdb811237 212
daveyclk 5:a27fdb811237 213 void PassKey(void)
daveyclk 5:a27fdb811237 214 {
daveyclk 5:a27fdb811237 215 StartHaptic();
daveyclk 5:a27fdb811237 216 strcpy((char *) text,"PAIR CODE");
daveyclk 5:a27fdb811237 217 oled.TextBox((uint8_t *)text,0,25,95,18);
daveyclk 5:a27fdb811237 218
daveyclk 5:a27fdb811237 219 /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */
daveyclk 5:a27fdb811237 220 sprintf(text3,"%d", kw40z_device.GetPassKey());
daveyclk 5:a27fdb811237 221 oled.TextBox((uint8_t *)text3,0,40,95,18);
daveyclk 5:a27fdb811237 222 }
daveyclk 5:a27fdb811237 223
daveyclk 5:a27fdb811237 224 /******************************************************************************
daveyclk 5:a27fdb811237 225 * Main
daveyclk 5:a27fdb811237 226 *******************************************************************************/
daveyclk 5:a27fdb811237 227 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 228 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 229 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 230 int main()
daveyclk 5:a27fdb811237 231 {
daveyclk 9:fe5114551ec3 232
daveyclk 9:fe5114551ec3 233
daveyclk 5:a27fdb811237 234 /* Set pointers to the BMPs stored in iBreatheImages.c */
daveyclk 5:a27fdb811237 235 welcome = iBreatheWS_bmp; // Welcome screen image
daveyclk 5:a27fdb811237 236 blank = iBreatheBlank_bmp; // blank image
daveyclk 5:a27fdb811237 237 blow = iBreatheBlow_bmp; // Start Blowing Image
daveyclk 5:a27fdb811237 238 drink = iBreatheDrink_bmp; // You've been drinking image
daveyclk 5:a27fdb811237 239 drive = iBreatheDrive_bmp; // Don't drive image
daveyclk 5:a27fdb811237 240 hang = iBreatheHang_bmp; // You'll have a hangover image
daveyclk 5:a27fdb811237 241 ini = iBreatheini_bmp; // Initialising image
daveyclk 5:a27fdb811237 242 sober = iBreatheSober_bmp; // Sober as a judge image
daveyclk 9:fe5114551ec3 243
daveyclk 9:fe5114551ec3 244 /* Set initial Values */
daveyclk 9:fe5114551ec3 245 sysinit();
daveyclk 9:fe5114551ec3 246
daveyclk 9:fe5114551ec3 247 /* initialise voice engine */
daveyclk 9:fe5114551ec3 248 voiceinit();
daveyclk 9:fe5114551ec3 249
daveyclk 9:fe5114551ec3 250 /* Welcome message on reset */
daveyclk 9:fe5114551ec3 251 tts_speak( "Hello, welcome to the eye brethalizer " );
daveyclk 9:fe5114551ec3 252 wait(0.5);
daveyclk 9:fe5114551ec3 253 tts_speak( "please press start. " );
daveyclk 5:a27fdb811237 254 }
daveyclk 5:a27fdb811237 255
daveyclk 5:a27fdb811237 256 /******************************************************************************
daveyclk 5:a27fdb811237 257 * Public Function Definitions
daveyclk 5:a27fdb811237 258 *******************************************************************************/
daveyclk 5:a27fdb811237 259 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 260 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 261 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 262 /**************************************************************************************************
daveyclk 5:a27fdb811237 263 * Function readSensor(void)
daveyclk 5:a27fdb811237 264 * -------------------------------------------------------------------------------------------------
daveyclk 5:a27fdb811237 265 * Overview: Read sensor
daveyclk 5:a27fdb811237 266 * Input: None
daveyclk 5:a27fdb811237 267 * Output: None
daveyclk 5:a27fdb811237 268 **************************************************************************************************/
daveyclk 5:a27fdb811237 269
daveyclk 5:a27fdb811237 270 void ReadSensor()
daveyclk 5:a27fdb811237 271 {
daveyclk 5:a27fdb811237 272 /* Read 16 Bit Analog value */
daveyclk 5:a27fdb811237 273 adc_rd = Alcohol.read_u16();
daveyclk 5:a27fdb811237 274
daveyclk 5:a27fdb811237 275 // pause 200ms
daveyclk 5:a27fdb811237 276 Thread::wait(200);
daveyclk 5:a27fdb811237 277 }
daveyclk 5:a27fdb811237 278
daveyclk 5:a27fdb811237 279 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 280 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 281 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 282 /**************************************************************************************************
daveyclk 5:a27fdb811237 283 * Function CalculatePPM(Int times, bool amb)
daveyclk 5:a27fdb811237 284 * -------------------------------------------------------------------------------------------------
daveyclk 5:a27fdb811237 285 * Overview: Calculation of PPM
daveyclk 5:a27fdb811237 286 * Input: times = Number of samples to take, amb sets either ambient reading or test reading (true for test)
daveyclk 5:a27fdb811237 287 * Output: None
daveyclk 5:a27fdb811237 288 **************************************************************************************************/
khuang 0:a1af4ae04b06 289
daveyclk 5:a27fdb811237 290 void CalculatePPM(int times, bool amb)
daveyclk 5:a27fdb811237 291 {
daveyclk 5:a27fdb811237 292 float lgPPM;
daveyclk 5:a27fdb811237 293
daveyclk 5:a27fdb811237 294 /* Read values x times */
daveyclk 5:a27fdb811237 295 for(int x = 0; x < times; x++)
daveyclk 5:a27fdb811237 296 {
daveyclk 5:a27fdb811237 297 ReadSensor();
daveyclk 5:a27fdb811237 298 value[x] = ((float)adc_rd * Vadc_3V3);
daveyclk 5:a27fdb811237 299 StartHaptic();
daveyclk 5:a27fdb811237 300 Thread::wait(50);
daveyclk 5:a27fdb811237 301 }
daveyclk 5:a27fdb811237 302
daveyclk 5:a27fdb811237 303 /* Calculate the average value for accuratcy */
daveyclk 5:a27fdb811237 304 for(int y = 0; y < times; y++)
daveyclk 5:a27fdb811237 305 {
daveyclk 5:a27fdb811237 306 Vrl += value[y];
daveyclk 5:a27fdb811237 307 }
daveyclk 5:a27fdb811237 308 Vrl = Vrl / times;
daveyclk 5:a27fdb811237 309
daveyclk 5:a27fdb811237 310 /* Set SensorRes reference value */
daveyclk 5:a27fdb811237 311 SensorRes = (Vrl / 3.3);
daveyclk 5:a27fdb811237 312
daveyclk 5:a27fdb811237 313 /* Set ratio */
daveyclk 5:a27fdb811237 314 ratio = SensorRes1 / SensorRes;
daveyclk 5:a27fdb811237 315
daveyclk 5:a27fdb811237 316 /* Convert to PPM */
daveyclk 5:a27fdb811237 317 lgPPM = ( log10( ratio ) * -1.5512 ) + 2.5911;
daveyclk 5:a27fdb811237 318
daveyclk 5:a27fdb811237 319 /* If true create test result, flase creates reference result */
daveyclk 5:a27fdb811237 320 if (amb == true)
daveyclk 5:a27fdb811237 321 {
daveyclk 5:a27fdb811237 322 ppm = pow( 10, lgPPM );
daveyclk 5:a27fdb811237 323 }
daveyclk 5:a27fdb811237 324 else
daveyclk 5:a27fdb811237 325 {
daveyclk 5:a27fdb811237 326 ppm_1 = pow( 10, lgPPM );
daveyclk 5:a27fdb811237 327 }
daveyclk 5:a27fdb811237 328 }
daveyclk 5:a27fdb811237 329
daveyclk 5:a27fdb811237 330 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 331 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 332 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 333 /**************************************************************************************************
daveyclk 5:a27fdb811237 334 * Function void ambient(int times)
daveyclk 5:a27fdb811237 335 * -------------------------------------------------------------------------------------------------
daveyclk 5:a27fdb811237 336 * Overview: Reading of the Ambient Voltgage of the sensor for reference
daveyclk 5:a27fdb811237 337 * Input: times = Number of samples to take
daveyclk 5:a27fdb811237 338 * Output: None
daveyclk 5:a27fdb811237 339 **************************************************************************************************/
daveyclk 5:a27fdb811237 340
daveyclk 5:a27fdb811237 341 void ambient(int times)
daveyclk 5:a27fdb811237 342 {
daveyclk 5:a27fdb811237 343 /* Read ambient values x times flashing green led*/
daveyclk 5:a27fdb811237 344 for(int x = 0; x < times; x++)
daveyclk 5:a27fdb811237 345 {
daveyclk 5:a27fdb811237 346 redLed = LED_OFF;
daveyclk 5:a27fdb811237 347 greenLed = LED_OFF;
daveyclk 5:a27fdb811237 348 blueLed = LED_OFF;
daveyclk 5:a27fdb811237 349
daveyclk 5:a27fdb811237 350 ReadSensor();
daveyclk 5:a27fdb811237 351 value1[x] = (float)adc_rd * Vadc_3V3;
daveyclk 5:a27fdb811237 352
daveyclk 5:a27fdb811237 353 redLed = LED_OFF;
daveyclk 5:a27fdb811237 354 greenLed = LED_ON;
daveyclk 5:a27fdb811237 355 blueLed = LED_OFF;
daveyclk 5:a27fdb811237 356 Thread::wait(48);
daveyclk 5:a27fdb811237 357 }
khuang 0:a1af4ae04b06 358
daveyclk 5:a27fdb811237 359 /* Calculate the average value for accuratcy */
daveyclk 5:a27fdb811237 360 for(int y = 0; y < times; y++)
daveyclk 5:a27fdb811237 361 {
daveyclk 5:a27fdb811237 362 ambientAlc+=value1[y];
daveyclk 5:a27fdb811237 363 }
daveyclk 5:a27fdb811237 364 ambientAlc = ambientAlc / times;
daveyclk 5:a27fdb811237 365
daveyclk 5:a27fdb811237 366 /* Set SensorRes1 reference value */
daveyclk 5:a27fdb811237 367 SensorRes1 = (ambientAlc / 3.3);
daveyclk 5:a27fdb811237 368 }
daveyclk 5:a27fdb811237 369
daveyclk 5:a27fdb811237 370 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 371 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 372 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 373 /**************************************************************************************************
daveyclk 5:a27fdb811237 374 * Function void StartHaptic(void)
daveyclk 5:a27fdb811237 375 * -------------------------------------------------------------------------------------------------
daveyclk 5:a27fdb811237 376 * Overview: Start Buzzing haptic motor
daveyclk 5:a27fdb811237 377 * Input: None
daveyclk 5:a27fdb811237 378 * Output: None
daveyclk 5:a27fdb811237 379 **************************************************************************************************/
daveyclk 5:a27fdb811237 380
daveyclk 5:a27fdb811237 381 void StartHaptic(void)
daveyclk 5:a27fdb811237 382 {
daveyclk 5:a27fdb811237 383 hapticTimer.start(50);
daveyclk 5:a27fdb811237 384 haptic = 1;
daveyclk 5:a27fdb811237 385 }
daveyclk 5:a27fdb811237 386
daveyclk 5:a27fdb811237 387 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 388 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 389 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 390 /**************************************************************************************************
daveyclk 5:a27fdb811237 391 * Function void StopHaptic(void)
daveyclk 5:a27fdb811237 392 * -------------------------------------------------------------------------------------------------
daveyclk 5:a27fdb811237 393 * Overview: Stop Buzzing haptic motor
daveyclk 5:a27fdb811237 394 * Input: None
daveyclk 5:a27fdb811237 395 * Output: None
daveyclk 5:a27fdb811237 396 **************************************************************************************************/
daveyclk 5:a27fdb811237 397
daveyclk 5:a27fdb811237 398 void StopHaptic(void const *n) {
daveyclk 5:a27fdb811237 399 haptic = 0;
daveyclk 5:a27fdb811237 400 hapticTimer.stop();
daveyclk 5:a27fdb811237 401 }
daveyclk 5:a27fdb811237 402
daveyclk 5:a27fdb811237 403 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 404 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 405 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 406 /**************************************************************************************************
daveyclk 5:a27fdb811237 407 * Function void ButtonUp(void)
daveyclk 5:a27fdb811237 408 * -------------------------------------------------------------------------------------------------
daveyclk 5:a27fdb811237 409 * Overview: Function called whe up button pressed, Begins Breathilyzer testing procedure
daveyclk 5:a27fdb811237 410 * Input: None
daveyclk 5:a27fdb811237 411 * Output: None
daveyclk 5:a27fdb811237 412 **************************************************************************************************/
khuang 0:a1af4ae04b06 413
daveyclk 5:a27fdb811237 414 void ButtonUp(void)
daveyclk 5:a27fdb811237 415 {
daveyclk 5:a27fdb811237 416 StartHaptic();
daveyclk 6:7f4ba36b025f 417
daveyclk 6:7f4ba36b025f 418 bool Ref = false;
daveyclk 6:7f4ba36b025f 419 bool Test = true;
daveyclk 5:a27fdb811237 420
daveyclk 5:a27fdb811237 421 /* LED set to green for test beginning*/
daveyclk 5:a27fdb811237 422 redLed = LED_OFF;
daveyclk 5:a27fdb811237 423 greenLed = LED_ON;
daveyclk 5:a27fdb811237 424 blueLed = LED_OFF;
daveyclk 5:a27fdb811237 425
daveyclk 5:a27fdb811237 426 /* Fill 96px by 96px Screen with 96px by 96px Initialising Image starting at x=0,y=0 */
daveyclk 5:a27fdb811237 427 oled.DrawImage(ini,0,0);
daveyclk 5:a27fdb811237 428
daveyclk 6:7f4ba36b025f 429 /* first boot bug work around to stop junk values */
daveyclk 6:7f4ba36b025f 430 if (isFirstBoot == true)
daveyclk 6:7f4ba36b025f 431 {
daveyclk 6:7f4ba36b025f 432 /*read ambient atmosphere levels with 10 samples and set flag to show it's ambient basline figure*/
daveyclk 6:7f4ba36b025f 433 ambient(1);
daveyclk 6:7f4ba36b025f 434 CalculatePPM(1,Ref);
daveyclk 6:7f4ba36b025f 435 isFirstBoot = false;
daveyclk 6:7f4ba36b025f 436 }
daveyclk 6:7f4ba36b025f 437
daveyclk 9:fe5114551ec3 438
daveyclk 5:a27fdb811237 439 /*read ambient atmosphere levels with 10 samples and set flag to show it's ambient basline figure*/
daveyclk 9:fe5114551ec3 440 tts_speak( "initializing" );
daveyclk 5:a27fdb811237 441 ambient(10);
daveyclk 6:7f4ba36b025f 442 CalculatePPM(10,Ref);
daveyclk 6:7f4ba36b025f 443
daveyclk 5:a27fdb811237 444
daveyclk 5:a27fdb811237 445 /* Fill 96px by 96px Screen with 96px by 96px Blowing Image starting at x=0,y=0 */
daveyclk 5:a27fdb811237 446 oled.DrawImage(blow,0,0);
daveyclk 9:fe5114551ec3 447 tts_speak( "please blow until buzzing stops" );
daveyclk 5:a27fdb811237 448 /*read breathe alcohol levels with 10 samples and set flag to show it's breathilyzer test figure*/
daveyclk 6:7f4ba36b025f 449 CalculatePPM(10,Test);
daveyclk 5:a27fdb811237 450
daveyclk 5:a27fdb811237 451 /*Calculate the difference in Alcohol level based on Ambient and test sample*/
daveyclk 5:a27fdb811237 452 ppm = ppm - ppm_1;
daveyclk 5:a27fdb811237 453
daveyclk 5:a27fdb811237 454 /*Throw away any values less than 0*/
daveyclk 5:a27fdb811237 455 if (ppm < 0)
daveyclk 5:a27fdb811237 456 {
daveyclk 5:a27fdb811237 457 ppm = 0;
daveyclk 5:a27fdb811237 458 }
daveyclk 5:a27fdb811237 459
daveyclk 5:a27fdb811237 460 /* Fill 96px by 96px Screen with 96px by 96px Blank Background Image starting at x=0,y=0 */
daveyclk 5:a27fdb811237 461 oled.DrawImage(blank,0,0);
daveyclk 9:fe5114551ec3 462 tts_speak( "Test Complete" );
daveyclk 9:fe5114551ec3 463 Thread::wait(500);
daveyclk 5:a27fdb811237 464 /* Show Calculated alcohol level in PPM and send data via bluetooth to the cloud */
daveyclk 5:a27fdb811237 465 oled.SetTextProperties(&textProperties);
daveyclk 5:a27fdb811237 466 oled.Label(ppmText,20,36);
daveyclk 9:fe5114551ec3 467 tts_speak( "you blew" );
daveyclk 5:a27fdb811237 468 sprintf(text,"%.2f",ppm);
daveyclk 9:fe5114551ec3 469 Thread::wait(50);
daveyclk 9:fe5114551ec3 470 tts_speak( text );
daveyclk 5:a27fdb811237 471 oled.Label((uint8_t *)text,50,36);
daveyclk 9:fe5114551ec3 472 Thread::wait(50);
daveyclk 9:fe5114551ec3 473 tts_speak( "pee pee emm" );
daveyclk 5:a27fdb811237 474 Thread::wait(1000);
daveyclk 5:a27fdb811237 475
daveyclk 5:a27fdb811237 476 /* Currently sending to the Pressure variable as a temp place holder */
daveyclk 7:5d272a0e250b 477 kw40z_device.SendiBreathe(ppm); // this is used for custom Hexiware app
daveyclk 7:5d272a0e250b 478 kw40z_device.SendPressure(ppm * 10); // using this to record on Wolksense Cloud
daveyclk 7:5d272a0e250b 479
daveyclk 5:a27fdb811237 480
daveyclk 5:a27fdb811237 481 /* You've got a Hangover coming!*/
daveyclk 5:a27fdb811237 482 if ( ppm > 200)
daveyclk 5:a27fdb811237 483 {
daveyclk 9:fe5114551ec3 484 tts_speak("you have got a hang over coming");
daveyclk 5:a27fdb811237 485 redLed = LED_ON;
daveyclk 5:a27fdb811237 486 greenLed = LED_OFF;
daveyclk 5:a27fdb811237 487 blueLed = LED_OFF;
daveyclk 5:a27fdb811237 488
daveyclk 5:a27fdb811237 489 StartHaptic();
daveyclk 5:a27fdb811237 490
daveyclk 5:a27fdb811237 491 /* Fill 96px by 96px Screen with 96px by 96px Hangover Image starting at x=0,y=0 */
daveyclk 5:a27fdb811237 492 oled.DrawImage(hang,0,0);
daveyclk 5:a27fdb811237 493 }
daveyclk 5:a27fdb811237 494
daveyclk 5:a27fdb811237 495 /* You Shouldn't drive */
daveyclk 5:a27fdb811237 496 else if (ppm < 200 && ppm > 150)
daveyclk 5:a27fdb811237 497 {
daveyclk 9:fe5114551ec3 498 tts_speak("you shouldn't drive");
daveyclk 5:a27fdb811237 499 redLed = LED_ON;
daveyclk 5:a27fdb811237 500 greenLed = LED_OFF;
daveyclk 5:a27fdb811237 501 blueLed = LED_ON;
daveyclk 5:a27fdb811237 502
daveyclk 5:a27fdb811237 503 StartHaptic();
daveyclk 5:a27fdb811237 504
daveyclk 5:a27fdb811237 505 /* Fill 96px by 96px Screen with 96px by 96px Don't Drive Image starting at x=0,y=0 */
daveyclk 5:a27fdb811237 506 oled.DrawImage(drive,0,0);
daveyclk 5:a27fdb811237 507 }
daveyclk 5:a27fdb811237 508
daveyclk 5:a27fdb811237 509 /* You've had a drink */
daveyclk 5:a27fdb811237 510 else if (ppm < 150 && ppm > 50)
daveyclk 5:a27fdb811237 511 {
daveyclk 9:fe5114551ec3 512 tts_speak("you have had a drinky");
daveyclk 5:a27fdb811237 513 redLed = LED_OFF;
daveyclk 5:a27fdb811237 514 greenLed = LED_ON;
daveyclk 5:a27fdb811237 515 blueLed = LED_ON;
daveyclk 5:a27fdb811237 516
daveyclk 5:a27fdb811237 517 StartHaptic();
daveyclk 5:a27fdb811237 518
daveyclk 5:a27fdb811237 519 /* Fill 96px by 96px Screen with 96px by 96px Had a drink Image starting at x=0,y=0 */
daveyclk 5:a27fdb811237 520 oled.DrawImage(drink,0,0);
daveyclk 5:a27fdb811237 521 }
daveyclk 5:a27fdb811237 522
daveyclk 5:a27fdb811237 523 /* Sober as a judge*/
daveyclk 5:a27fdb811237 524 else
daveyclk 5:a27fdb811237 525 {
daveyclk 9:fe5114551ec3 526 tts_speak("you are as sober as a judge");
daveyclk 5:a27fdb811237 527 redLed = LED_OFF;
daveyclk 5:a27fdb811237 528 greenLed = LED_ON;
daveyclk 5:a27fdb811237 529 blueLed = LED_OFF;
daveyclk 5:a27fdb811237 530
daveyclk 5:a27fdb811237 531 StartHaptic();
daveyclk 5:a27fdb811237 532 oled.DrawImage(sober,0,0);
daveyclk 5:a27fdb811237 533 }
daveyclk 5:a27fdb811237 534 Thread::wait(5000);
daveyclk 5:a27fdb811237 535
daveyclk 5:a27fdb811237 536 /* Go back to start screen */
daveyclk 5:a27fdb811237 537 sysinit();
daveyclk 5:a27fdb811237 538 }
daveyclk 5:a27fdb811237 539
daveyclk 5:a27fdb811237 540 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 541 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 542 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 5:a27fdb811237 543 /**************************************************************************************************
daveyclk 5:a27fdb811237 544 * Function void sysint(void)
daveyclk 5:a27fdb811237 545 * -------------------------------------------------------------------------------------------------
daveyclk 5:a27fdb811237 546 * Overview: System Initial Values Set up
daveyclk 5:a27fdb811237 547 * Input: None
daveyclk 5:a27fdb811237 548 * Output: None
daveyclk 5:a27fdb811237 549 **************************************************************************************************/
daveyclk 5:a27fdb811237 550 void sysinit(void)
daveyclk 5:a27fdb811237 551 {
daveyclk 9:fe5114551ec3 552 /* Set LED to Blue by default*/
daveyclk 5:a27fdb811237 553 redLed = LED_OFF;
daveyclk 5:a27fdb811237 554 greenLed = LED_OFF;
daveyclk 5:a27fdb811237 555 blueLed = LED_ON;
daveyclk 5:a27fdb811237 556
khuang 1:42e8e50ae4ac 557 /* Turn on the backlight of the OLED Display */
khuang 1:42e8e50ae4ac 558 oled.DimScreenON();
khuang 1:42e8e50ae4ac 559
daveyclk 5:a27fdb811237 560 /* Fill 96px by 96px Screen with 96px by 96px Welcome Image starting at x=0,y=0 */
daveyclk 5:a27fdb811237 561 oled.DrawImage(welcome,0,0);
daveyclk 5:a27fdb811237 562
daveyclk 5:a27fdb811237 563 /* Register callbacks to application functions */
daveyclk 5:a27fdb811237 564 kw40z_device.attach_buttonUp(&ButtonUp);
daveyclk 5:a27fdb811237 565 kw40z_device.attach_buttonLeft(&ButtonLeft);
daveyclk 5:a27fdb811237 566 kw40z_device.attach_buttonRight(&ButtonRight);
daveyclk 5:a27fdb811237 567 kw40z_device.attach_passkey(&PassKey);
daveyclk 5:a27fdb811237 568
daveyclk 5:a27fdb811237 569 /* Send sensor data to bluetooth */
daveyclk 5:a27fdb811237 570 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
daveyclk 5:a27fdb811237 571
daveyclk 5:a27fdb811237 572 /* Change font color to White */
daveyclk 5:a27fdb811237 573 oled.GetTextProperties(&textProperties);
daveyclk 5:a27fdb811237 574 textProperties.fontColor = COLOR_WHITE;
khuang 0:a1af4ae04b06 575 oled.SetTextProperties(&textProperties);
daveyclk 9:fe5114551ec3 576 }
daveyclk 9:fe5114551ec3 577
daveyclk 9:fe5114551ec3 578 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 579 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 580 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 581 /**************************************************************************************************
daveyclk 9:fe5114551ec3 582 * Function void voiceinit(void)
daveyclk 9:fe5114551ec3 583 * -------------------------------------------------------------------------------------------------
daveyclk 9:fe5114551ec3 584 * Overview: initialise voice engine
daveyclk 9:fe5114551ec3 585 * Input: None
daveyclk 9:fe5114551ec3 586 * Output: None
daveyclk 9:fe5114551ec3 587 **************************************************************************************************/
daveyclk 9:fe5114551ec3 588 void voiceinit(void)
daveyclk 9:fe5114551ec3 589 {
daveyclk 9:fe5114551ec3 590
daveyclk 9:fe5114551ec3 591 /*setting up the SPI defaults*/
daveyclk 9:fe5114551ec3 592 TextToSpeech.lock();
daveyclk 9:fe5114551ec3 593 TextToSpeech.format(8,3);
daveyclk 9:fe5114551ec3 594 TextToSpeech.frequency(frequency);
daveyclk 9:fe5114551ec3 595 TextToSpeech.unlock();
daveyclk 9:fe5114551ec3 596
daveyclk 9:fe5114551ec3 597 /* initialise voice */
daveyclk 9:fe5114551ec3 598 pc.printf("System Init Done!\r\n");
daveyclk 9:fe5114551ec3 599 tts_init();
daveyclk 9:fe5114551ec3 600 pc.printf("tts Init Done!\r\n");
daveyclk 9:fe5114551ec3 601 tts_setup();
daveyclk 9:fe5114551ec3 602 pc.printf("tts setup Done!\r\n");
daveyclk 9:fe5114551ec3 603 tts_msg_block_callback( msg_blk );
daveyclk 9:fe5114551ec3 604 tts_fatal_err_callback( fatal_err );
daveyclk 9:fe5114551ec3 605 tts_config( 0x10, false, TTSV_US, 0x0080 );
daveyclk 9:fe5114551ec3 606 tts_unmute();
daveyclk 9:fe5114551ec3 607
daveyclk 9:fe5114551ec3 608 }
daveyclk 9:fe5114551ec3 609
daveyclk 9:fe5114551ec3 610 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 611 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 612 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 613 /**************************************************************************************************
daveyclk 9:fe5114551ec3 614 * Function msg_blk( uint16_t *req, uint16_t *err )
daveyclk 9:fe5114551ec3 615 * -------------------------------------------------------------------------------------------------
daveyclk 9:fe5114551ec3 616 * Overview: receive a blocked message from S1V30120;
daveyclk 9:fe5114551ec3 617 **************************************************************************************************/
daveyclk 9:fe5114551ec3 618 void msg_blk( uint16_t *req, uint16_t *err )
daveyclk 9:fe5114551ec3 619 {
daveyclk 9:fe5114551ec3 620 char txt[ 6 ];
daveyclk 9:fe5114551ec3 621
daveyclk 9:fe5114551ec3 622 pc.printf( " MSG BLOCKED \r\n" );
daveyclk 9:fe5114551ec3 623 sprintf( txt, "%x\r\n", *req );
daveyclk 9:fe5114551ec3 624 pc.printf( txt );
daveyclk 9:fe5114551ec3 625 sprintf( txt, "%x\r\n", *err );
daveyclk 9:fe5114551ec3 626 pc.printf( txt );
daveyclk 9:fe5114551ec3 627 }
daveyclk 9:fe5114551ec3 628 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 629 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 630 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 631 /**************************************************************************************************
daveyclk 9:fe5114551ec3 632 * Function fatal_err( uint16_t *err )
daveyclk 9:fe5114551ec3 633 * -------------------------------------------------------------------------------------------------
daveyclk 9:fe5114551ec3 634 * Overview: error detected
daveyclk 9:fe5114551ec3 635 **************************************************************************************************/
daveyclk 9:fe5114551ec3 636 void fatal_err( uint16_t *err )
daveyclk 9:fe5114551ec3 637 {
daveyclk 9:fe5114551ec3 638 pc.printf( "Fatal Error Detected" );
daveyclk 9:fe5114551ec3 639 tts_init();
daveyclk 9:fe5114551ec3 640 tts_fatal_err_callback( fatal_err );
daveyclk 9:fe5114551ec3 641 }
daveyclk 9:fe5114551ec3 642
daveyclk 9:fe5114551ec3 643 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 644 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 645 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 646 /**************************************************************************************************
daveyclk 9:fe5114551ec3 647 * text_to_speech_hal.c
daveyclk 9:fe5114551ec3 648 * -------------------------------------------------------------------------------------------------
daveyclk 9:fe5114551ec3 649 * Overview: Functions to control SPI interface.
daveyclk 9:fe5114551ec3 650 **************************************************************************************************/
daveyclk 9:fe5114551ec3 651
daveyclk 9:fe5114551ec3 652 void tts_hal_cs_high()
daveyclk 9:fe5114551ec3 653 {
daveyclk 9:fe5114551ec3 654
daveyclk 9:fe5114551ec3 655 TTS_CS = 1;
daveyclk 9:fe5114551ec3 656 }
daveyclk 9:fe5114551ec3 657
daveyclk 9:fe5114551ec3 658 void tts_hal_cs_low()
daveyclk 9:fe5114551ec3 659 {
daveyclk 9:fe5114551ec3 660 TTS_CS = 0;
daveyclk 9:fe5114551ec3 661
daveyclk 9:fe5114551ec3 662 }
daveyclk 9:fe5114551ec3 663
daveyclk 9:fe5114551ec3 664 void tts_hal_mut_high()
daveyclk 9:fe5114551ec3 665 {
daveyclk 9:fe5114551ec3 666 TTS_MUTE = 1;
daveyclk 9:fe5114551ec3 667 }
daveyclk 9:fe5114551ec3 668
daveyclk 9:fe5114551ec3 669 void tts_hal_mut_low()
daveyclk 9:fe5114551ec3 670 {
daveyclk 9:fe5114551ec3 671 TTS_MUTE = 0;
daveyclk 9:fe5114551ec3 672 }
daveyclk 9:fe5114551ec3 673
daveyclk 9:fe5114551ec3 674 void tts_hal_reset( void )
daveyclk 9:fe5114551ec3 675 {
daveyclk 9:fe5114551ec3 676 tts_hal_cs_high();
daveyclk 9:fe5114551ec3 677 TTS_RST = 0;
daveyclk 9:fe5114551ec3 678 tts_hal_write_pad(1);
daveyclk 9:fe5114551ec3 679 wait(0.01);
daveyclk 9:fe5114551ec3 680 TTS_RST = 1;
daveyclk 9:fe5114551ec3 681 wait(POR_TIME);
daveyclk 9:fe5114551ec3 682 }
daveyclk 9:fe5114551ec3 683
daveyclk 9:fe5114551ec3 684 bool tts_hal_msg_rdy( void )
daveyclk 9:fe5114551ec3 685 {
daveyclk 9:fe5114551ec3 686 return TTS_RDY;
daveyclk 9:fe5114551ec3 687 }
daveyclk 9:fe5114551ec3 688
daveyclk 9:fe5114551ec3 689 void tts_hal_init()
daveyclk 9:fe5114551ec3 690 {
daveyclk 9:fe5114551ec3 691 tts_hal_reset();
daveyclk 9:fe5114551ec3 692 tts_hal_cs_high();
daveyclk 9:fe5114551ec3 693 tts_hal_mut_low();
daveyclk 9:fe5114551ec3 694 }
daveyclk 9:fe5114551ec3 695
daveyclk 9:fe5114551ec3 696 void tts_hal_write( uint8_t *buffer,
daveyclk 9:fe5114551ec3 697 uint16_t count, bool boot )
daveyclk 9:fe5114551ec3 698 {
daveyclk 9:fe5114551ec3 699 TextToSpeech.lock();
daveyclk 9:fe5114551ec3 700 while( count-- )
daveyclk 9:fe5114551ec3 701 {
daveyclk 9:fe5114551ec3 702 if(!boot)
daveyclk 9:fe5114551ec3 703 pc.printf("%02X\r\n", *buffer);
daveyclk 9:fe5114551ec3 704
daveyclk 9:fe5114551ec3 705 TextToSpeech.write( *buffer++ );
daveyclk 9:fe5114551ec3 706
daveyclk 9:fe5114551ec3 707 }
daveyclk 9:fe5114551ec3 708 TextToSpeech.unlock();
daveyclk 9:fe5114551ec3 709 }
daveyclk 9:fe5114551ec3 710
daveyclk 9:fe5114551ec3 711
daveyclk 9:fe5114551ec3 712 void tts_hal_write_pad( int cnt )
daveyclk 9:fe5114551ec3 713 {
daveyclk 9:fe5114551ec3 714 TextToSpeech.lock();
daveyclk 9:fe5114551ec3 715 tts_hal_cs_low();
daveyclk 9:fe5114551ec3 716 while(cnt--)
daveyclk 9:fe5114551ec3 717 {
daveyclk 9:fe5114551ec3 718 TextToSpeech.write( PADDING_BYTE );
daveyclk 9:fe5114551ec3 719 }
daveyclk 9:fe5114551ec3 720
daveyclk 9:fe5114551ec3 721 tts_hal_cs_high();
daveyclk 9:fe5114551ec3 722 TextToSpeech.unlock();
daveyclk 9:fe5114551ec3 723 }
daveyclk 9:fe5114551ec3 724
daveyclk 9:fe5114551ec3 725 void tts_hal_read( uint8_t *buffer,
daveyclk 9:fe5114551ec3 726 uint16_t count )
daveyclk 9:fe5114551ec3 727 {
daveyclk 9:fe5114551ec3 728 TextToSpeech.lock();
daveyclk 9:fe5114551ec3 729 while(count--)
daveyclk 9:fe5114551ec3 730 {
daveyclk 9:fe5114551ec3 731 *buffer++ = TextToSpeech.write( DUMMY_BYTE ); //read spi bus
daveyclk 9:fe5114551ec3 732
daveyclk 9:fe5114551ec3 733
daveyclk 9:fe5114551ec3 734 //pc.printf("buffer = %X\n\r", *buffer);
daveyclk 9:fe5114551ec3 735 }
daveyclk 9:fe5114551ec3 736 TextToSpeech.unlock();
daveyclk 9:fe5114551ec3 737 }
daveyclk 9:fe5114551ec3 738
daveyclk 9:fe5114551ec3 739 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 740 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 741 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 742 /**************************************************************************************************
daveyclk 9:fe5114551ec3 743 * text_to_speech.c
daveyclk 9:fe5114551ec3 744 * -------------------------------------------------------------------------------------------------
daveyclk 9:fe5114551ec3 745 * Overview: Functions to control the setup and speech controls
daveyclk 9:fe5114551ec3 746 **************************************************************************************************/
daveyclk 9:fe5114551ec3 747
daveyclk 9:fe5114551ec3 748 static int _parse_ind( void )
daveyclk 9:fe5114551ec3 749 {
daveyclk 9:fe5114551ec3 750 uint16_t rsp_idx = tts_rsp_idx();
daveyclk 9:fe5114551ec3 751 if ( rsp_idx == ISC_MSG_BLOCKED_RESP )
daveyclk 9:fe5114551ec3 752 {
daveyclk 9:fe5114551ec3 753 uint8_t rsp_data[ 4 ] = { 0 };
daveyclk 9:fe5114551ec3 754
daveyclk 9:fe5114551ec3 755 _req_err = 0;
daveyclk 9:fe5114551ec3 756 _err_code = 0;
daveyclk 9:fe5114551ec3 757
daveyclk 9:fe5114551ec3 758 tts_rsp_data( rsp_data );
daveyclk 9:fe5114551ec3 759
daveyclk 9:fe5114551ec3 760 _req_err |= rsp_data[ 0 ];
daveyclk 9:fe5114551ec3 761 _req_err |= rsp_data[ 1 ] << 8;
daveyclk 9:fe5114551ec3 762 _err_code |= rsp_data[ 2 ];
daveyclk 9:fe5114551ec3 763 _err_code |= rsp_data[ 3 ] << 8;
daveyclk 9:fe5114551ec3 764
daveyclk 9:fe5114551ec3 765 if( _msg_block_callback != NULL )
daveyclk 9:fe5114551ec3 766 _msg_block_callback( &_req_err, &_err_code );
daveyclk 9:fe5114551ec3 767
daveyclk 9:fe5114551ec3 768 return 1;
daveyclk 9:fe5114551ec3 769
daveyclk 9:fe5114551ec3 770 } else if ( rsp_idx == ISC_ERROR_IND ) {
daveyclk 9:fe5114551ec3 771
daveyclk 9:fe5114551ec3 772 uint8_t rsp_data[ 4 ] = { 0 };
daveyclk 9:fe5114551ec3 773
daveyclk 9:fe5114551ec3 774 _req_err = 0;
daveyclk 9:fe5114551ec3 775 _err_code = 0;
daveyclk 9:fe5114551ec3 776
daveyclk 9:fe5114551ec3 777 tts_rsp_data( rsp_data );
daveyclk 9:fe5114551ec3 778
daveyclk 9:fe5114551ec3 779 _err_code |= rsp_data[ 0 ];
daveyclk 9:fe5114551ec3 780 _err_code |= rsp_data[ 1 ] << 8;
daveyclk 9:fe5114551ec3 781
daveyclk 9:fe5114551ec3 782 if ( _err_code && _err_code < 0x8000 )
daveyclk 9:fe5114551ec3 783 {
daveyclk 9:fe5114551ec3 784 if( _err_callback != NULL )
daveyclk 9:fe5114551ec3 785 _err_callback( &_err_code );
daveyclk 9:fe5114551ec3 786
daveyclk 9:fe5114551ec3 787 } else if ( _err_code && _err_code > 0x7FFF ) {
daveyclk 9:fe5114551ec3 788
daveyclk 9:fe5114551ec3 789 if( _fatal_err_callback != NULL )
daveyclk 9:fe5114551ec3 790 _fatal_err_callback( &_err_code );
daveyclk 9:fe5114551ec3 791 }
daveyclk 9:fe5114551ec3 792
daveyclk 9:fe5114551ec3 793 return 1;
daveyclk 9:fe5114551ec3 794
daveyclk 9:fe5114551ec3 795 } else if ( rsp_idx == ISC_TTS_READY_IND ) {
daveyclk 9:fe5114551ec3 796
daveyclk 9:fe5114551ec3 797 _tts_rdy_f = 1;
daveyclk 9:fe5114551ec3 798
daveyclk 9:fe5114551ec3 799 } else if ( rsp_idx == ISC_SPCODEC_READY_IND ) {
daveyclk 9:fe5114551ec3 800
daveyclk 9:fe5114551ec3 801 _spc_rdy_f = 1;
daveyclk 9:fe5114551ec3 802
daveyclk 9:fe5114551ec3 803 } else if ( rsp_idx == ISC_TTS_FINISHED_IND ) {
daveyclk 9:fe5114551ec3 804
daveyclk 9:fe5114551ec3 805 _tts_fin_f = 1;
daveyclk 9:fe5114551ec3 806
daveyclk 9:fe5114551ec3 807 } else if ( rsp_idx == ISC_SPCODEC_FINISHED_IND ) {
daveyclk 9:fe5114551ec3 808
daveyclk 9:fe5114551ec3 809 _spc_fin_f = 1;
daveyclk 9:fe5114551ec3 810 }
daveyclk 9:fe5114551ec3 811
daveyclk 9:fe5114551ec3 812 return 0;
daveyclk 9:fe5114551ec3 813 }
daveyclk 9:fe5114551ec3 814
daveyclk 9:fe5114551ec3 815 void tts_init()
daveyclk 9:fe5114551ec3 816 {
daveyclk 9:fe5114551ec3 817 _req_err = 0;
daveyclk 9:fe5114551ec3 818 _err_code = 0;
daveyclk 9:fe5114551ec3 819
daveyclk 9:fe5114551ec3 820 _tts_rdy_f = true;
daveyclk 9:fe5114551ec3 821 _spc_rdy_f = true;
daveyclk 9:fe5114551ec3 822 _tts_fin_f = true;
daveyclk 9:fe5114551ec3 823 _spc_fin_f = true;
daveyclk 9:fe5114551ec3 824
daveyclk 9:fe5114551ec3 825 _audio_conf.as = 0x00;
daveyclk 9:fe5114551ec3 826 _audio_conf.ag = 0x43;
daveyclk 9:fe5114551ec3 827 _audio_conf.amp = 0x00;
daveyclk 9:fe5114551ec3 828 _audio_conf.asr = ASR_11KHZ;
daveyclk 9:fe5114551ec3 829 _audio_conf.ar = 0x00;
daveyclk 9:fe5114551ec3 830 _audio_conf.atc = 0x00;
daveyclk 9:fe5114551ec3 831 _audio_conf.acs = 0x00;
daveyclk 9:fe5114551ec3 832 _audio_conf.dc = 0x00;
daveyclk 9:fe5114551ec3 833
daveyclk 9:fe5114551ec3 834 _tts_conf.sr = 0x01;
daveyclk 9:fe5114551ec3 835 _tts_conf.voice = 0x00;
daveyclk 9:fe5114551ec3 836 _tts_conf.ep = 0x00;
daveyclk 9:fe5114551ec3 837 _tts_conf.lang = TTSV_US;
daveyclk 9:fe5114551ec3 838 _tts_conf.sr_wpm_lsb = 0xc8;
daveyclk 9:fe5114551ec3 839 _tts_conf.sr_wpm_msb = 0x00;
daveyclk 9:fe5114551ec3 840 _tts_conf.ds = 0x00;
daveyclk 9:fe5114551ec3 841 _tts_conf.res = 0x00;
daveyclk 9:fe5114551ec3 842
daveyclk 9:fe5114551ec3 843 _pman_conf.am_lsb = 0x01;
daveyclk 9:fe5114551ec3 844 _pman_conf.am_msb = 0x00;
daveyclk 9:fe5114551ec3 845 _pman_conf.spi_clk = 0x01;
daveyclk 9:fe5114551ec3 846 _pman_conf.pad = PADDING_BYTE;
daveyclk 9:fe5114551ec3 847
daveyclk 9:fe5114551ec3 848 _flush_enable = false;
daveyclk 9:fe5114551ec3 849
daveyclk 9:fe5114551ec3 850 _msg_block_callback = NULL;
daveyclk 9:fe5114551ec3 851 _fatal_err_callback = NULL;
daveyclk 9:fe5114551ec3 852 _err_callback = NULL;
daveyclk 9:fe5114551ec3 853
daveyclk 9:fe5114551ec3 854 tts_hw_init();
daveyclk 9:fe5114551ec3 855 }
daveyclk 9:fe5114551ec3 856
daveyclk 9:fe5114551ec3 857 void tts_msg_block_callback( void( *msg_blk_ptr )( uint16_t *req_ptr,
daveyclk 9:fe5114551ec3 858 uint16_t *err_ptr ) )
daveyclk 9:fe5114551ec3 859 {
daveyclk 9:fe5114551ec3 860 _msg_block_callback = msg_blk_ptr;
daveyclk 9:fe5114551ec3 861 }
daveyclk 9:fe5114551ec3 862
daveyclk 9:fe5114551ec3 863 void tts_fatal_err_callback( void( *fatal_err_ptr )( uint16_t *err_ptr ) )
daveyclk 9:fe5114551ec3 864 {
daveyclk 9:fe5114551ec3 865 _fatal_err_callback = fatal_err_ptr;
daveyclk 9:fe5114551ec3 866 }
daveyclk 9:fe5114551ec3 867
daveyclk 9:fe5114551ec3 868 void tts_err_callback( void( *error_ptr )( uint16_t *err_ptr ) )
daveyclk 9:fe5114551ec3 869 {
daveyclk 9:fe5114551ec3 870 _err_callback = error_ptr;
daveyclk 9:fe5114551ec3 871 }
daveyclk 9:fe5114551ec3 872
daveyclk 9:fe5114551ec3 873 void tts_mute()
daveyclk 9:fe5114551ec3 874 {
daveyclk 9:fe5114551ec3 875 tts_mute_cmd( true );
daveyclk 9:fe5114551ec3 876 }
daveyclk 9:fe5114551ec3 877
daveyclk 9:fe5114551ec3 878 void tts_unmute()
daveyclk 9:fe5114551ec3 879 {
daveyclk 9:fe5114551ec3 880 tts_mute_cmd( false );
daveyclk 9:fe5114551ec3 881 }
daveyclk 9:fe5114551ec3 882
daveyclk 9:fe5114551ec3 883
daveyclk 9:fe5114551ec3 884 void tts_setup()
daveyclk 9:fe5114551ec3 885 {
daveyclk 9:fe5114551ec3 886 //check HW version
daveyclk 9:fe5114551ec3 887 tts_version_boot();
daveyclk 9:fe5114551ec3 888
daveyclk 9:fe5114551ec3 889 int succ = tts_image_load( (uint8_t*)TTS_INIT_DATA, sizeof( TTS_INIT_DATA ) );
daveyclk 9:fe5114551ec3 890
daveyclk 9:fe5114551ec3 891 if ( succ != 0x0001 )
daveyclk 9:fe5114551ec3 892 {
daveyclk 9:fe5114551ec3 893 // image load failed, try turning it off and on again
daveyclk 9:fe5114551ec3 894 pc.printf("tts init data failed!\n\r");
daveyclk 9:fe5114551ec3 895 pc.printf("returned value: %X\n\r", succ);
daveyclk 9:fe5114551ec3 896 while(1);
daveyclk 9:fe5114551ec3 897 }
daveyclk 9:fe5114551ec3 898 pc.printf("tts image load done\n\r");
daveyclk 9:fe5114551ec3 899 succ = tts_image_exec();
daveyclk 9:fe5114551ec3 900
daveyclk 9:fe5114551ec3 901 if ( succ != 0x0001 )
daveyclk 9:fe5114551ec3 902 {
daveyclk 9:fe5114551ec3 903 // image boot failed, try turning it off and on again
daveyclk 9:fe5114551ec3 904 pc.printf("tts image exec failed!\n\r");
daveyclk 9:fe5114551ec3 905 pc.printf("returned value: %X\n\r", succ);
daveyclk 9:fe5114551ec3 906 while(1);
daveyclk 9:fe5114551ec3 907 }
daveyclk 9:fe5114551ec3 908 pc.printf("tts image exec done\n\r");
daveyclk 9:fe5114551ec3 909
daveyclk 9:fe5114551ec3 910 tts_interface_test();
daveyclk 9:fe5114551ec3 911 pc.printf("tts interface test done\n\r");
daveyclk 9:fe5114551ec3 912
daveyclk 9:fe5114551ec3 913 tts_power_default_config();
daveyclk 9:fe5114551ec3 914 pc.printf("tts power default done\n\r");
daveyclk 9:fe5114551ec3 915
daveyclk 9:fe5114551ec3 916 tts_audio_default_config();
daveyclk 9:fe5114551ec3 917 pc.printf("tts audio default done\n\r");
daveyclk 9:fe5114551ec3 918
daveyclk 9:fe5114551ec3 919 tts_volume_set( 0 );
daveyclk 9:fe5114551ec3 920 pc.printf("tts volume set done\n\r");
daveyclk 9:fe5114551ec3 921
daveyclk 9:fe5114551ec3 922 tts_default_config();
daveyclk 9:fe5114551ec3 923 pc.printf("tts default config done\n\r");
daveyclk 9:fe5114551ec3 924 }
daveyclk 9:fe5114551ec3 925
daveyclk 9:fe5114551ec3 926 void tts_version_boot( void )
daveyclk 9:fe5114551ec3 927 {
daveyclk 9:fe5114551ec3 928
daveyclk 9:fe5114551ec3 929 uint8_t tmp_resp[ 16 ] = { 0 };
daveyclk 9:fe5114551ec3 930
daveyclk 9:fe5114551ec3 931 wait( RESET_TO_BOOT_TIME );
daveyclk 9:fe5114551ec3 932
daveyclk 9:fe5114551ec3 933 tts_parse_req( ISC_VERSION_REQ_BOOT, NULL, 0 );
daveyclk 9:fe5114551ec3 934
daveyclk 9:fe5114551ec3 935 while( !tts_rsp_chk( ISC_VERSION_RESP_BOOT ) )
daveyclk 9:fe5114551ec3 936 {
daveyclk 9:fe5114551ec3 937 tts_get_resp();
daveyclk 9:fe5114551ec3 938 }
daveyclk 9:fe5114551ec3 939 tts_hal_write_pad( 16);
daveyclk 9:fe5114551ec3 940 tts_rsp_data( tmp_resp );
daveyclk 9:fe5114551ec3 941 pc.printf("hwver0 %X \n\r", tmp_resp[ 0 ]);
daveyclk 9:fe5114551ec3 942 pc.printf("hwver1 %X \n\r", tmp_resp[ 1 ]);
daveyclk 9:fe5114551ec3 943 }
daveyclk 9:fe5114551ec3 944
daveyclk 9:fe5114551ec3 945 uint16_t tts_image_load(const uint8_t *image,
daveyclk 9:fe5114551ec3 946 uint16_t count )
daveyclk 9:fe5114551ec3 947 {
daveyclk 9:fe5114551ec3 948 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 949 uint16_t index = 0;
daveyclk 9:fe5114551ec3 950 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 951
daveyclk 9:fe5114551ec3 952 while ( ( count - index ) > ( BOOT_MESSAGE_MAX - 4 ) )
daveyclk 9:fe5114551ec3 953 {
daveyclk 9:fe5114551ec3 954
daveyclk 9:fe5114551ec3 955 tts_parse_boot_img( image + index, BOOT_MESSAGE_MAX - 4 );
daveyclk 9:fe5114551ec3 956 wait(0.01);
daveyclk 9:fe5114551ec3 957 index += ( BOOT_MESSAGE_MAX - 4 );
daveyclk 9:fe5114551ec3 958 }
daveyclk 9:fe5114551ec3 959 tts_parse_boot_img( image + index, count - index );
daveyclk 9:fe5114551ec3 960 wait(0.01);
daveyclk 9:fe5114551ec3 961
daveyclk 9:fe5114551ec3 962 while( !tts_rsp_chk( ISC_BOOT_LOAD_RESP ) )
daveyclk 9:fe5114551ec3 963 {
daveyclk 9:fe5114551ec3 964 tts_get_resp();
daveyclk 9:fe5114551ec3 965
daveyclk 9:fe5114551ec3 966 if( _parse_ind() )
daveyclk 9:fe5114551ec3 967 return _err_code;
daveyclk 9:fe5114551ec3 968 }
daveyclk 9:fe5114551ec3 969 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 970
daveyclk 9:fe5114551ec3 971 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 972 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 973
daveyclk 9:fe5114551ec3 974 return tmp_resp;
daveyclk 9:fe5114551ec3 975 }
daveyclk 9:fe5114551ec3 976
daveyclk 9:fe5114551ec3 977 uint16_t tts_image_exec()
daveyclk 9:fe5114551ec3 978 {
daveyclk 9:fe5114551ec3 979 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 980 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 981
daveyclk 9:fe5114551ec3 982 tts_parse_req( ISC_BOOT_RUN_REQ, NULL, 0 );
daveyclk 9:fe5114551ec3 983
daveyclk 9:fe5114551ec3 984 while( !tts_rsp_chk( ISC_BOOT_RUN_RESP ) )
daveyclk 9:fe5114551ec3 985 {
daveyclk 9:fe5114551ec3 986 tts_get_resp();
daveyclk 9:fe5114551ec3 987
daveyclk 9:fe5114551ec3 988 if( _parse_ind() )
daveyclk 9:fe5114551ec3 989 return _err_code;
daveyclk 9:fe5114551ec3 990 }
daveyclk 9:fe5114551ec3 991 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 992
daveyclk 9:fe5114551ec3 993 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 994 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 995
daveyclk 9:fe5114551ec3 996 return tmp_resp;
daveyclk 9:fe5114551ec3 997 }
daveyclk 9:fe5114551ec3 998
daveyclk 9:fe5114551ec3 999 uint16_t tts_interface_test()
daveyclk 9:fe5114551ec3 1000 {
daveyclk 9:fe5114551ec3 1001 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1002 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1003
daveyclk 9:fe5114551ec3 1004 wait( BOOT_TO_MAIN_MODE );
daveyclk 9:fe5114551ec3 1005
daveyclk 9:fe5114551ec3 1006 tts_parse_req( ISC_TEST_REQ, test, 8 );
daveyclk 9:fe5114551ec3 1007
daveyclk 9:fe5114551ec3 1008 while( !tts_rsp_chk( ISC_TEST_RESP ) )
daveyclk 9:fe5114551ec3 1009 {
daveyclk 9:fe5114551ec3 1010 tts_get_resp();
daveyclk 9:fe5114551ec3 1011
daveyclk 9:fe5114551ec3 1012 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1013 return _err_code;
daveyclk 9:fe5114551ec3 1014 }
daveyclk 9:fe5114551ec3 1015
daveyclk 9:fe5114551ec3 1016 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1017
daveyclk 9:fe5114551ec3 1018 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1019 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1020
daveyclk 9:fe5114551ec3 1021 return tmp_resp;
daveyclk 9:fe5114551ec3 1022 }
daveyclk 9:fe5114551ec3 1023
daveyclk 9:fe5114551ec3 1024 uint16_t tts_version_main( VER_t *buffer )
daveyclk 9:fe5114551ec3 1025 {
daveyclk 9:fe5114551ec3 1026 char tmp_char[ 3 ] = { 0 };
daveyclk 9:fe5114551ec3 1027 uint32_t tmp_fwf = 0;
daveyclk 9:fe5114551ec3 1028 uint32_t tmp_fwef = 0;
daveyclk 9:fe5114551ec3 1029 uint8_t tmp_resp[ 20 ] = { 0 };
daveyclk 9:fe5114551ec3 1030
daveyclk 9:fe5114551ec3 1031 tts_parse_req( ISC_VERSION_REQ_MAIN, NULL, 0 );
daveyclk 9:fe5114551ec3 1032
daveyclk 9:fe5114551ec3 1033 while( !tts_rsp_chk( ISC_VERSION_RESP_MAIN ) )
daveyclk 9:fe5114551ec3 1034 {
daveyclk 9:fe5114551ec3 1035 tts_get_resp();
daveyclk 9:fe5114551ec3 1036
daveyclk 9:fe5114551ec3 1037 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1038 return _err_code;
daveyclk 9:fe5114551ec3 1039 }
daveyclk 9:fe5114551ec3 1040
daveyclk 9:fe5114551ec3 1041 tts_rsp_data( tmp_resp );
daveyclk 9:fe5114551ec3 1042 sprintf(tmp_char, "%c", tmp_resp[ 0 ]);
daveyclk 9:fe5114551ec3 1043 strcpy( buffer->hwver, tmp_char );
daveyclk 9:fe5114551ec3 1044 strcat( buffer->hwver, "." );
daveyclk 9:fe5114551ec3 1045 sprintf(tmp_char, "%c", tmp_resp[ 1 ]);
daveyclk 9:fe5114551ec3 1046 strcat( buffer->hwver, tmp_char );
daveyclk 9:fe5114551ec3 1047 sprintf(tmp_char, "%c", tmp_resp[ 2 ]);
daveyclk 9:fe5114551ec3 1048 strcpy( buffer->fwver, tmp_char );
daveyclk 9:fe5114551ec3 1049 strcat( buffer->fwver, "." );
daveyclk 9:fe5114551ec3 1050 sprintf(tmp_char, "%c", tmp_resp[ 3 ]);
daveyclk 9:fe5114551ec3 1051 strcat( buffer->fwver, tmp_char );
daveyclk 9:fe5114551ec3 1052 strcat( buffer->fwver, "." );
daveyclk 9:fe5114551ec3 1053 sprintf(tmp_char, "%c", tmp_resp[ 12 ]);
daveyclk 9:fe5114551ec3 1054 strcat( buffer->fwver, tmp_char );
daveyclk 9:fe5114551ec3 1055
daveyclk 9:fe5114551ec3 1056 tmp_fwf |= tmp_resp[ 4 ];
daveyclk 9:fe5114551ec3 1057 tmp_fwf |= tmp_resp[ 5 ] << 8;
daveyclk 9:fe5114551ec3 1058 tmp_fwf |= tmp_resp[ 6 ] << 16;
daveyclk 9:fe5114551ec3 1059 tmp_fwf |= tmp_resp[ 7 ] << 24;
daveyclk 9:fe5114551ec3 1060 buffer->fwf = (FF_t)tmp_fwf;
daveyclk 9:fe5114551ec3 1061 tmp_fwef |= tmp_resp[ 8 ];
daveyclk 9:fe5114551ec3 1062 tmp_fwef |= tmp_resp[ 9 ] << 8;
daveyclk 9:fe5114551ec3 1063 tmp_fwef |= tmp_resp[ 10 ] << 16;
daveyclk 9:fe5114551ec3 1064 tmp_fwef |= tmp_resp[ 11 ] << 24;
daveyclk 9:fe5114551ec3 1065 buffer->fwef = (EFF_t)tmp_fwef;
daveyclk 9:fe5114551ec3 1066
daveyclk 9:fe5114551ec3 1067 return 0x0000;
daveyclk 9:fe5114551ec3 1068 }
daveyclk 9:fe5114551ec3 1069
daveyclk 9:fe5114551ec3 1070 uint16_t tts_power_default_config()
daveyclk 9:fe5114551ec3 1071 {
daveyclk 9:fe5114551ec3 1072 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1073 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1074
daveyclk 9:fe5114551ec3 1075 tts_parse_req( ISC_PMAN_CONFIG_REQ, ( uint8_t* )&_pman_conf, 4 );
daveyclk 9:fe5114551ec3 1076
daveyclk 9:fe5114551ec3 1077 while( !tts_rsp_chk( ISC_PMAN_CONFIG_RESP ) )
daveyclk 9:fe5114551ec3 1078 {
daveyclk 9:fe5114551ec3 1079 tts_get_resp();
daveyclk 9:fe5114551ec3 1080
daveyclk 9:fe5114551ec3 1081 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1082 return _err_code;
daveyclk 9:fe5114551ec3 1083 }
daveyclk 9:fe5114551ec3 1084
daveyclk 9:fe5114551ec3 1085 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1086
daveyclk 9:fe5114551ec3 1087 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1088 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1089
daveyclk 9:fe5114551ec3 1090 return tmp_resp;
daveyclk 9:fe5114551ec3 1091 }
daveyclk 9:fe5114551ec3 1092
daveyclk 9:fe5114551ec3 1093 uint16_t tts_standby_enter()
daveyclk 9:fe5114551ec3 1094 {
daveyclk 9:fe5114551ec3 1095 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1096 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1097
daveyclk 9:fe5114551ec3 1098 tts_parse_req( ISC_PMAN_STANDBY_ENTRY_REQ, NULL, 0 );
daveyclk 9:fe5114551ec3 1099
daveyclk 9:fe5114551ec3 1100 while( !tts_rsp_chk( ISC_PMAN_STANDBY_ENTRY_RESP ) )
daveyclk 9:fe5114551ec3 1101 {
daveyclk 9:fe5114551ec3 1102 tts_get_resp();
daveyclk 9:fe5114551ec3 1103
daveyclk 9:fe5114551ec3 1104 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1105 return _err_code;
daveyclk 9:fe5114551ec3 1106 }
daveyclk 9:fe5114551ec3 1107
daveyclk 9:fe5114551ec3 1108 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1109
daveyclk 9:fe5114551ec3 1110 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1111 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1112
daveyclk 9:fe5114551ec3 1113 return tmp_resp;
daveyclk 9:fe5114551ec3 1114 }
daveyclk 9:fe5114551ec3 1115
daveyclk 9:fe5114551ec3 1116 uint16_t tts_standby_exit()
daveyclk 9:fe5114551ec3 1117 {
daveyclk 9:fe5114551ec3 1118 wait( STBY_MODE_ENTERY );
daveyclk 9:fe5114551ec3 1119 tts_parse_req( ISC_PMAN_STANDBY_EXIT_IND, NULL, 0 );
daveyclk 9:fe5114551ec3 1120
daveyclk 9:fe5114551ec3 1121 while( !tts_rsp_chk( ISC_PMAN_STANDBY_EXIT_IND ) )
daveyclk 9:fe5114551ec3 1122 {
daveyclk 9:fe5114551ec3 1123 tts_get_resp();
daveyclk 9:fe5114551ec3 1124
daveyclk 9:fe5114551ec3 1125 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1126 return _err_code;
daveyclk 9:fe5114551ec3 1127 }
daveyclk 9:fe5114551ec3 1128
daveyclk 9:fe5114551ec3 1129 return 0x0000;
daveyclk 9:fe5114551ec3 1130 }
daveyclk 9:fe5114551ec3 1131
daveyclk 9:fe5114551ec3 1132 uint16_t tts_audio_default_config()
daveyclk 9:fe5114551ec3 1133 {
daveyclk 9:fe5114551ec3 1134 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1135 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1136
daveyclk 9:fe5114551ec3 1137 tts_parse_req( ISC_AUDIO_CONFIG_REQ, ( uint8_t* )&_audio_conf, 8 );
daveyclk 9:fe5114551ec3 1138
daveyclk 9:fe5114551ec3 1139 while( !tts_rsp_chk( ISC_AUDIO_CONFIG_RESP ) )
daveyclk 9:fe5114551ec3 1140 {
daveyclk 9:fe5114551ec3 1141 tts_get_resp();
daveyclk 9:fe5114551ec3 1142
daveyclk 9:fe5114551ec3 1143 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1144 return _err_code;
daveyclk 9:fe5114551ec3 1145 }
daveyclk 9:fe5114551ec3 1146
daveyclk 9:fe5114551ec3 1147 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1148
daveyclk 9:fe5114551ec3 1149 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1150 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1151
daveyclk 9:fe5114551ec3 1152 return tmp_resp;
daveyclk 9:fe5114551ec3 1153 }
daveyclk 9:fe5114551ec3 1154
daveyclk 9:fe5114551ec3 1155 uint16_t tts_audio_config( int8_t audio_gain,
daveyclk 9:fe5114551ec3 1156 ASR_t sample_rate,
daveyclk 9:fe5114551ec3 1157 bool dac_control )
daveyclk 9:fe5114551ec3 1158 {
daveyclk 9:fe5114551ec3 1159 ACONF_t audio_conf;
daveyclk 9:fe5114551ec3 1160 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1161 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1162
daveyclk 9:fe5114551ec3 1163 if ( audio_gain < -48 || audio_gain > 18 )
daveyclk 9:fe5114551ec3 1164 return 0xFFFF;
daveyclk 9:fe5114551ec3 1165
daveyclk 9:fe5114551ec3 1166 if ( sample_rate != 0 || sample_rate != 1 || sample_rate != 3 )
daveyclk 9:fe5114551ec3 1167 return 0xFFFF;
daveyclk 9:fe5114551ec3 1168
daveyclk 9:fe5114551ec3 1169 audio_conf.ag = ( uint8_t )audio_gain;
daveyclk 9:fe5114551ec3 1170 audio_conf.asr = sample_rate;
daveyclk 9:fe5114551ec3 1171 audio_conf.dc = dac_control;
daveyclk 9:fe5114551ec3 1172
daveyclk 9:fe5114551ec3 1173 tts_parse_req( ISC_AUDIO_CONFIG_REQ, ( uint8_t* )&audio_conf, 8 );
daveyclk 9:fe5114551ec3 1174
daveyclk 9:fe5114551ec3 1175 while( !tts_rsp_chk( ISC_AUDIO_CONFIG_RESP ) )
daveyclk 9:fe5114551ec3 1176 {
daveyclk 9:fe5114551ec3 1177 tts_get_resp();
daveyclk 9:fe5114551ec3 1178
daveyclk 9:fe5114551ec3 1179 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1180 return _err_code;
daveyclk 9:fe5114551ec3 1181 }
daveyclk 9:fe5114551ec3 1182
daveyclk 9:fe5114551ec3 1183 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1184
daveyclk 9:fe5114551ec3 1185 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1186 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1187
daveyclk 9:fe5114551ec3 1188 return tmp_resp;
daveyclk 9:fe5114551ec3 1189 }
daveyclk 9:fe5114551ec3 1190
daveyclk 9:fe5114551ec3 1191 uint16_t tts_volume_set( int16_t gain )
daveyclk 9:fe5114551ec3 1192 {
daveyclk 9:fe5114551ec3 1193 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1194 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1195 uint8_t tmp_gain[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1196
daveyclk 9:fe5114551ec3 1197 tmp_gain[ 0 ] = gain & 0x00FF;
daveyclk 9:fe5114551ec3 1198 tmp_gain[ 1 ] = ( gain & 0xFF00 ) >> 8;
daveyclk 9:fe5114551ec3 1199
daveyclk 9:fe5114551ec3 1200 tts_parse_req( ISC_AUDIO_VOULME_REQ, tmp_gain, 2 );
daveyclk 9:fe5114551ec3 1201
daveyclk 9:fe5114551ec3 1202 while( !tts_rsp_chk( ISC_AUDIO_VOLUME_RESP ) )
daveyclk 9:fe5114551ec3 1203 {
daveyclk 9:fe5114551ec3 1204 tts_get_resp();
daveyclk 9:fe5114551ec3 1205
daveyclk 9:fe5114551ec3 1206 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1207 return _err_code;
daveyclk 9:fe5114551ec3 1208 }
daveyclk 9:fe5114551ec3 1209
daveyclk 9:fe5114551ec3 1210 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1211
daveyclk 9:fe5114551ec3 1212 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1213 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1214
daveyclk 9:fe5114551ec3 1215 return tmp_resp;
daveyclk 9:fe5114551ec3 1216 }
daveyclk 9:fe5114551ec3 1217
daveyclk 9:fe5114551ec3 1218 uint16_t tts_audio_mute()
daveyclk 9:fe5114551ec3 1219 {
daveyclk 9:fe5114551ec3 1220 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1221 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1222 uint8_t tmp_mute[ 2 ] = { 1, 0 };
daveyclk 9:fe5114551ec3 1223
daveyclk 9:fe5114551ec3 1224 tts_parse_req( ISC_AUDIO_MUTE_REQ, tmp_mute, 2 );
daveyclk 9:fe5114551ec3 1225
daveyclk 9:fe5114551ec3 1226 while( !tts_rsp_chk( ISC_AUDIO_MUTE_RESP ) )
daveyclk 9:fe5114551ec3 1227 {
daveyclk 9:fe5114551ec3 1228 tts_get_resp();
daveyclk 9:fe5114551ec3 1229
daveyclk 9:fe5114551ec3 1230 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1231 return _err_code;
daveyclk 9:fe5114551ec3 1232 }
daveyclk 9:fe5114551ec3 1233
daveyclk 9:fe5114551ec3 1234 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1235
daveyclk 9:fe5114551ec3 1236 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1237 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1238
daveyclk 9:fe5114551ec3 1239 return tmp_resp;
daveyclk 9:fe5114551ec3 1240 }
daveyclk 9:fe5114551ec3 1241
daveyclk 9:fe5114551ec3 1242 uint16_t tts_audio_unmute()
daveyclk 9:fe5114551ec3 1243 {
daveyclk 9:fe5114551ec3 1244 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1245 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1246 uint8_t tmp_mute[ 2 ] = { 0, 0 };
daveyclk 9:fe5114551ec3 1247
daveyclk 9:fe5114551ec3 1248 tts_parse_req( ISC_AUDIO_MUTE_REQ, tmp_mute, 2 );
daveyclk 9:fe5114551ec3 1249
daveyclk 9:fe5114551ec3 1250 while( !tts_rsp_chk( ISC_AUDIO_MUTE_RESP ) )
daveyclk 9:fe5114551ec3 1251 {
daveyclk 9:fe5114551ec3 1252 tts_get_resp();
daveyclk 9:fe5114551ec3 1253
daveyclk 9:fe5114551ec3 1254 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1255 return _err_code;
daveyclk 9:fe5114551ec3 1256 }
daveyclk 9:fe5114551ec3 1257
daveyclk 9:fe5114551ec3 1258 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1259
daveyclk 9:fe5114551ec3 1260 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1261 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1262
daveyclk 9:fe5114551ec3 1263 return tmp_resp;
daveyclk 9:fe5114551ec3 1264 }
daveyclk 9:fe5114551ec3 1265
daveyclk 9:fe5114551ec3 1266 uint16_t tts_default_config()
daveyclk 9:fe5114551ec3 1267 {
daveyclk 9:fe5114551ec3 1268 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1269 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1270
daveyclk 9:fe5114551ec3 1271 tts_parse_req( ISC_TTS_CONFIG_REQ, ( uint8_t* )&_tts_conf, 8 );
daveyclk 9:fe5114551ec3 1272
daveyclk 9:fe5114551ec3 1273 while( !tts_rsp_chk( ISC_TTS_CONFIG_RESP ) )
daveyclk 9:fe5114551ec3 1274 {
daveyclk 9:fe5114551ec3 1275 tts_get_resp();
daveyclk 9:fe5114551ec3 1276
daveyclk 9:fe5114551ec3 1277 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1278 return _err_code;
daveyclk 9:fe5114551ec3 1279 }
daveyclk 9:fe5114551ec3 1280
daveyclk 9:fe5114551ec3 1281 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1282
daveyclk 9:fe5114551ec3 1283 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1284 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1285
daveyclk 9:fe5114551ec3 1286 return tmp_resp;
daveyclk 9:fe5114551ec3 1287 }
daveyclk 9:fe5114551ec3 1288
daveyclk 9:fe5114551ec3 1289 uint16_t tts_config( uint8_t voice_type,
daveyclk 9:fe5114551ec3 1290 bool epson_parse,
daveyclk 9:fe5114551ec3 1291 TTSV_t language,
daveyclk 9:fe5114551ec3 1292 uint16_t speaking_rate )
daveyclk 9:fe5114551ec3 1293 {
daveyclk 9:fe5114551ec3 1294 TTSCONF_t tts_conf;
daveyclk 9:fe5114551ec3 1295 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1296 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1297
daveyclk 9:fe5114551ec3 1298 if ( voice_type > 8 )
daveyclk 9:fe5114551ec3 1299 return 0xFFFF;
daveyclk 9:fe5114551ec3 1300
daveyclk 9:fe5114551ec3 1301 if ( language > 4 )
daveyclk 9:fe5114551ec3 1302 return 0xFFFF;
daveyclk 9:fe5114551ec3 1303
daveyclk 9:fe5114551ec3 1304 if ( speaking_rate < 0x004B || speaking_rate > 0x0258 )
daveyclk 9:fe5114551ec3 1305 return 0xFFFF;
daveyclk 9:fe5114551ec3 1306
daveyclk 9:fe5114551ec3 1307 tts_conf.voice = voice_type;
daveyclk 9:fe5114551ec3 1308 tts_conf.ep = epson_parse;
daveyclk 9:fe5114551ec3 1309 tts_conf.lang = language;
daveyclk 9:fe5114551ec3 1310 tts_conf.sr_wpm_lsb = ( speaking_rate & 0x00FF );
daveyclk 9:fe5114551ec3 1311 tts_conf.sr_wpm_msb = ( speaking_rate & 0xFF00 ) >> 8;
daveyclk 9:fe5114551ec3 1312
daveyclk 9:fe5114551ec3 1313 tts_parse_req( ISC_TTS_CONFIG_REQ, ( uint8_t* )&tts_conf, 8 );
daveyclk 9:fe5114551ec3 1314
daveyclk 9:fe5114551ec3 1315 while( !tts_rsp_chk( ISC_TTS_CONFIG_RESP ) )
daveyclk 9:fe5114551ec3 1316 {
daveyclk 9:fe5114551ec3 1317 tts_get_resp();
daveyclk 9:fe5114551ec3 1318
daveyclk 9:fe5114551ec3 1319 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1320 return _err_code;
daveyclk 9:fe5114551ec3 1321 }
daveyclk 9:fe5114551ec3 1322
daveyclk 9:fe5114551ec3 1323 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1324
daveyclk 9:fe5114551ec3 1325 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1326 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1327
daveyclk 9:fe5114551ec3 1328 return tmp_resp;
daveyclk 9:fe5114551ec3 1329 }
daveyclk 9:fe5114551ec3 1330
daveyclk 9:fe5114551ec3 1331 uint16_t tts_speak( char *word )
daveyclk 9:fe5114551ec3 1332 {
daveyclk 9:fe5114551ec3 1333 bool tmp_f = false;
daveyclk 9:fe5114551ec3 1334 char *wptr = word;
daveyclk 9:fe5114551ec3 1335 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1336 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1337 uint32_t wlen = strlen( wptr );
daveyclk 9:fe5114551ec3 1338
daveyclk 9:fe5114551ec3 1339 tts_parse_speak_req( ISC_TTS_SPEAK_REQ, _flush_enable, wptr, wlen );
daveyclk 9:fe5114551ec3 1340
daveyclk 9:fe5114551ec3 1341 _tts_rdy_f = 0;
daveyclk 9:fe5114551ec3 1342 _tts_fin_f = 0;
daveyclk 9:fe5114551ec3 1343
daveyclk 9:fe5114551ec3 1344 while( !( tmp_f && _tts_rdy_f ) )
daveyclk 9:fe5114551ec3 1345 {
daveyclk 9:fe5114551ec3 1346 tts_get_resp();
daveyclk 9:fe5114551ec3 1347
daveyclk 9:fe5114551ec3 1348 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1349 return _err_code;
daveyclk 9:fe5114551ec3 1350
daveyclk 9:fe5114551ec3 1351 if( tts_rsp_chk( ISC_TTS_SPEAK_RESP ) )
daveyclk 9:fe5114551ec3 1352 {
daveyclk 9:fe5114551ec3 1353 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1354
daveyclk 9:fe5114551ec3 1355 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1356 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1357 tmp_f = true;
daveyclk 9:fe5114551ec3 1358 }
daveyclk 9:fe5114551ec3 1359 }
daveyclk 9:fe5114551ec3 1360
daveyclk 9:fe5114551ec3 1361 return tmp_resp;
daveyclk 9:fe5114551ec3 1362 }
daveyclk 9:fe5114551ec3 1363
daveyclk 9:fe5114551ec3 1364 uint16_t tts_pause( void )
daveyclk 9:fe5114551ec3 1365 {
daveyclk 9:fe5114551ec3 1366 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1367 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1368 uint8_t tmp_pause[ 2 ] = { 1, 0 };
daveyclk 9:fe5114551ec3 1369
daveyclk 9:fe5114551ec3 1370 tts_parse_req( ISC_TTS_PAUSE_REQ, tmp_pause, 2 );
daveyclk 9:fe5114551ec3 1371
daveyclk 9:fe5114551ec3 1372 while( !tts_rsp_chk( ISC_TTS_PAUSE_RESP ) )
daveyclk 9:fe5114551ec3 1373 {
daveyclk 9:fe5114551ec3 1374 tts_get_resp();
daveyclk 9:fe5114551ec3 1375
daveyclk 9:fe5114551ec3 1376 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1377 return _err_code;
daveyclk 9:fe5114551ec3 1378 }
daveyclk 9:fe5114551ec3 1379
daveyclk 9:fe5114551ec3 1380 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1381
daveyclk 9:fe5114551ec3 1382 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1383 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1384
daveyclk 9:fe5114551ec3 1385 return tmp_resp;
daveyclk 9:fe5114551ec3 1386 }
daveyclk 9:fe5114551ec3 1387
daveyclk 9:fe5114551ec3 1388 uint16_t tts_unpause( void )
daveyclk 9:fe5114551ec3 1389 {
daveyclk 9:fe5114551ec3 1390 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1391 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1392 uint8_t tmp_pause[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1393
daveyclk 9:fe5114551ec3 1394 tts_parse_req( ISC_TTS_PAUSE_REQ, tmp_pause, 2 );
daveyclk 9:fe5114551ec3 1395
daveyclk 9:fe5114551ec3 1396 while( !tts_rsp_chk( ISC_TTS_PAUSE_RESP ) )
daveyclk 9:fe5114551ec3 1397 {
daveyclk 9:fe5114551ec3 1398 tts_get_resp();
daveyclk 9:fe5114551ec3 1399
daveyclk 9:fe5114551ec3 1400 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1401 return _err_code;
daveyclk 9:fe5114551ec3 1402 }
daveyclk 9:fe5114551ec3 1403
daveyclk 9:fe5114551ec3 1404 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1405
daveyclk 9:fe5114551ec3 1406 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1407 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1408
daveyclk 9:fe5114551ec3 1409 return tmp_resp;
daveyclk 9:fe5114551ec3 1410 }
daveyclk 9:fe5114551ec3 1411
daveyclk 9:fe5114551ec3 1412 uint16_t tts_stop( bool reset )
daveyclk 9:fe5114551ec3 1413 {
daveyclk 9:fe5114551ec3 1414 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1415 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1416 uint8_t tmp_reset[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1417
daveyclk 9:fe5114551ec3 1418 if( reset )
daveyclk 9:fe5114551ec3 1419 tmp_reset[ 0 ] = 0x01;
daveyclk 9:fe5114551ec3 1420
daveyclk 9:fe5114551ec3 1421 tts_parse_req( ISC_TTS_STOP_REQ, tmp_reset, 2 );
daveyclk 9:fe5114551ec3 1422
daveyclk 9:fe5114551ec3 1423 while( !tts_rsp_chk( ISC_TTS_STOP_RESP ) )
daveyclk 9:fe5114551ec3 1424 {
daveyclk 9:fe5114551ec3 1425 tts_get_resp();
daveyclk 9:fe5114551ec3 1426
daveyclk 9:fe5114551ec3 1427 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1428 return _err_code;
daveyclk 9:fe5114551ec3 1429 }
daveyclk 9:fe5114551ec3 1430
daveyclk 9:fe5114551ec3 1431 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1432
daveyclk 9:fe5114551ec3 1433 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1434 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1435
daveyclk 9:fe5114551ec3 1436 return tmp_resp;
daveyclk 9:fe5114551ec3 1437 }
daveyclk 9:fe5114551ec3 1438
daveyclk 9:fe5114551ec3 1439 uint16_t tts_user_dict( bool erase,
daveyclk 9:fe5114551ec3 1440 uint8_t *udict_data,
daveyclk 9:fe5114551ec3 1441 uint16_t count )
daveyclk 9:fe5114551ec3 1442 {
daveyclk 9:fe5114551ec3 1443 uint16_t cnt = 2;
daveyclk 9:fe5114551ec3 1444 uint16_t tmp_rsp = 0;
daveyclk 9:fe5114551ec3 1445 uint8_t rsp_data[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1446 uint8_t tmp_data[ BOOT_MESSAGE_MAX ] = { 0 };
daveyclk 9:fe5114551ec3 1447
daveyclk 9:fe5114551ec3 1448 if ( erase )
daveyclk 9:fe5114551ec3 1449 tmp_data[ 0 ] = 1;
daveyclk 9:fe5114551ec3 1450
daveyclk 9:fe5114551ec3 1451 while ( count-- )
daveyclk 9:fe5114551ec3 1452 tmp_data[ cnt ++ ] = *( udict_data++ );
daveyclk 9:fe5114551ec3 1453
daveyclk 9:fe5114551ec3 1454 tts_parse_req( ISC_TTS_UDICT_DATA_REQ, tmp_data, count + 2 );
daveyclk 9:fe5114551ec3 1455
daveyclk 9:fe5114551ec3 1456 while( !tts_rsp_chk( ISC_TTS_UDICT_DATA_RESP ) )
daveyclk 9:fe5114551ec3 1457 {
daveyclk 9:fe5114551ec3 1458 tts_get_resp();
daveyclk 9:fe5114551ec3 1459
daveyclk 9:fe5114551ec3 1460 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1461 return _err_code;
daveyclk 9:fe5114551ec3 1462 }
daveyclk 9:fe5114551ec3 1463
daveyclk 9:fe5114551ec3 1464 tts_rsp_data( rsp_data );
daveyclk 9:fe5114551ec3 1465
daveyclk 9:fe5114551ec3 1466 tmp_rsp |= rsp_data[ 0 ];
daveyclk 9:fe5114551ec3 1467 tmp_rsp |= rsp_data[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1468
daveyclk 9:fe5114551ec3 1469 return tmp_rsp;
daveyclk 9:fe5114551ec3 1470 }
daveyclk 9:fe5114551ec3 1471
daveyclk 9:fe5114551ec3 1472 uint16_t tts_codec_configure()
daveyclk 9:fe5114551ec3 1473 {
daveyclk 9:fe5114551ec3 1474 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1475 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1476 uint8_t tmp_codec[ 32 ] = { 0 };
daveyclk 9:fe5114551ec3 1477
daveyclk 9:fe5114551ec3 1478 tmp_codec[ 0 ] = 0x01;
daveyclk 9:fe5114551ec3 1479 tmp_codec[ 1 ] = 0x01;
daveyclk 9:fe5114551ec3 1480 tmp_codec[ 24 ] = 0x02;
daveyclk 9:fe5114551ec3 1481
daveyclk 9:fe5114551ec3 1482 tts_parse_req( ISC_SPCODEC_CONFIG_REQ , tmp_codec, 32 );
daveyclk 9:fe5114551ec3 1483
daveyclk 9:fe5114551ec3 1484 while( !tts_rsp_chk( ISC_SPCODEC_CONFIG_RESP ) )
daveyclk 9:fe5114551ec3 1485 {
daveyclk 9:fe5114551ec3 1486 tts_get_resp();
daveyclk 9:fe5114551ec3 1487
daveyclk 9:fe5114551ec3 1488 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1489 return _err_code;
daveyclk 9:fe5114551ec3 1490 }
daveyclk 9:fe5114551ec3 1491
daveyclk 9:fe5114551ec3 1492 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1493
daveyclk 9:fe5114551ec3 1494 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1495 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1496
daveyclk 9:fe5114551ec3 1497 return tmp_resp;
daveyclk 9:fe5114551ec3 1498 }
daveyclk 9:fe5114551ec3 1499
daveyclk 9:fe5114551ec3 1500 uint16_t tts_codec_start( uint8_t *codec_data,
daveyclk 9:fe5114551ec3 1501 uint16_t count )
daveyclk 9:fe5114551ec3 1502 {
daveyclk 9:fe5114551ec3 1503 bool tmp_f = false;
daveyclk 9:fe5114551ec3 1504 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1505 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1506
daveyclk 9:fe5114551ec3 1507 if ( count != 512 || count != 1024 || count != 2048 )
daveyclk 9:fe5114551ec3 1508 return 0xFFFF;
daveyclk 9:fe5114551ec3 1509
daveyclk 9:fe5114551ec3 1510 while( !_spc_fin_f )
daveyclk 9:fe5114551ec3 1511 {
daveyclk 9:fe5114551ec3 1512 tts_get_resp();
daveyclk 9:fe5114551ec3 1513
daveyclk 9:fe5114551ec3 1514 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1515 return _err_code;
daveyclk 9:fe5114551ec3 1516 }
daveyclk 9:fe5114551ec3 1517
daveyclk 9:fe5114551ec3 1518 tts_parse_req( ISC_SPCODEC_START_REQ , codec_data, count );
daveyclk 9:fe5114551ec3 1519
daveyclk 9:fe5114551ec3 1520 _spc_rdy_f = 0;
daveyclk 9:fe5114551ec3 1521 _spc_fin_f = 0;
daveyclk 9:fe5114551ec3 1522
daveyclk 9:fe5114551ec3 1523 while( !( tmp_f && _spc_rdy_f ) )
daveyclk 9:fe5114551ec3 1524 {
daveyclk 9:fe5114551ec3 1525 tts_get_resp();
daveyclk 9:fe5114551ec3 1526
daveyclk 9:fe5114551ec3 1527 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1528 return _err_code;
daveyclk 9:fe5114551ec3 1529
daveyclk 9:fe5114551ec3 1530 if( tts_rsp_chk( ISC_TTS_SPEAK_RESP ) )
daveyclk 9:fe5114551ec3 1531 {
daveyclk 9:fe5114551ec3 1532 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1533
daveyclk 9:fe5114551ec3 1534 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1535 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1536 tmp_f = true;
daveyclk 9:fe5114551ec3 1537 }
daveyclk 9:fe5114551ec3 1538 }
daveyclk 9:fe5114551ec3 1539
daveyclk 9:fe5114551ec3 1540 return tmp_resp;
daveyclk 9:fe5114551ec3 1541 }
daveyclk 9:fe5114551ec3 1542
daveyclk 9:fe5114551ec3 1543 uint16_t tts_codec_pause()
daveyclk 9:fe5114551ec3 1544 {
daveyclk 9:fe5114551ec3 1545 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1546 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1547 uint8_t tmp_data[ 2 ] = { 1, 0 };
daveyclk 9:fe5114551ec3 1548
daveyclk 9:fe5114551ec3 1549 tts_parse_req( ISC_SPCODEC_PAUSE_REQ , tmp_data, 2 );
daveyclk 9:fe5114551ec3 1550
daveyclk 9:fe5114551ec3 1551 while( !tts_rsp_chk( ISC_SPCODEC_PAUSE_RESP ) )
daveyclk 9:fe5114551ec3 1552 {
daveyclk 9:fe5114551ec3 1553 tts_get_resp();
daveyclk 9:fe5114551ec3 1554
daveyclk 9:fe5114551ec3 1555 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1556 return _err_code;
daveyclk 9:fe5114551ec3 1557 }
daveyclk 9:fe5114551ec3 1558
daveyclk 9:fe5114551ec3 1559 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1560
daveyclk 9:fe5114551ec3 1561 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1562 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1563
daveyclk 9:fe5114551ec3 1564 return tmp_resp;
daveyclk 9:fe5114551ec3 1565 }
daveyclk 9:fe5114551ec3 1566
daveyclk 9:fe5114551ec3 1567 uint16_t tts_codec_unpause()
daveyclk 9:fe5114551ec3 1568 {
daveyclk 9:fe5114551ec3 1569 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1570 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1571 uint8_t tmp_data[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1572
daveyclk 9:fe5114551ec3 1573 tts_parse_req( ISC_SPCODEC_PAUSE_REQ , tmp_data, 2 );
daveyclk 9:fe5114551ec3 1574
daveyclk 9:fe5114551ec3 1575 while( !tts_rsp_chk( ISC_SPCODEC_PAUSE_RESP ) )
daveyclk 9:fe5114551ec3 1576 {
daveyclk 9:fe5114551ec3 1577 tts_get_resp();
daveyclk 9:fe5114551ec3 1578
daveyclk 9:fe5114551ec3 1579 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1580 return _err_code;
daveyclk 9:fe5114551ec3 1581 }
daveyclk 9:fe5114551ec3 1582
daveyclk 9:fe5114551ec3 1583 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1584
daveyclk 9:fe5114551ec3 1585 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1586 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1587
daveyclk 9:fe5114551ec3 1588 return tmp_resp;
daveyclk 9:fe5114551ec3 1589 }
daveyclk 9:fe5114551ec3 1590
daveyclk 9:fe5114551ec3 1591 uint16_t tts_codec_stop( bool reset )
daveyclk 9:fe5114551ec3 1592 {
daveyclk 9:fe5114551ec3 1593 uint16_t tmp_resp = 0;
daveyclk 9:fe5114551ec3 1594 uint8_t raw_resp[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1595 uint8_t tmp_data[ 2 ] = { 0 };
daveyclk 9:fe5114551ec3 1596
daveyclk 9:fe5114551ec3 1597 if( reset )
daveyclk 9:fe5114551ec3 1598 tmp_data[ 0 ] = 1;
daveyclk 9:fe5114551ec3 1599
daveyclk 9:fe5114551ec3 1600 tts_parse_req( ISC_SPCODEC_STOP_REQ, tmp_data, 2 );
daveyclk 9:fe5114551ec3 1601
daveyclk 9:fe5114551ec3 1602 while( !tts_rsp_chk( ISC_SPCODEC_PAUSE_RESP ) )
daveyclk 9:fe5114551ec3 1603 {
daveyclk 9:fe5114551ec3 1604 tts_get_resp();
daveyclk 9:fe5114551ec3 1605
daveyclk 9:fe5114551ec3 1606 if( _parse_ind() )
daveyclk 9:fe5114551ec3 1607 return _err_code;
daveyclk 9:fe5114551ec3 1608 }
daveyclk 9:fe5114551ec3 1609
daveyclk 9:fe5114551ec3 1610 tts_rsp_data( raw_resp );
daveyclk 9:fe5114551ec3 1611
daveyclk 9:fe5114551ec3 1612 tmp_resp |= raw_resp[ 0 ];
daveyclk 9:fe5114551ec3 1613 tmp_resp |= raw_resp[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1614
daveyclk 9:fe5114551ec3 1615 return tmp_resp;
daveyclk 9:fe5114551ec3 1616 }
daveyclk 9:fe5114551ec3 1617 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 1618 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 1619 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
daveyclk 9:fe5114551ec3 1620 /**************************************************************************************************
daveyclk 9:fe5114551ec3 1621 * text_to_speech_hw.c
daveyclk 9:fe5114551ec3 1622 * -------------------------------------------------------------------------------------------------
daveyclk 9:fe5114551ec3 1623 * Overview: Mainly read and write functions with parsing
daveyclk 9:fe5114551ec3 1624 **************************************************************************************************/
daveyclk 9:fe5114551ec3 1625
daveyclk 9:fe5114551ec3 1626 void _read_rsp()
daveyclk 9:fe5114551ec3 1627 {
daveyclk 9:fe5114551ec3 1628 uint8_t tmp_byte = 0;
daveyclk 9:fe5114551ec3 1629 uint16_t tmp_len = 0;
daveyclk 9:fe5114551ec3 1630
daveyclk 9:fe5114551ec3 1631 tts_hal_cs_low();
daveyclk 9:fe5114551ec3 1632
daveyclk 9:fe5114551ec3 1633 tts_hal_read( &tmp_byte, 1 );
daveyclk 9:fe5114551ec3 1634
daveyclk 9:fe5114551ec3 1635 if( tmp_byte == START_MESSAGE )
daveyclk 9:fe5114551ec3 1636 {
daveyclk 9:fe5114551ec3 1637 tts_hal_read( ( uint8_t* )&_last_rsp, 2 );
daveyclk 9:fe5114551ec3 1638 tmp_len |= _last_rsp.len[ 0 ];
daveyclk 9:fe5114551ec3 1639 tmp_len |= _last_rsp.len[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1640 tts_hal_read( ( uint8_t* )&_last_rsp + 2, tmp_len );
daveyclk 9:fe5114551ec3 1641
daveyclk 9:fe5114551ec3 1642 } else {
daveyclk 9:fe5114551ec3 1643
daveyclk 9:fe5114551ec3 1644 wait( 0.005 );
daveyclk 9:fe5114551ec3 1645 }
daveyclk 9:fe5114551ec3 1646
daveyclk 9:fe5114551ec3 1647 tts_hal_cs_high();
daveyclk 9:fe5114551ec3 1648 }
daveyclk 9:fe5114551ec3 1649
daveyclk 9:fe5114551ec3 1650 void _write_req(bool boot)
daveyclk 9:fe5114551ec3 1651 {
daveyclk 9:fe5114551ec3 1652 uint16_t cnt = 0;
daveyclk 9:fe5114551ec3 1653 uint8_t start = START_MESSAGE;
daveyclk 9:fe5114551ec3 1654
daveyclk 9:fe5114551ec3 1655 cnt |= _last_req.len[ 0 ];
daveyclk 9:fe5114551ec3 1656 cnt |= _last_req.len[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1657
daveyclk 9:fe5114551ec3 1658 tts_hal_cs_low();
daveyclk 9:fe5114551ec3 1659
daveyclk 9:fe5114551ec3 1660
daveyclk 9:fe5114551ec3 1661 if(boot) // use for debug - displays the current buffer on serial
daveyclk 9:fe5114551ec3 1662 {
daveyclk 9:fe5114551ec3 1663 tts_hal_write( &start, 1, true );
daveyclk 9:fe5114551ec3 1664 tts_hal_write( ( uint8_t* )&_last_req, cnt, true);
daveyclk 9:fe5114551ec3 1665 }
daveyclk 9:fe5114551ec3 1666 else
daveyclk 9:fe5114551ec3 1667 {
daveyclk 9:fe5114551ec3 1668 tts_hal_write( &start, 1, false );
daveyclk 9:fe5114551ec3 1669 tts_hal_write( ( uint8_t* ) &_last_req, cnt, false );
daveyclk 9:fe5114551ec3 1670 }
daveyclk 9:fe5114551ec3 1671
daveyclk 9:fe5114551ec3 1672 tts_hal_cs_high();
daveyclk 9:fe5114551ec3 1673
daveyclk 9:fe5114551ec3 1674 }
daveyclk 9:fe5114551ec3 1675
daveyclk 9:fe5114551ec3 1676 /******************************************************************************
daveyclk 9:fe5114551ec3 1677 * Public Function Definitions
daveyclk 9:fe5114551ec3 1678 *******************************************************************************/
daveyclk 9:fe5114551ec3 1679 void tts_hw_init( void )
daveyclk 9:fe5114551ec3 1680 {
daveyclk 9:fe5114551ec3 1681 tts_hal_init();
daveyclk 9:fe5114551ec3 1682
daveyclk 9:fe5114551ec3 1683 _ticker_f = false;
daveyclk 9:fe5114551ec3 1684 _ticker = 0;
daveyclk 9:fe5114551ec3 1685
daveyclk 9:fe5114551ec3 1686 _last_req.idx[ 0 ] = 0;
daveyclk 9:fe5114551ec3 1687 _last_req.idx[ 1 ] = 0;
daveyclk 9:fe5114551ec3 1688 _last_req.len[ 0 ] = 0;
daveyclk 9:fe5114551ec3 1689 _last_req.len[ 1 ] = 0;
daveyclk 9:fe5114551ec3 1690 memset( _last_req.payload, 0, MAIN_MESSAGE_MAX );
daveyclk 9:fe5114551ec3 1691
daveyclk 9:fe5114551ec3 1692 _last_rsp.idx[ 0 ] = 255;
daveyclk 9:fe5114551ec3 1693 _last_rsp.idx[ 1 ] = 255;
daveyclk 9:fe5114551ec3 1694 _last_rsp.len[ 0 ] = 0;
daveyclk 9:fe5114551ec3 1695 _last_rsp.len[ 1 ] = 0;
daveyclk 9:fe5114551ec3 1696 memset( _last_rsp.payload, 0, RESP_MESSAGE_MAX );
daveyclk 9:fe5114551ec3 1697 }
daveyclk 9:fe5114551ec3 1698
daveyclk 9:fe5114551ec3 1699 void tts_tick_isr()
daveyclk 9:fe5114551ec3 1700 {
daveyclk 9:fe5114551ec3 1701 _ticker++;
daveyclk 9:fe5114551ec3 1702
daveyclk 9:fe5114551ec3 1703 if( _ticker > 500 )
daveyclk 9:fe5114551ec3 1704 _ticker_f == true;
daveyclk 9:fe5114551ec3 1705 }
daveyclk 9:fe5114551ec3 1706
daveyclk 9:fe5114551ec3 1707 void tts_mute_cmd( bool cmd )
daveyclk 9:fe5114551ec3 1708 {
daveyclk 9:fe5114551ec3 1709 if( cmd )
daveyclk 9:fe5114551ec3 1710 tts_hal_mut_high();
daveyclk 9:fe5114551ec3 1711 else
daveyclk 9:fe5114551ec3 1712 tts_hal_mut_low();
daveyclk 9:fe5114551ec3 1713 }
daveyclk 9:fe5114551ec3 1714
daveyclk 9:fe5114551ec3 1715 void tts_parse_req( uint16_t req,
daveyclk 9:fe5114551ec3 1716 uint8_t *payload,
daveyclk 9:fe5114551ec3 1717 uint16_t pl_len )
daveyclk 9:fe5114551ec3 1718 {
daveyclk 9:fe5114551ec3 1719 uint8_t *pl = payload;
daveyclk 9:fe5114551ec3 1720 uint16_t i = 0;
daveyclk 9:fe5114551ec3 1721 uint16_t tmp = pl_len + 4;
daveyclk 9:fe5114551ec3 1722
daveyclk 9:fe5114551ec3 1723 _last_req.len[ 0 ] = tmp & 0x00FF;
daveyclk 9:fe5114551ec3 1724 _last_req.len[ 1 ] = ( tmp & 0xFF00 ) >> 8;
daveyclk 9:fe5114551ec3 1725 _last_req.idx[ 0 ] = req & 0x00FF;
daveyclk 9:fe5114551ec3 1726 _last_req.idx[ 1 ] = ( req & 0xFF00 ) >> 8;
daveyclk 9:fe5114551ec3 1727 _last_rsp.idx[ 0 ] = 0xFF;
daveyclk 9:fe5114551ec3 1728 _last_rsp.idx[ 1 ] = 0xFF;
daveyclk 9:fe5114551ec3 1729
daveyclk 9:fe5114551ec3 1730 if ( payload != NULL )
daveyclk 9:fe5114551ec3 1731 {
daveyclk 9:fe5114551ec3 1732 while ( pl_len-- )
daveyclk 9:fe5114551ec3 1733 _last_req.payload[ i++ ] = *( pl++ );
daveyclk 9:fe5114551ec3 1734
daveyclk 9:fe5114551ec3 1735 }
daveyclk 9:fe5114551ec3 1736
daveyclk 9:fe5114551ec3 1737 _write_req(true);
daveyclk 9:fe5114551ec3 1738 }
daveyclk 9:fe5114551ec3 1739
daveyclk 9:fe5114551ec3 1740 void tts_parse_boot_img( const uint8_t *payload,
daveyclk 9:fe5114551ec3 1741 uint16_t pl_len )
daveyclk 9:fe5114551ec3 1742 {
daveyclk 9:fe5114551ec3 1743 uint16_t i = 0;
daveyclk 9:fe5114551ec3 1744 uint16_t tmp = pl_len + 0x04;
daveyclk 9:fe5114551ec3 1745
daveyclk 9:fe5114551ec3 1746 _last_req.len[ 0 ] = tmp & 0x00FF;
daveyclk 9:fe5114551ec3 1747 _last_req.len[ 1 ] = ( tmp & 0xFF00 ) >> 8;
daveyclk 9:fe5114551ec3 1748 _last_req.idx[ 0 ] = 0x00;
daveyclk 9:fe5114551ec3 1749 _last_req.idx[ 1 ] = 0x10;
daveyclk 9:fe5114551ec3 1750 _last_rsp.idx[ 0 ] = 0xFF;
daveyclk 9:fe5114551ec3 1751 _last_rsp.idx[ 1 ] = 0xFF;
daveyclk 9:fe5114551ec3 1752
daveyclk 9:fe5114551ec3 1753 if ( payload != NULL )
daveyclk 9:fe5114551ec3 1754 {
daveyclk 9:fe5114551ec3 1755 while ( pl_len-- )
daveyclk 9:fe5114551ec3 1756 _last_req.payload[ i++ ] = payload[ i ];
daveyclk 9:fe5114551ec3 1757 }
daveyclk 9:fe5114551ec3 1758
daveyclk 9:fe5114551ec3 1759 _write_req(true);
daveyclk 9:fe5114551ec3 1760 }
daveyclk 9:fe5114551ec3 1761
daveyclk 9:fe5114551ec3 1762 void tts_parse_speak_req( uint16_t req,
daveyclk 9:fe5114551ec3 1763 uint8_t flush_en,
daveyclk 9:fe5114551ec3 1764 char *word,
daveyclk 9:fe5114551ec3 1765 uint16_t word_len )
daveyclk 9:fe5114551ec3 1766 {
daveyclk 9:fe5114551ec3 1767 char *ptr = word;
daveyclk 9:fe5114551ec3 1768 uint16_t i = 1;
daveyclk 9:fe5114551ec3 1769 uint16_t tmp = word_len;
daveyclk 9:fe5114551ec3 1770
daveyclk 9:fe5114551ec3 1771 word_len += 7;
daveyclk 9:fe5114551ec3 1772
daveyclk 9:fe5114551ec3 1773 _last_req.len[ 0 ] = word_len & 0x00FF;
daveyclk 9:fe5114551ec3 1774 _last_req.len[ 1 ] = ( word_len & 0xFF00 ) >> 8;
daveyclk 9:fe5114551ec3 1775 _last_req.idx[ 0 ] = req & 0x00FF;
daveyclk 9:fe5114551ec3 1776 _last_req.idx[ 1 ] = ( req & 0xFF00 ) >> 8;
daveyclk 9:fe5114551ec3 1777 _last_rsp.idx[ 0 ] = 0xFF;
daveyclk 9:fe5114551ec3 1778 _last_rsp.idx[ 1 ] = 0xFF;
daveyclk 9:fe5114551ec3 1779
daveyclk 9:fe5114551ec3 1780 if( flush_en )
daveyclk 9:fe5114551ec3 1781 {
daveyclk 9:fe5114551ec3 1782 _last_req.payload[ 0 ] = 1;
daveyclk 9:fe5114551ec3 1783
daveyclk 9:fe5114551ec3 1784 } else {
daveyclk 9:fe5114551ec3 1785
daveyclk 9:fe5114551ec3 1786 _last_req.payload[ 0 ] = 0;
daveyclk 9:fe5114551ec3 1787 }
daveyclk 9:fe5114551ec3 1788
daveyclk 9:fe5114551ec3 1789 while( tmp-- )
daveyclk 9:fe5114551ec3 1790 _last_req.payload[ i++ ] = *( ptr++ );
daveyclk 9:fe5114551ec3 1791
daveyclk 9:fe5114551ec3 1792 _last_req.payload[ i++ ] = 0x20;
daveyclk 9:fe5114551ec3 1793 _last_req.payload[ i ] = 0x00;
daveyclk 9:fe5114551ec3 1794
daveyclk 9:fe5114551ec3 1795 _write_req(true);
daveyclk 9:fe5114551ec3 1796 }
daveyclk 9:fe5114551ec3 1797
daveyclk 9:fe5114551ec3 1798 void tts_get_resp()
daveyclk 9:fe5114551ec3 1799 {
daveyclk 9:fe5114551ec3 1800 // only read if ready
daveyclk 9:fe5114551ec3 1801 if( tts_hal_msg_rdy() )
daveyclk 9:fe5114551ec3 1802 {
daveyclk 9:fe5114551ec3 1803 _read_rsp();
daveyclk 9:fe5114551ec3 1804 }
daveyclk 9:fe5114551ec3 1805 }
daveyclk 9:fe5114551ec3 1806
daveyclk 9:fe5114551ec3 1807 bool tts_rsp_chk( uint16_t idx )
daveyclk 9:fe5114551ec3 1808 {
daveyclk 9:fe5114551ec3 1809 uint16_t tmp = 0;
daveyclk 9:fe5114551ec3 1810
daveyclk 9:fe5114551ec3 1811 tmp |= _last_rsp.idx[ 0 ];
daveyclk 9:fe5114551ec3 1812 tmp |= _last_rsp.idx[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1813
daveyclk 9:fe5114551ec3 1814 return ( idx == tmp ) ? true : false;
daveyclk 9:fe5114551ec3 1815 }
daveyclk 9:fe5114551ec3 1816
daveyclk 9:fe5114551ec3 1817 uint16_t tts_rsp_idx()
daveyclk 9:fe5114551ec3 1818 {
daveyclk 9:fe5114551ec3 1819 uint16_t tmp = 0;
daveyclk 9:fe5114551ec3 1820
daveyclk 9:fe5114551ec3 1821 tmp |= _last_rsp.idx[ 0 ];
daveyclk 9:fe5114551ec3 1822 tmp |= _last_rsp.idx[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1823
daveyclk 9:fe5114551ec3 1824 return tmp;
daveyclk 9:fe5114551ec3 1825 }
daveyclk 9:fe5114551ec3 1826
daveyclk 9:fe5114551ec3 1827 void tts_rsp_data( uint8_t *buffer )
daveyclk 9:fe5114551ec3 1828 {
daveyclk 9:fe5114551ec3 1829 uint8_t *bfr = buffer;
daveyclk 9:fe5114551ec3 1830 uint16_t cnt = 0;
daveyclk 9:fe5114551ec3 1831 uint8_t *ptr = _last_rsp.payload;
daveyclk 9:fe5114551ec3 1832
daveyclk 9:fe5114551ec3 1833 cnt |= _last_rsp.len[ 0 ];
daveyclk 9:fe5114551ec3 1834 cnt |= _last_rsp.len[ 1 ] << 8;
daveyclk 9:fe5114551ec3 1835 cnt -= 4;
daveyclk 9:fe5114551ec3 1836
daveyclk 9:fe5114551ec3 1837 while( cnt-- )
daveyclk 9:fe5114551ec3 1838 *( bfr++ ) = *( ptr++ );
daveyclk 9:fe5114551ec3 1839 }
daveyclk 9:fe5114551ec3 1840
daveyclk 9:fe5114551ec3 1841 /*************** END OF FUNCTIONS *********************************************/