htr

Dependencies:   mbed AdafruitST7735 BLE_API Adafruit_GFX nRF51822

Committer:
tekasijimo
Date:
Sun Aug 11 13:43:37 2019 +0000
Revision:
19:02bb67cb303c
Parent:
18:0cbeb28ce4f6
derfthe

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedAustin 0:5375be4301ed 1 #include "mbed.h"
andresag 14:1c15d473b42f 2 #include "ble/BLE.h"
tekasijimo 19:02bb67cb303c 3 #include "Adafruit_GFX/Adafruit_GFX.h"
tekasijimo 19:02bb67cb303c 4 #include "AdafruitST7735/Adafruit_ST7735.h"
andresag 14:1c15d473b42f 5
tekasijimo 19:02bb67cb303c 6 // Конфигурация BLE
tekasijimo 19:02bb67cb303c 7 const static uint16_t SERVICE_UUID = 0xA000;
tekasijimo 19:02bb67cb303c 8 const static char DEVICE_NAME[] = "HPSP BT-Lite";
tekasijimo 19:02bb67cb303c 9
tekasijimo 19:02bb67cb303c 10 // Настройка выводов
tekasijimo 19:02bb67cb303c 11 DigitalOut led1(P0_21);
tekasijimo 19:02bb67cb303c 12 DigitalOut DISP_LED (P0_16);
tekasijimo 19:02bb67cb303c 13 DigitalIn key1 (P0_8);
tekasijimo 19:02bb67cb303c 14 DigitalIn key2 (P0_17);
tekasijimo 19:02bb67cb303c 15 DigitalOut OSC (P0_6);
tekasijimo 19:02bb67cb303c 16
tekasijimo 19:02bb67cb303c 17 #define TFT_MISO P0_4 // NC(NC) //Не подключен так как отсутсвует на дисплее
tekasijimo 19:02bb67cb303c 18 #define TFT_RST P0_9 // RST(5)
tekasijimo 19:02bb67cb303c 19 #define TFT_DC P0_10 // D/C(6) // не работает на 10
tekasijimo 19:02bb67cb303c 20 #define TFT_MOSI P0_11 // DIN(7)
tekasijimo 19:02bb67cb303c 21 #define TFT_SCK P0_12 // CLK(8)
tekasijimo 19:02bb67cb303c 22 #define TFT_SS P0_13 // CS(11)
tekasijimo 19:02bb67cb303c 23
tekasijimo 19:02bb67cb303c 24 //
tekasijimo 19:02bb67cb303c 25 Adafruit_ST7735 tft(TFT_MOSI, TFT_MISO, TFT_SCK, TFT_SS, TFT_DC, TFT_RST); // MOSI, MISO, SCLK, SSEL, TFT_DC, TFT_RST
maxxir 16:a84185b72bae 26
tekasijimo 19:02bb67cb303c 27 // Назначение цветов
tekasijimo 19:02bb67cb303c 28 #define BLACK 0x0000
tekasijimo 19:02bb67cb303c 29 #define BLUE 0x001F
tekasijimo 19:02bb67cb303c 30 #define RED 0xF800
tekasijimo 19:02bb67cb303c 31 #define GREEN 0x07E0
tekasijimo 19:02bb67cb303c 32 #define CYAN 0x07FF
tekasijimo 19:02bb67cb303c 33 #define MAGENTA 0xF81F
tekasijimo 19:02bb67cb303c 34 #define YELLOW 0xFFE0
tekasijimo 19:02bb67cb303c 35 #define WHITE 0xFFFF
tekasijimo 19:02bb67cb303c 36 int COLOR = WHITE;
tekasijimo 19:02bb67cb303c 37
tekasijimo 19:02bb67cb303c 38 Timeout KEY_TIME; // Счетчик для таймера работы программы
tekasijimo 19:02bb67cb303c 39 short FLAG = 0; // Флаг старта программы
tekasijimo 19:02bb67cb303c 40 unsigned int HOUR = 0; // Часы
tekasijimo 19:02bb67cb303c 41 unsigned int MIN = 0; // Минуты
tekasijimo 19:02bb67cb303c 42 unsigned int SEC = 0; // Секунды
tekasijimo 19:02bb67cb303c 43 unsigned int TIME_PROGRAMM = 5400; // Время работы программы
tekasijimo 19:02bb67cb303c 44 int START = 0;
tekasijimo 19:02bb67cb303c 45 // Переменные типа char для дисплея
tekasijimo 19:02bb67cb303c 46 char HOUR_CHAR[2] = {'0', '0'};
tekasijimo 19:02bb67cb303c 47 char MIN_CHAR[2] = {'0', '0'};
tekasijimo 19:02bb67cb303c 48 char SEC_CHAR[2] = {'0', '0'};
tekasijimo 19:02bb67cb303c 49 int r = 20;
tekasijimo 19:02bb67cb303c 50
tekasijimo 19:02bb67cb303c 51 //static UARTService* uartService;
tekasijimo 19:02bb67cb303c 52
tekasijimo 19:02bb67cb303c 53 //static EventQueue eventQueue(
tekasijimo 19:02bb67cb303c 54 // /* event count */ 16 * /* event size */ 32
tekasijimo 19:02bb67cb303c 55 //);
maxxir 16:a84185b72bae 56
tekasijimo 19:02bb67cb303c 57 Ticker ticker;
tekasijimo 19:02bb67cb303c 58
tekasijimo 19:02bb67cb303c 59 char freq_storage[900] = {0}; //резервируем блок памяти в EEPROM для хранения частот
tekasijimo 19:02bb67cb303c 60 char timer_storage[100] = {0}; //резервируем блок памяти в EEPROM для хранения таймеров
tekasijimo 19:02bb67cb303c 61
tekasijimo 19:02bb67cb303c 62 char* freq_storage_pos = freq_storage;
tekasijimo 19:02bb67cb303c 63 char* timer_storage_pos = timer_storage;
tekasijimo 19:02bb67cb303c 64
tekasijimo 19:02bb67cb303c 65 void generate()
maxxir 16:a84185b72bae 66 {
tekasijimo 19:02bb67cb303c 67 char* freq_storage_pos = freq_storage;
tekasijimo 19:02bb67cb303c 68 unsigned short freq;
tekasijimo 19:02bb67cb303c 69 unsigned short duration = 180; // длительность
tekasijimo 19:02bb67cb303c 70
tekasijimo 19:02bb67cb303c 71 memcpy( &freq, freq_storage_pos, sizeof(freq) );
tekasijimo 19:02bb67cb303c 72 freq_storage_pos += sizeof(freq);
tekasijimo 19:02bb67cb303c 73
tekasijimo 19:02bb67cb303c 74 while ( freq != 0 )
tekasijimo 19:02bb67cb303c 75 {
tekasijimo 19:02bb67cb303c 76 memcpy( &duration, freq_storage_pos, sizeof(duration) );
tekasijimo 19:02bb67cb303c 77 freq_storage_pos += sizeof(duration);
tekasijimo 19:02bb67cb303c 78
tekasijimo 19:02bb67cb303c 79 // распаковываем частоту
tekasijimo 19:02bb67cb303c 80 float real_freq;
tekasijimo 19:02bb67cb303c 81 if ( freq <= 1000 )
tekasijimo 19:02bb67cb303c 82 {
tekasijimo 19:02bb67cb303c 83 real_freq = (float)freq / 100;
tekasijimo 19:02bb67cb303c 84 }
tekasijimo 19:02bb67cb303c 85 else if ( freq <= 11000 )
tekasijimo 19:02bb67cb303c 86 {
tekasijimo 19:02bb67cb303c 87 real_freq = (float)(freq - 1000) / 10;
tekasijimo 19:02bb67cb303c 88 }
tekasijimo 19:02bb67cb303c 89 else
tekasijimo 19:02bb67cb303c 90 {
tekasijimo 19:02bb67cb303c 91 real_freq = freq - 10000;
tekasijimo 19:02bb67cb303c 92 }
tekasijimo 19:02bb67cb303c 93
tekasijimo 19:02bb67cb303c 94 float real_duration = (float)duration * 1000;
tekasijimo 19:02bb67cb303c 95
tekasijimo 19:02bb67cb303c 96 OSC = 1;
tekasijimo 19:02bb67cb303c 97 wait_ms(real_duration);
tekasijimo 19:02bb67cb303c 98 OSC = 0;
tekasijimo 19:02bb67cb303c 99
tekasijimo 19:02bb67cb303c 100 /*
tekasijimo 19:02bb67cb303c 101 digitalWrite(led, HIGH);
tekasijimo 19:02bb67cb303c 102 tone(ant, real_freq);
tekasijimo 19:02bb67cb303c 103 customDelay(real_duration);
tekasijimo 19:02bb67cb303c 104 noTone(ant);
tekasijimo 19:02bb67cb303c 105 digitalWrite(led, LOW);
tekasijimo 19:02bb67cb303c 106 */
tekasijimo 19:02bb67cb303c 107
tekasijimo 19:02bb67cb303c 108 memcpy( &freq, freq_storage_pos, sizeof(freq) );
tekasijimo 19:02bb67cb303c 109 freq_storage_pos += sizeof(freq);
tekasijimo 19:02bb67cb303c 110 }
maxxir 16:a84185b72bae 111 }
maxxir 16:a84185b72bae 112
tekasijimo 19:02bb67cb303c 113 int frequencies_scan_mode = 1;
tekasijimo 19:02bb67cb303c 114
tekasijimo 19:02bb67cb303c 115 int parse_bt_data( char *buffer // буфер, в котором уже лежат принятые данные в виде стандартной C строки
tekasijimo 19:02bb67cb303c 116 )
tekasijimo 19:02bb67cb303c 117 {
tekasijimo 19:02bb67cb303c 118 if ( buffer == NULL) // проверяем корректность входных данных
tekasijimo 19:02bb67cb303c 119 {
tekasijimo 19:02bb67cb303c 120 return 0;
tekasijimo 19:02bb67cb303c 121 }
tekasijimo 19:02bb67cb303c 122
tekasijimo 19:02bb67cb303c 123 // вспомогательные переменные
tekasijimo 19:02bb67cb303c 124 char *current = buffer; // указатель на текущий символ
tekasijimo 19:02bb67cb303c 125
tekasijimo 19:02bb67cb303c 126 // сканируем частоты
tekasijimo 19:02bb67cb303c 127 while ( frequencies_scan_mode != 0 && *current != 0 )
tekasijimo 19:02bb67cb303c 128 {
tekasijimo 19:02bb67cb303c 129 if ( *current == ':' )
tekasijimo 19:02bb67cb303c 130 {
tekasijimo 19:02bb67cb303c 131 break; // выходим, так как частоты закончились
tekasijimo 19:02bb67cb303c 132 }
tekasijimo 19:02bb67cb303c 133
tekasijimo 19:02bb67cb303c 134 unsigned long freq; // частота в сотых долях герца
tekasijimo 19:02bb67cb303c 135 unsigned long duration; // длительность в секундах
tekasijimo 19:02bb67cb303c 136 char separator[2]; // разделитель
tekasijimo 19:02bb67cb303c 137
tekasijimo 19:02bb67cb303c 138 int symbols_read;
tekasijimo 19:02bb67cb303c 139 int values_read = sscanf( current, "%ld %ld%1[,:]%n", &freq, &duration, separator, &symbols_read); // считываем частоту и длительность
tekasijimo 19:02bb67cb303c 140
tekasijimo 19:02bb67cb303c 141 if ( values_read != 3 )
tekasijimo 19:02bb67cb303c 142 {
tekasijimo 19:02bb67cb303c 143 // закончился буффер
tekasijimo 19:02bb67cb303c 144 // копируем оставшиеся данные в начало буффера
tekasijimo 19:02bb67cb303c 145 int rest_len = strlen( current ); // длина остатка в буффере
tekasijimo 19:02bb67cb303c 146 memmove( buffer, current, rest_len );
tekasijimo 19:02bb67cb303c 147 return rest_len;
tekasijimo 19:02bb67cb303c 148 }
tekasijimo 19:02bb67cb303c 149
tekasijimo 19:02bb67cb303c 150 // кодируем частоту для умещения в память
tekasijimo 19:02bb67cb303c 151 unsigned short packed_freq;
tekasijimo 19:02bb67cb303c 152 if ( freq <= 10 * 100 ) // 10Гц
tekasijimo 19:02bb67cb303c 153 {
tekasijimo 19:02bb67cb303c 154 packed_freq = freq;
tekasijimo 19:02bb67cb303c 155 }
tekasijimo 19:02bb67cb303c 156 else if ( freq <= 1000 * 100 ) // 1кГц
tekasijimo 19:02bb67cb303c 157 {
tekasijimo 19:02bb67cb303c 158 packed_freq = 1000 + freq / 10;
tekasijimo 19:02bb67cb303c 159 }
tekasijimo 19:02bb67cb303c 160 else
tekasijimo 19:02bb67cb303c 161 {
tekasijimo 19:02bb67cb303c 162 packed_freq = 10000 + freq / 100;
tekasijimo 19:02bb67cb303c 163 }
tekasijimo 19:02bb67cb303c 164
tekasijimo 19:02bb67cb303c 165 // сохраняем данные в EEPROM
tekasijimo 19:02bb67cb303c 166 memcpy( freq_storage_pos, &packed_freq, sizeof(packed_freq) );
tekasijimo 19:02bb67cb303c 167 freq_storage_pos += sizeof(packed_freq);
tekasijimo 19:02bb67cb303c 168 memcpy( freq_storage_pos, &duration, sizeof(duration) );
tekasijimo 19:02bb67cb303c 169 freq_storage_pos += sizeof(duration);
tekasijimo 19:02bb67cb303c 170
tekasijimo 19:02bb67cb303c 171 // моргаем после каждых данных
tekasijimo 19:02bb67cb303c 172 //led2 = !led2;
tekasijimo 19:02bb67cb303c 173
tekasijimo 19:02bb67cb303c 174 current += symbols_read; //переходим к следующей паре
tekasijimo 19:02bb67cb303c 175
tekasijimo 19:02bb67cb303c 176 if ( *separator == ':' )
tekasijimo 19:02bb67cb303c 177 {
tekasijimo 19:02bb67cb303c 178 // пишем признак конца данных
tekasijimo 19:02bb67cb303c 179 unsigned short end = 0;
tekasijimo 19:02bb67cb303c 180 memcpy( freq_storage_pos, &end, sizeof(end) );
tekasijimo 19:02bb67cb303c 181
tekasijimo 19:02bb67cb303c 182 frequencies_scan_mode = 0; // загрузка частот завершена
tekasijimo 19:02bb67cb303c 183 break;
tekasijimo 19:02bb67cb303c 184 }
tekasijimo 19:02bb67cb303c 185 }
tekasijimo 19:02bb67cb303c 186
tekasijimo 19:02bb67cb303c 187 // сканируем таймеры
tekasijimo 19:02bb67cb303c 188 while ( *current != 0 )
tekasijimo 19:02bb67cb303c 189 {
tekasijimo 19:02bb67cb303c 190 if ( *current == '.' )
tekasijimo 19:02bb67cb303c 191 {
tekasijimo 19:02bb67cb303c 192 break; // выходим, так как таймеры закончились
tekasijimo 19:02bb67cb303c 193 }
tekasijimo 19:02bb67cb303c 194
tekasijimo 19:02bb67cb303c 195 unsigned int timer_start;
tekasijimo 19:02bb67cb303c 196
tekasijimo 19:02bb67cb303c 197 int symbols_read;
tekasijimo 19:02bb67cb303c 198 char separator[2]; //разделитель
tekasijimo 19:02bb67cb303c 199 int values_read = sscanf( current, "%d%1[,.]%n", &timer_start, separator, &symbols_read); //считываем время до запуска таймера
maxxir 16:a84185b72bae 200
tekasijimo 19:02bb67cb303c 201 if ( values_read != 2 )
tekasijimo 19:02bb67cb303c 202 {
tekasijimo 19:02bb67cb303c 203 // закончился буффер
tekasijimo 19:02bb67cb303c 204 // копируем оставшиеся данные в начало буффера
tekasijimo 19:02bb67cb303c 205 int rest_len = strlen( current ); // длина остатка в буффере
tekasijimo 19:02bb67cb303c 206 memmove( buffer, current, rest_len );
tekasijimo 19:02bb67cb303c 207 return rest_len;
tekasijimo 19:02bb67cb303c 208 }
tekasijimo 19:02bb67cb303c 209
tekasijimo 19:02bb67cb303c 210 // сохраняем данные в EEPROM
tekasijimo 19:02bb67cb303c 211 //eeprom_write_block( timer_start, timer_storage_pos, sizeof(timer_start) );
tekasijimo 19:02bb67cb303c 212 //timer_storage_pos += sizeof(timer_start);
tekasijimo 19:02bb67cb303c 213
tekasijimo 19:02bb67cb303c 214 current += symbols_read; //переходим к следующей паре
tekasijimo 19:02bb67cb303c 215
tekasijimo 19:02bb67cb303c 216 if ( *separator == '.' )
tekasijimo 19:02bb67cb303c 217 {
tekasijimo 19:02bb67cb303c 218 // пишем признак конца данных
tekasijimo 19:02bb67cb303c 219 unsigned short end = 0;
tekasijimo 19:02bb67cb303c 220 memcpy( timer_storage_pos, &end, sizeof(end) );
tekasijimo 19:02bb67cb303c 221 break; // конец данных
tekasijimo 19:02bb67cb303c 222 }
tekasijimo 19:02bb67cb303c 223 }
tekasijimo 19:02bb67cb303c 224
tekasijimo 19:02bb67cb303c 225 return 0;
tekasijimo 19:02bb67cb303c 226 }
tekasijimo 19:02bb67cb303c 227
tekasijimo 19:02bb67cb303c 228 void updateSensorValue()
tekasijimo 19:02bb67cb303c 229 {
tekasijimo 19:02bb67cb303c 230
tekasijimo 19:02bb67cb303c 231 }
tekasijimo 19:02bb67cb303c 232
tekasijimo 19:02bb67cb303c 233 void periodicCallback(void)
tekasijimo 19:02bb67cb303c 234 {
tekasijimo 19:02bb67cb303c 235 OSC = !OSC; /* Do blinky on LED1 to indicate system aliveness. */
tekasijimo 19:02bb67cb303c 236 TIME_PROGRAMM--;
tekasijimo 19:02bb67cb303c 237 r = r + 2;
tekasijimo 19:02bb67cb303c 238 if (r >= 60){
tekasijimo 19:02bb67cb303c 239 r = 30;
tekasijimo 19:02bb67cb303c 240 if(COLOR == WHITE){
tekasijimo 19:02bb67cb303c 241 COLOR = BLACK;
tekasijimo 19:02bb67cb303c 242 }
tekasijimo 19:02bb67cb303c 243 else (COLOR = WHITE);
tekasijimo 19:02bb67cb303c 244 };
tekasijimo 19:02bb67cb303c 245 if (BLE::Instance().getGapState().connected) {
tekasijimo 19:02bb67cb303c 246 // eventQueue.call(updateSensorValue);
tekasijimo 19:02bb67cb303c 247 }
tekasijimo 19:02bb67cb303c 248 }
tekasijimo 19:02bb67cb303c 249
tekasijimo 19:02bb67cb303c 250 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
tekasijimo 19:02bb67cb303c 251 {
tekasijimo 19:02bb67cb303c 252 tft.fillScreen(ST7735_BLACK);
tekasijimo 19:02bb67cb303c 253 FLAG = 1;
tekasijimo 19:02bb67cb303c 254 r= 30;
tekasijimo 19:02bb67cb303c 255 }
tekasijimo 19:02bb67cb303c 256
tekasijimo 19:02bb67cb303c 257 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
tekasijimo 19:02bb67cb303c 258 {
tekasijimo 19:02bb67cb303c 259 BLE::Instance().gap().startAdvertising();
tekasijimo 19:02bb67cb303c 260 tft.fillScreen(ST7735_BLACK);
tekasijimo 19:02bb67cb303c 261 FLAG = 1;
tekasijimo 19:02bb67cb303c 262 r= 30;
tekasijimo 19:02bb67cb303c 263 }
tekasijimo 19:02bb67cb303c 264
tekasijimo 19:02bb67cb303c 265 #define INPUT_BUFFER_SIZE 50
tekasijimo 19:02bb67cb303c 266 char buffer[INPUT_BUFFER_SIZE + 1]; //приемный буффер
tekasijimo 19:02bb67cb303c 267 static int config_complete = 0;
tekasijimo 19:02bb67cb303c 268
tekasijimo 19:02bb67cb303c 269 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
tekasijimo 19:02bb67cb303c 270 if ( params != NULL )
tekasijimo 19:02bb67cb303c 271 {
tekasijimo 19:02bb67cb303c 272 //led2 = 0;
tekasijimo 19:02bb67cb303c 273 unsigned int buffer_pos = 0; //текущая позиция в буффере
tekasijimo 19:02bb67cb303c 274
tekasijimo 19:02bb67cb303c 275 //если есть данные - читаем
tekasijimo 19:02bb67cb303c 276 while ( buffer_pos < params->len )
tekasijimo 19:02bb67cb303c 277 {
tekasijimo 19:02bb67cb303c 278 //загоняем прочитанное в буфер
tekasijimo 19:02bb67cb303c 279 char symbol = params->data[buffer_pos++];
tekasijimo 19:02bb67cb303c 280 buffer[buffer_pos] = symbol;
tekasijimo 19:02bb67cb303c 281 if ( symbol == '.')
tekasijimo 19:02bb67cb303c 282 {
tekasijimo 19:02bb67cb303c 283 buffer[buffer_pos] = 0; // закрываем строку
tekasijimo 19:02bb67cb303c 284 parse_bt_data(buffer); // обрабатываем полученный кусок данных
tekasijimo 19:02bb67cb303c 285
tekasijimo 19:02bb67cb303c 286 // конец данных, прекращаем чтение
tekasijimo 19:02bb67cb303c 287 // данные получены, надо выставить флаг и больше из BT не читать
tekasijimo 19:02bb67cb303c 288 config_complete = 1;
tekasijimo 19:02bb67cb303c 289 break;
tekasijimo 19:02bb67cb303c 290 }
tekasijimo 19:02bb67cb303c 291
tekasijimo 19:02bb67cb303c 292 if ( buffer_pos == INPUT_BUFFER_SIZE )
tekasijimo 19:02bb67cb303c 293 {
tekasijimo 19:02bb67cb303c 294 buffer[INPUT_BUFFER_SIZE] = 0; //символ конца строки для полностью заполненного буффера
tekasijimo 19:02bb67cb303c 295 buffer_pos = parse_bt_data(buffer); // обрабатываем полученный кусок данных
tekasijimo 19:02bb67cb303c 296 }
tekasijimo 19:02bb67cb303c 297 }
tekasijimo 19:02bb67cb303c 298 //led2 = 1;
tekasijimo 19:02bb67cb303c 299 }
tekasijimo 19:02bb67cb303c 300 }
maxxir 16:a84185b72bae 301
maxxir 16:a84185b72bae 302 // GATT service and characteristic UUIDs
tekasijimo 19:02bb67cb303c 303 const uint8_t nRF51ServiceUUID[UUID::LENGTH_OF_LONG_UUID] = {
tekasijimo 19:02bb67cb303c 304 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
tekasijimo 19:02bb67cb303c 305 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
tekasijimo 19:02bb67cb303c 306 };
tekasijimo 19:02bb67cb303c 307 const uint8_t nRF51ServiceUUIDreversed[UUID::LENGTH_OF_LONG_UUID] = {
tekasijimo 19:02bb67cb303c 308 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
tekasijimo 19:02bb67cb303c 309 0x00, 0x10, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00
tekasijimo 19:02bb67cb303c 310 };
tekasijimo 19:02bb67cb303c 311 const UUID nRF51_GATT_SERVICE = UUID("00001101-0000-1000-8000-00805F9B34FB");
tekasijimo 19:02bb67cb303c 312 //const UUID nRF51_GATT_CHAR_BUTTON = UUID((uint8_t *)"nRF51-DK button ");
tekasijimo 19:02bb67cb303c 313 const UUID nRF51_GATT_CHAR_LED = UUID("00001102-0000-1000-8000-00805F9B34FB");
maxxir 16:a84185b72bae 314
tekasijimo 19:02bb67cb303c 315 //#define CHARACTERISTIC_BUTTON 0
tekasijimo 19:02bb67cb303c 316 #define CHARACTERISTIC_LED 0
tekasijimo 19:02bb67cb303c 317 #define CHARACTERISTIC_COUNT 1
maxxir 16:a84185b72bae 318
maxxir 16:a84185b72bae 319 // our bluetooth smart objects
maxxir 16:a84185b72bae 320 GattService *gatt_service;
maxxir 16:a84185b72bae 321 GattCharacteristic *gatt_characteristics[CHARACTERISTIC_COUNT];
maxxir 16:a84185b72bae 322 uint8_t gatt_char_value[CHARACTERISTIC_COUNT];
maxxir 16:a84185b72bae 323
tekasijimo 19:02bb67cb303c 324 /**
tekasijimo 19:02bb67cb303c 325 Callback triggered when the ble initialization process has finished
tekasijimo 19:02bb67cb303c 326 */
tekasijimo 19:02bb67cb303c 327 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
tekasijimo 19:02bb67cb303c 328 {
tekasijimo 19:02bb67cb303c 329 BLE& ble = params->ble;
tekasijimo 19:02bb67cb303c 330 ble_error_t error = params->error;
maxxir 16:a84185b72bae 331
tekasijimo 19:02bb67cb303c 332 if (error != BLE_ERROR_NONE) {
tekasijimo 19:02bb67cb303c 333 /* In case of error, forward the error handling to onBleInitError */
tekasijimo 19:02bb67cb303c 334 //onBleInitError(ble, error);
tekasijimo 19:02bb67cb303c 335 return;
tekasijimo 19:02bb67cb303c 336 }
maxxir 16:a84185b72bae 337
tekasijimo 19:02bb67cb303c 338 /* Ensure that it is the default instance of BLE */
tekasijimo 19:02bb67cb303c 339 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
tekasijimo 19:02bb67cb303c 340 return;
tekasijimo 19:02bb67cb303c 341 }
tekasijimo 19:02bb67cb303c 342
tekasijimo 19:02bb67cb303c 343 ble.gap().onDisconnection(disconnectionCallback);
tekasijimo 19:02bb67cb303c 344 ble.gattServer().onDataWritten(onDataWrittenCallback);
tekasijimo 19:02bb67cb303c 345
tekasijimo 19:02bb67cb303c 346 // bool initialValueForLEDCharacteristic = false;
andresag 14:1c15d473b42f 347
tekasijimo 19:02bb67cb303c 348 /* Setup primary service. */
tekasijimo 19:02bb67cb303c 349 //uartService = new UARTService(ble);
tekasijimo 19:02bb67cb303c 350
tekasijimo 19:02bb67cb303c 351 /* Setup advertising. */
tekasijimo 19:02bb67cb303c 352 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
tekasijimo 19:02bb67cb303c 353 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
tekasijimo 19:02bb67cb303c 354 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (uint8_t *)nRF51ServiceUUIDreversed, sizeof(nRF51ServiceUUIDreversed));
tekasijimo 19:02bb67cb303c 355 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
tekasijimo 19:02bb67cb303c 356 ble.gap().setAdvertisingInterval(100); /* 100ms. */
tekasijimo 19:02bb67cb303c 357
tekasijimo 19:02bb67cb303c 358 // add our gatt service with two characteristics
tekasijimo 19:02bb67cb303c 359 ble.addService(*gatt_service);
maxxir 16:a84185b72bae 360
tekasijimo 19:02bb67cb303c 361 ble.gap().startAdvertising();
tekasijimo 19:02bb67cb303c 362 }
tekasijimo 19:02bb67cb303c 363
tekasijimo 19:02bb67cb303c 364 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
tekasijimo 19:02bb67cb303c 365 BLE &ble = BLE::Instance();
tekasijimo 19:02bb67cb303c 366 // eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
tekasijimo 19:02bb67cb303c 367 led2 = !led2;
tekasijimo 19:02bb67cb303c 368 }
tekasijimo 19:02bb67cb303c 369
tekasijimo 19:02bb67cb303c 370 void BUTTON () {
tekasijimo 19:02bb67cb303c 371 if (!key1){
tekasijimo 19:02bb67cb303c 372 START = 0;
maxxir 16:a84185b72bae 373 }
maxxir 16:a84185b72bae 374 }
maxxir 16:a84185b72bae 375
tekasijimo 19:02bb67cb303c 376 // Основной цикл
tekasijimo 19:02bb67cb303c 377 int main(void)
maxxir 16:a84185b72bae 378 {
tekasijimo 19:02bb67cb303c 379 DISP_LED = 0; // Инициализация дисплея
tekasijimo 19:02bb67cb303c 380 tft.initR(INITR_144GREENTAB);
tekasijimo 19:02bb67cb303c 381 //tft.invertDisplay(true); // Инвертирование цветов дисплея для корректного отображения цветов
tekasijimo 19:02bb67cb303c 382 tft.fillScreen(ST7735_BLACK); // Заливка черным цветом
tekasijimo 19:02bb67cb303c 383 tft.setTextColor(WHITE); // Установка цвета текста
tekasijimo 19:02bb67cb303c 384 tft.setCursor(40, 48);
tekasijimo 19:02bb67cb303c 385 tft.setTextSize(2);
tekasijimo 19:02bb67cb303c 386 tft.printf("HPSP");
tekasijimo 19:02bb67cb303c 387 tft.setCursor(22, 64);
tekasijimo 19:02bb67cb303c 388 tft.printf("BT-Lite");
tekasijimo 19:02bb67cb303c 389 wait(1);
tekasijimo 19:02bb67cb303c 390 tft.setTextSize(1);
tekasijimo 19:02bb67cb303c 391 tft.setCursor(2, 110);
tekasijimo 19:02bb67cb303c 392 tft.printf("HPSP BT-Lite V:pre0.2");
tekasijimo 19:02bb67cb303c 393 tft.setCursor(2, 120);
tekasijimo 19:02bb67cb303c 394 tft.printf("NOT FOR SALE");
tekasijimo 19:02bb67cb303c 395 wait(2);
tekasijimo 19:02bb67cb303c 396 tft.fillScreen(ST7735_BLACK);
tekasijimo 19:02bb67cb303c 397 tft.setTextSize(2);
tekasijimo 19:02bb67cb303c 398 tft.setCursor(10, 57);
tekasijimo 19:02bb67cb303c 399 tft.printf("Wait Data");
tekasijimo 19:02bb67cb303c 400 // tft.drawRect(100, 0, 20, 30, WHITE);
maxxir 16:a84185b72bae 401
tekasijimo 19:02bb67cb303c 402 ticker.attach(periodicCallback, 0.8); /* Blink LED every 3 seconds */
maxxir 16:a84185b72bae 403
tekasijimo 19:02bb67cb303c 404 // create our button characteristic (read, notify)
tekasijimo 19:02bb67cb303c 405 /*gatt_characteristics[CHARACTERISTIC_BUTTON] =
tekasijimo 19:02bb67cb303c 406 new GattCharacteristic(
tekasijimo 19:02bb67cb303c 407 nRF51_GATT_CHAR_BUTTON,
tekasijimo 19:02bb67cb303c 408 &gatt_char_value[CHARACTERISTIC_BUTTON], 1, 1,
tekasijimo 19:02bb67cb303c 409 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
tekasijimo 19:02bb67cb303c 410 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);*/
maxxir 16:a84185b72bae 411
tekasijimo 19:02bb67cb303c 412 // create our LED characteristic (read, write)
tekasijimo 19:02bb67cb303c 413 gatt_characteristics[CHARACTERISTIC_LED] =
tekasijimo 19:02bb67cb303c 414 new GattCharacteristic(
tekasijimo 19:02bb67cb303c 415 nRF51ServiceUUID,
tekasijimo 19:02bb67cb303c 416 &gatt_char_value[CHARACTERISTIC_LED], 1, 1,
tekasijimo 19:02bb67cb303c 417 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
tekasijimo 19:02bb67cb303c 418 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
tekasijimo 19:02bb67cb303c 419 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE |
tekasijimo 19:02bb67cb303c 420 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY );
mbedAustin 8:5442739198ec 421
tekasijimo 19:02bb67cb303c 422 // create our service, with both characteristics
tekasijimo 19:02bb67cb303c 423 gatt_service =
tekasijimo 19:02bb67cb303c 424 new GattService(nRF51_GATT_SERVICE,
tekasijimo 19:02bb67cb303c 425 gatt_characteristics, CHARACTERISTIC_COUNT);
maxxir 16:a84185b72bae 426
tekasijimo 19:02bb67cb303c 427 BLE &ble = BLE::Instance();
tekasijimo 19:02bb67cb303c 428 // ble.onEventsToProcess(scheduleBleEventsProcessing);
tekasijimo 19:02bb67cb303c 429 ble.init(bleInitComplete);
maxxir 16:a84185b72bae 430
tekasijimo 19:02bb67cb303c 431 /* SpinWait for initialization to complete. This is necessary because the
tekasijimo 19:02bb67cb303c 432 BLE object is used in the main loop below. */
tekasijimo 19:02bb67cb303c 433 while (ble.hasInitialized() == false)
tekasijimo 19:02bb67cb303c 434 {
tekasijimo 19:02bb67cb303c 435 /* spin loop */
tekasijimo 19:02bb67cb303c 436 }
maxxir 16:a84185b72bae 437
tekasijimo 19:02bb67cb303c 438 // Основной цикл
tekasijimo 19:02bb67cb303c 439 while (true)
tekasijimo 19:02bb67cb303c 440 {
tekasijimo 19:02bb67cb303c 441 if ( !key1 || !key2) {
tekasijimo 19:02bb67cb303c 442 DISP_LED = !DISP_LED;
tekasijimo 19:02bb67cb303c 443 KEY_TIME.attach(BUTTON, 5);
tekasijimo 19:02bb67cb303c 444 wait(0.2);
maxxir 16:a84185b72bae 445
tekasijimo 19:02bb67cb303c 446 }
maxxir 16:a84185b72bae 447
tekasijimo 19:02bb67cb303c 448 //BACKLIGTH.attach(&TFT_LED, 30);
tekasijimo 19:02bb67cb303c 449
tekasijimo 19:02bb67cb303c 450 // Проверка флага на старт программы и отоброжение таймера ( TODO вынести в отдельную функцию и обновлять по прерыванию )
tekasijimo 19:02bb67cb303c 451 if ( FLAG == 1 ) {
mbedAustin 1:0692bee84264 452
tekasijimo 19:02bb67cb303c 453 // переводим время в другой формат ЧЧ:ММ:СС
tekasijimo 19:02bb67cb303c 454 HOUR = TIME_PROGRAMM / 60 / 60;
tekasijimo 19:02bb67cb303c 455 MIN = (TIME_PROGRAMM / 60) % 60;
tekasijimo 19:02bb67cb303c 456 SEC = TIME_PROGRAMM % 60;
tekasijimo 19:02bb67cb303c 457 // Тут надо добавить конвертацию типов пока вижу это как разделение на десятки и еденицы и далее по формуле i + '0' записывать их в массив.
tekasijimo 19:02bb67cb303c 458 // конвертацию то я сделал но как то не так. сыпет муссором на дисплей вида 00:0000:000000 и это в лучшем случае...
tekasijimo 19:02bb67cb303c 459 // Часы
tekasijimo 19:02bb67cb303c 460 HOUR_CHAR[0] = ((HOUR / 10) % 10) + '0';
tekasijimo 19:02bb67cb303c 461 HOUR_CHAR[1] = (HOUR % 10) + '0';
tekasijimo 19:02bb67cb303c 462 // Минуты
tekasijimo 19:02bb67cb303c 463 MIN_CHAR[0] = ((MIN / 10) % 10) + '0';
tekasijimo 19:02bb67cb303c 464 MIN_CHAR[1] = (MIN % 10) + '0';
tekasijimo 19:02bb67cb303c 465 // Секунды
tekasijimo 19:02bb67cb303c 466 SEC_CHAR[0] = ((SEC / 10) % 10) + '0';
tekasijimo 19:02bb67cb303c 467 SEC_CHAR[1] = (SEC % 10) + '0';
tekasijimo 19:02bb67cb303c 468 // Так как библиотека принимает только char пришлось посимвольно выводить время...
tekasijimo 19:02bb67cb303c 469 tft.drawChar(52, 48, HOUR_CHAR[0], WHITE, BLACK, 2);
tekasijimo 19:02bb67cb303c 470 tft.drawChar(64, 48, HOUR_CHAR[1], WHITE, BLACK, 2);
tekasijimo 19:02bb67cb303c 471 tft.drawChar(52, 64, MIN_CHAR[0], WHITE, BLACK, 2);
tekasijimo 19:02bb67cb303c 472 tft.drawChar(64, 64, MIN_CHAR[1], WHITE, BLACK, 2);
maxxir 16:a84185b72bae 473
tekasijimo 19:02bb67cb303c 474 if (r >= 30) {
tekasijimo 19:02bb67cb303c 475 r = 20;
tekasijimo 19:02bb67cb303c 476 if (COLOR == WHITE) {
tekasijimo 19:02bb67cb303c 477 COLOR = BLACK;
tekasijimo 19:02bb67cb303c 478 }
tekasijimo 19:02bb67cb303c 479 else (COLOR = WHITE);
tekasijimo 19:02bb67cb303c 480 };
maxxir 16:a84185b72bae 481
tekasijimo 19:02bb67cb303c 482 tft.drawCircle(63, 62, r, COLOR);
tekasijimo 19:02bb67cb303c 483 if (TIME_PROGRAMM < 1) {
tekasijimo 19:02bb67cb303c 484 FLAG = 0;
tekasijimo 19:02bb67cb303c 485 }
tekasijimo 19:02bb67cb303c 486 }
maxxir 16:a84185b72bae 487
tekasijimo 19:02bb67cb303c 488 else {
tekasijimo 19:02bb67cb303c 489 ble.waitForEvent();
tekasijimo 19:02bb67cb303c 490
tekasijimo 19:02bb67cb303c 491 }
tekasijimo 19:02bb67cb303c 492 }
tekasijimo 19:02bb67cb303c 493 }