
htr
Dependencies: mbed AdafruitST7735 BLE_API Adafruit_GFX nRF51822
main.cpp@19:02bb67cb303c, 2019-08-11 (annotated)
- Committer:
- tekasijimo
- Date:
- Sun Aug 11 13:43:37 2019 +0000
- Revision:
- 19:02bb67cb303c
- Parent:
- 18:0cbeb28ce4f6
derfthe
Who changed what in which revision?
User | Revision | Line number | New 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 | } |