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:14:00 2016 +0000
Revision:
10:9416dedd3bf4
Parent:
9:fe5114551ec3
This is the first release of the iBreathalyzer that can now talk thanks to the text to speech click board

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 *********************************************/