General_view.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. /*
  2. Unitemp - Universal temperature reader
  3. Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n)
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. */
  15. #include "UnitempViews.h"
  16. #include "unitemp_icons.h"
  17. extern const Icon I_ButtonRight_4x7;
  18. extern const Icon I_ButtonLeft_4x7;
  19. extern const Icon I_Ok_btn_9x9;
  20. static View* view;
  21. typedef enum general_views {
  22. G_NO_SENSORS_VIEW, //Нет датчиков
  23. G_LIST_VIEW, //Вид в ввиде списка
  24. G_CAROUSEL_VIEW, //Карусель
  25. } general_view;
  26. typedef enum carousel_info {
  27. CAROUSEL_VALUES, //Отображение значений датчиков
  28. CAROUSEL_INFO, //Отображение информации о датчике
  29. } carousel_info;
  30. static general_view current_view;
  31. carousel_info carousel_info_selector = CAROUSEL_VALUES;
  32. uint8_t generalview_sensor_index = 0;
  33. static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t y, Color color) {
  34. //Рисование рамки
  35. canvas_draw_rframe(canvas, x, y, 54, 20, 3);
  36. if(color == ColorBlack) {
  37. canvas_draw_rbox(canvas, x, y, 54, 19, 3);
  38. canvas_invert_color(canvas);
  39. } else {
  40. canvas_draw_rframe(canvas, x, y, 54, 19, 3);
  41. }
  42. int8_t temp_dec = abs((int16_t)(sensor->temp * 10) % 10);
  43. //Рисование иконки
  44. canvas_draw_icon(
  45. canvas,
  46. x + 3,
  47. y + 3,
  48. (app->settings.temp_unit == UT_TEMP_CELSIUS ? &I_temp_C_11x14 : &I_temp_F_11x14));
  49. if((int16_t)sensor->temp == -128 || sensor->status == UT_SENSORSTATUS_TIMEOUT) {
  50. canvas_set_font(canvas, FontBigNumbers);
  51. canvas_draw_str_aligned(canvas, x + 27, y + 10, AlignCenter, AlignCenter, "--");
  52. canvas_set_font(canvas, FontPrimary);
  53. canvas_draw_str_aligned(canvas, x + 50, y + 10 + 3, AlignRight, AlignCenter, ". -");
  54. if(color == ColorBlack) canvas_invert_color(canvas);
  55. return;
  56. }
  57. //Целая часть температуры
  58. //Костыль для отображения знака числа меньше 0
  59. uint8_t offset = 0;
  60. if(sensor->temp < 0 && sensor->temp > -1) {
  61. app->buff[0] = '-';
  62. offset = 1;
  63. }
  64. snprintf((char*)(app->buff + offset), BUFF_SIZE, "%d", (int16_t)sensor->temp);
  65. canvas_set_font(canvas, FontBigNumbers);
  66. canvas_draw_str_aligned(
  67. canvas,
  68. x + 27 + ((sensor->temp <= -10 || sensor->temp > 99) ? 5 : 0),
  69. y + 10,
  70. AlignCenter,
  71. AlignCenter,
  72. app->buff);
  73. //Печать дробной части температуры в диапазоне от -9 до 99 (когда два знака в числе)
  74. if(sensor->temp > -10 && sensor->temp <= 99) {
  75. uint8_t int_len = canvas_string_width(canvas, app->buff);
  76. snprintf(app->buff, BUFF_SIZE, ".%d", temp_dec);
  77. canvas_set_font(canvas, FontPrimary);
  78. canvas_draw_str(canvas, x + 27 + int_len / 2 + 2, y + 10 + 7, app->buff);
  79. }
  80. if(color == ColorBlack) canvas_invert_color(canvas);
  81. }
  82. static void _draw_humidity(Canvas* canvas, Sensor* sensor, const uint8_t pos[2]) {
  83. //Рисование рамки
  84. canvas_draw_rframe(canvas, pos[0], pos[1], 54, 20, 3);
  85. canvas_draw_rframe(canvas, pos[0], pos[1], 54, 19, 3);
  86. //Рисование иконки
  87. canvas_draw_icon(canvas, pos[0] + 3, pos[1] + 2, &I_hum_9x15);
  88. //Целая часть влажности
  89. snprintf(app->buff, BUFF_SIZE, "%d", (uint8_t)sensor->hum);
  90. canvas_set_font(canvas, FontBigNumbers);
  91. canvas_draw_str_aligned(canvas, pos[0] + 27, pos[1] + 10, AlignCenter, AlignCenter, app->buff);
  92. uint8_t int_len = canvas_string_width(canvas, app->buff);
  93. //Единица измерения
  94. canvas_set_font(canvas, FontPrimary);
  95. canvas_draw_str(canvas, pos[0] + 27 + int_len / 2 + 4, pos[1] + 10 + 7, "%");
  96. }
  97. static void _draw_pressure(Canvas* canvas, Sensor* sensor) {
  98. const uint8_t x = 29, y = 39;
  99. //Рисование рамки
  100. canvas_draw_rframe(canvas, x, y, 69, 20, 3);
  101. canvas_draw_rframe(canvas, x, y, 69, 19, 3);
  102. //Рисование иконки
  103. canvas_draw_icon(canvas, x + 3, y + 4, &I_pressure_7x13);
  104. int16_t press_int = sensor->pressure;
  105. int8_t press_dec = (int16_t)(sensor->pressure * 10) % 10;
  106. //Целая часть давления
  107. snprintf(app->buff, BUFF_SIZE, "%d", press_int);
  108. canvas_set_font(canvas, FontBigNumbers);
  109. canvas_draw_str_aligned(
  110. canvas, x + 27 + ((press_int > 99) ? 5 : 0), y + 10, AlignCenter, AlignCenter, app->buff);
  111. //Печать дробной части давления в диапазоне от 0 до 99 (когда два знака в числе)
  112. if(press_int <= 99) {
  113. uint8_t int_len = canvas_string_width(canvas, app->buff);
  114. snprintf(app->buff, BUFF_SIZE, ".%d", press_dec);
  115. canvas_set_font(canvas, FontPrimary);
  116. canvas_draw_str(canvas, x + 27 + int_len / 2 + 2, y + 10 + 7, app->buff);
  117. }
  118. canvas_set_font(canvas, FontSecondary);
  119. //Единица измерения
  120. if(app->settings.pressure_unit == UT_PRESSURE_MM_HG) {
  121. canvas_draw_icon(canvas, x + 50, y + 2, &I_mm_hg_15x15);
  122. } else if(app->settings.pressure_unit == UT_PRESSURE_IN_HG) {
  123. canvas_draw_icon(canvas, x + 50, y + 2, &I_in_hg_15x15);
  124. } else if(app->settings.pressure_unit == UT_PRESSURE_KPA) {
  125. canvas_draw_str(canvas, x + 52, y + 13, "kPa");
  126. }
  127. }
  128. static void _draw_singleSensor(Canvas* canvas, Sensor* sensor, const uint8_t pos[2], Color color) {
  129. canvas_set_font(canvas, FontPrimary);
  130. const uint8_t max_width = 56;
  131. char sensor_name[12] = {0};
  132. memcpy(sensor_name, sensor->name, 10);
  133. if(canvas_string_width(canvas, sensor_name) > max_width) {
  134. uint8_t i = 10;
  135. while((canvas_string_width(canvas, sensor_name) > max_width - 6) && (i != 0)) {
  136. sensor_name[i--] = '\0';
  137. }
  138. sensor_name[++i] = '.';
  139. sensor_name[++i] = '.';
  140. }
  141. canvas_draw_str_aligned(
  142. canvas, pos[0] + 27, pos[1] + 3, AlignCenter, AlignCenter, sensor_name);
  143. _draw_temperature(canvas, sensor, pos[0], pos[1] + 8, color);
  144. }
  145. static void _draw_view_noSensors(Canvas* canvas) {
  146. canvas_draw_icon(canvas, 7, 17, &I_sherlok_53x45);
  147. //Рисование рамки
  148. canvas_draw_rframe(canvas, 0, 0, 128, 63, 7);
  149. canvas_draw_rframe(canvas, 0, 0, 128, 64, 7);
  150. canvas_set_font(canvas, FontPrimary);
  151. canvas_draw_str_aligned(canvas, 63, 10, AlignCenter, AlignCenter, "No sensors found");
  152. canvas_set_font(canvas, FontSecondary);
  153. const uint8_t x = 65, y = 32;
  154. canvas_draw_rframe(canvas, x - 4, y - 11, 54, 33, 3);
  155. canvas_draw_rframe(canvas, x - 4, y - 11, 54, 34, 3);
  156. canvas_draw_str(canvas, x, y, "To add the");
  157. canvas_draw_str(canvas, x, y + 9, "new sensor");
  158. canvas_draw_str(canvas, x, y + 18, "press OK");
  159. canvas_draw_icon(canvas, x + 37, y + 10, &I_Ok_btn_9x9);
  160. }
  161. static void _draw_view_sensorsList(Canvas* canvas) {
  162. //Текущая страница
  163. uint8_t page = generalview_sensor_index / 4;
  164. //Количество датчиков, которые будут отображаться на странице
  165. uint8_t page_sensors_count;
  166. if((unitemp_sensors_getActiveCount() - page * 4) / 4) {
  167. page_sensors_count = 4;
  168. } else {
  169. page_sensors_count = (unitemp_sensors_getActiveCount() - page * 4) % 4;
  170. }
  171. //Количество страниц
  172. uint8_t pages =
  173. unitemp_sensors_getActiveCount() / 4 + (unitemp_sensors_getActiveCount() % 4 ? 1 : 0);
  174. //Стрелка влево
  175. if(page > 0) {
  176. canvas_draw_icon(canvas, 2, 32, &I_ButtonLeft_4x7);
  177. }
  178. //Стрелка вправо
  179. if(pages > 0 && page < pages - 1) {
  180. canvas_draw_icon(canvas, 122, 32, &I_ButtonRight_4x7);
  181. }
  182. const uint8_t value_positions[][4][2] = {
  183. {{36, 18}}, //1 датчик
  184. {{7, 18}, {67, 18}}, //2 датчика
  185. {{7, 3}, {67, 3}, {37, 33}}, //3 датчика
  186. {{7, 3}, {67, 3}, {7, 33}, {67, 33}}}; //4 датчика
  187. //Рисование рамки
  188. canvas_draw_rframe(canvas, 0, 0, 128, 63, 7);
  189. canvas_draw_rframe(canvas, 0, 0, 128, 64, 7);
  190. for(uint8_t i = 0; i < page_sensors_count; i++) {
  191. _draw_singleSensor(
  192. canvas,
  193. unitemp_sensor_getActive(page * 4 + i),
  194. value_positions[page_sensors_count - 1][i],
  195. ColorWhite);
  196. }
  197. }
  198. static void _draw_carousel_values(Canvas* canvas) {
  199. UnitempStatus sensor_status = unitemp_sensor_getActive(generalview_sensor_index)->status;
  200. if(sensor_status == UT_SENSORSTATUS_ERROR || sensor_status == UT_SENSORSTATUS_TIMEOUT) {
  201. const Icon* frames[] = {
  202. &I_flipper_happy_60x38, &I_flipper_happy_2_60x38, &I_flipper_sad_60x38};
  203. canvas_draw_icon(canvas, 34, 23, frames[furi_get_tick() % 2250 / 750]);
  204. canvas_set_font(canvas, FontSecondary);
  205. //TODO: Оптимизировать эту срань
  206. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &SINGLE_WIRE) {
  207. snprintf(
  208. app->buff,
  209. BUFF_SIZE,
  210. "Waiting for module on pin %d",
  211. ((SingleWireSensor*)unitemp_sensor_getActive(generalview_sensor_index)->instance)
  212. ->gpio->num);
  213. }
  214. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &ONE_WIRE) {
  215. snprintf(
  216. app->buff,
  217. BUFF_SIZE,
  218. "Waiting for module on pin %d",
  219. ((OneWireSensor*)unitemp_sensor_getActive(generalview_sensor_index)->instance)
  220. ->bus->gpio->num);
  221. }
  222. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &I2C) {
  223. snprintf(app->buff, BUFF_SIZE, "Waiting for module on I2C pins");
  224. }
  225. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &SPI) {
  226. snprintf(app->buff, BUFF_SIZE, "Waiting for module on SPI pins");
  227. }
  228. canvas_draw_str_aligned(canvas, 64, 19, AlignCenter, AlignCenter, app->buff);
  229. return;
  230. }
  231. static const uint8_t temp_positions[3][2] = {{37, 23}, {37, 16}, {9, 16}};
  232. static const uint8_t hum_positions[2][2] = {{37, 38}, {65, 16}};
  233. //Селектор значений для отображения
  234. switch(unitemp_sensor_getActive(generalview_sensor_index)->type->datatype) {
  235. case UT_DATA_TYPE_TEMP:
  236. _draw_temperature(
  237. canvas,
  238. unitemp_sensor_getActive(generalview_sensor_index),
  239. temp_positions[0][0],
  240. temp_positions[0][1],
  241. ColorWhite);
  242. break;
  243. case UT_DATA_TYPE_TEMP_HUM:
  244. _draw_temperature(
  245. canvas,
  246. unitemp_sensor_getActive(generalview_sensor_index),
  247. temp_positions[1][0],
  248. temp_positions[1][1],
  249. ColorWhite);
  250. _draw_humidity(
  251. canvas, unitemp_sensor_getActive(generalview_sensor_index), hum_positions[0]);
  252. break;
  253. case UT_DATA_TYPE_TEMP_PRESS:
  254. _draw_temperature(
  255. canvas,
  256. unitemp_sensor_getActive(generalview_sensor_index),
  257. temp_positions[1][0],
  258. temp_positions[1][1],
  259. ColorWhite);
  260. _draw_pressure(canvas, unitemp_sensor_getActive(generalview_sensor_index));
  261. break;
  262. case UT_DATA_TYPE_TEMP_HUM_PRESS:
  263. _draw_temperature(
  264. canvas,
  265. unitemp_sensor_getActive(generalview_sensor_index),
  266. temp_positions[2][0],
  267. temp_positions[2][1],
  268. ColorWhite);
  269. _draw_humidity(
  270. canvas, unitemp_sensor_getActive(generalview_sensor_index), hum_positions[1]);
  271. _draw_pressure(canvas, unitemp_sensor_getActive(generalview_sensor_index));
  272. break;
  273. }
  274. }
  275. //TODO: Оптимизировать вывод информации
  276. static void _draw_carousel_info(Canvas* canvas) {
  277. canvas_set_font(canvas, FontPrimary);
  278. canvas_draw_str(canvas, 10, 23, "Type:");
  279. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &ONE_WIRE) {
  280. OneWireSensor* s = unitemp_sensor_getActive(generalview_sensor_index)->instance;
  281. canvas_set_font(canvas, FontPrimary);
  282. canvas_draw_str(canvas, 10, 35, "GPIO:");
  283. canvas_draw_str(canvas, 10, 47, "ID:");
  284. canvas_set_font(canvas, FontSecondary);
  285. canvas_draw_str(
  286. canvas,
  287. 41,
  288. 23,
  289. unitemp_onewire_sensor_getModel(unitemp_sensor_getActive(generalview_sensor_index)));
  290. canvas_draw_str(canvas, 41, 35, s->bus->gpio->name);
  291. snprintf(
  292. app->buff,
  293. BUFF_SIZE,
  294. "%02X%02X%02X%02X%02X%02X%02X%02X",
  295. s->deviceID[0],
  296. s->deviceID[1],
  297. s->deviceID[2],
  298. s->deviceID[3],
  299. s->deviceID[4],
  300. s->deviceID[5],
  301. s->deviceID[6],
  302. s->deviceID[7]);
  303. canvas_draw_str(canvas, 24, 47, app->buff);
  304. }
  305. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &SINGLE_WIRE) {
  306. canvas_set_font(canvas, FontPrimary);
  307. canvas_draw_str(canvas, 10, 35, "GPIO:");
  308. canvas_set_font(canvas, FontSecondary);
  309. canvas_draw_str(
  310. canvas, 41, 23, unitemp_sensor_getActive(generalview_sensor_index)->type->typename);
  311. canvas_draw_str(
  312. canvas,
  313. 41,
  314. 35,
  315. ((SingleWireSensor*)unitemp_sensor_getActive(generalview_sensor_index)->instance)
  316. ->gpio->name);
  317. }
  318. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &SPI) {
  319. canvas_set_font(canvas, FontPrimary);
  320. canvas_draw_str(canvas, 10, 35, "MISO pin:");
  321. canvas_draw_str(canvas, 10, 46, "CS pin:");
  322. canvas_draw_str(canvas, 10, 58, "SCK pin:");
  323. canvas_set_font(canvas, FontSecondary);
  324. canvas_draw_str(
  325. canvas, 41, 23, unitemp_sensor_getActive(generalview_sensor_index)->type->typename);
  326. canvas_draw_str(canvas, 60, 35, unitemp_gpio_getFromInt(3)->name);
  327. canvas_draw_str(
  328. canvas,
  329. 47,
  330. 46,
  331. ((SPISensor*)unitemp_sensor_getActive(generalview_sensor_index)->instance)
  332. ->CS_pin->name);
  333. canvas_draw_str(canvas, 54, 58, unitemp_gpio_getFromInt(5)->name);
  334. }
  335. if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &I2C) {
  336. canvas_set_font(canvas, FontPrimary);
  337. canvas_draw_str(canvas, 10, 35, "I2C addr:");
  338. canvas_draw_str(canvas, 10, 46, "SDA pin:");
  339. canvas_draw_str(canvas, 10, 58, "SCL pin:");
  340. canvas_set_font(canvas, FontSecondary);
  341. canvas_draw_str(
  342. canvas, 41, 23, unitemp_sensor_getActive(generalview_sensor_index)->type->typename);
  343. snprintf(
  344. app->buff,
  345. BUFF_SIZE,
  346. "0x%02X",
  347. ((I2CSensor*)unitemp_sensor_getActive(generalview_sensor_index)->instance)
  348. ->currentI2CAdr >>
  349. 1);
  350. canvas_draw_str(canvas, 57, 35, app->buff);
  351. canvas_draw_str(canvas, 54, 46, "15 (C0)");
  352. canvas_draw_str(canvas, 54, 58, "16 (C1)");
  353. }
  354. }
  355. static void _draw_view_sensorsCarousel(Canvas* canvas) {
  356. //Рисование рамки
  357. canvas_draw_rframe(canvas, 0, 0, 128, 63, 7);
  358. canvas_draw_rframe(canvas, 0, 0, 128, 64, 7);
  359. //Печать имени
  360. canvas_set_font(canvas, FontPrimary);
  361. canvas_draw_str_aligned(
  362. canvas,
  363. 64,
  364. 7,
  365. AlignCenter,
  366. AlignCenter,
  367. unitemp_sensor_getActive(generalview_sensor_index)->name);
  368. //Подчёркивание
  369. uint8_t line_len =
  370. canvas_string_width(canvas, unitemp_sensor_getActive(generalview_sensor_index)->name) + 2;
  371. canvas_draw_line(canvas, 64 - line_len / 2, 12, 64 + line_len / 2, 12);
  372. //Стрелка вправо
  373. if(unitemp_sensors_getTypesCount() > 0 &&
  374. generalview_sensor_index < unitemp_sensors_getActiveCount() - 1) {
  375. canvas_draw_icon(canvas, 122, 29, &I_ButtonRight_4x7);
  376. }
  377. //Стрелка влево
  378. if(generalview_sensor_index > 0) {
  379. canvas_draw_icon(canvas, 2, 29, &I_ButtonLeft_4x7);
  380. }
  381. switch(carousel_info_selector) {
  382. case CAROUSEL_VALUES:
  383. _draw_carousel_values(canvas);
  384. break;
  385. case CAROUSEL_INFO:
  386. _draw_carousel_info(canvas);
  387. break;
  388. }
  389. }
  390. static void _draw_callback(Canvas* canvas, void* _model) {
  391. UNUSED(_model);
  392. app->sensors_ready = true;
  393. uint8_t sensors_count = unitemp_sensors_getActiveCount();
  394. if(generalview_sensor_index + 1 > sensors_count) generalview_sensor_index = 0;
  395. if(sensors_count == 0) {
  396. current_view = G_NO_SENSORS_VIEW;
  397. _draw_view_noSensors(canvas);
  398. } else {
  399. if(sensors_count == 1) current_view = G_CAROUSEL_VIEW;
  400. if(current_view == G_NO_SENSORS_VIEW) current_view = G_CAROUSEL_VIEW;
  401. if(current_view == G_LIST_VIEW) _draw_view_sensorsList(canvas);
  402. if(current_view == G_CAROUSEL_VIEW) _draw_view_sensorsCarousel(canvas);
  403. }
  404. }
  405. static bool _input_callback(InputEvent* event, void* context) {
  406. UNUSED(context);
  407. //Обработка короткого нажатия "ок"
  408. if(event->key == InputKeyOk && event->type == InputTypeShort) {
  409. //Меню добавления датчика при их отсутствии
  410. if(current_view == G_NO_SENSORS_VIEW) {
  411. app->sensors_ready = false;
  412. unitemp_SensorsList_switch();
  413. } else if(current_view == G_LIST_VIEW) {
  414. //Переход в главное меню при выключенном селекторе
  415. app->sensors_ready = false;
  416. unitemp_MainMenu_switch();
  417. } else if(current_view == G_CAROUSEL_VIEW) {
  418. app->sensors_ready = false;
  419. unitemp_SensorActions_switch(unitemp_sensor_getActive(generalview_sensor_index));
  420. }
  421. }
  422. //Обработка короткого нажатия "вниз"
  423. if(event->key == InputKeyDown && event->type == InputTypeShort) {
  424. //Переход из значений в информацию в карусели
  425. if(current_view == G_CAROUSEL_VIEW && carousel_info_selector == CAROUSEL_VALUES) {
  426. carousel_info_selector = CAROUSEL_INFO;
  427. return true;
  428. }
  429. //Переход в карусель из списка
  430. if(current_view == G_LIST_VIEW) {
  431. current_view = G_CAROUSEL_VIEW;
  432. return true;
  433. }
  434. }
  435. //Обработка короткого нажатия "вверх"
  436. if(event->key == InputKeyUp && event->type == InputTypeShort) {
  437. //Переход из информации в значения в карусели
  438. if(current_view == G_CAROUSEL_VIEW && carousel_info_selector == CAROUSEL_INFO) {
  439. carousel_info_selector = CAROUSEL_VALUES;
  440. return true;
  441. }
  442. //Переход в список из карусели
  443. if(current_view == G_CAROUSEL_VIEW && carousel_info_selector == CAROUSEL_VALUES &&
  444. unitemp_sensors_getActiveCount() > 1) {
  445. current_view = G_LIST_VIEW;
  446. return true;
  447. }
  448. }
  449. //Обработка короткого нажатия "вправо"
  450. if(event->key == InputKeyRight && event->type == InputTypeShort) {
  451. //Пролистывание карусели вперёд
  452. if(current_view == G_CAROUSEL_VIEW) {
  453. if(++generalview_sensor_index >= unitemp_sensors_getActiveCount()) {
  454. generalview_sensor_index = 0;
  455. if(carousel_info_selector == CAROUSEL_VALUES) current_view = G_LIST_VIEW;
  456. }
  457. return true;
  458. }
  459. //Пролистывание списка вперёд
  460. if(current_view == G_LIST_VIEW) {
  461. generalview_sensor_index += 4;
  462. if(generalview_sensor_index >= unitemp_sensors_getActiveCount()) {
  463. generalview_sensor_index = 0;
  464. current_view = G_CAROUSEL_VIEW;
  465. }
  466. return true;
  467. }
  468. }
  469. //Обработка короткого нажатия "влево"
  470. if(event->key == InputKeyLeft && event->type == InputTypeShort) {
  471. //Пролистывание карусели назад
  472. if(current_view == G_CAROUSEL_VIEW) {
  473. if(--generalview_sensor_index >= unitemp_sensors_getActiveCount()) {
  474. generalview_sensor_index = unitemp_sensors_getActiveCount() - 1;
  475. if(carousel_info_selector == CAROUSEL_VALUES) current_view = G_LIST_VIEW;
  476. }
  477. return true;
  478. }
  479. //Пролистывание списка назад
  480. if(current_view == G_LIST_VIEW) {
  481. generalview_sensor_index -= 4;
  482. if(generalview_sensor_index >= unitemp_sensors_getActiveCount()) {
  483. generalview_sensor_index = unitemp_sensors_getActiveCount() - 1;
  484. current_view = G_CAROUSEL_VIEW;
  485. }
  486. return true;
  487. }
  488. }
  489. //Обработка короткого нажатия "назад"
  490. if(event->key == InputKeyBack && event->type == InputTypeShort) {
  491. //Выход из приложения при карусели или отсутствии датчиков
  492. if(current_view == G_NO_SENSORS_VIEW ||
  493. ((current_view == G_CAROUSEL_VIEW) && (carousel_info_selector == CAROUSEL_VALUES))) {
  494. app->processing = false;
  495. return true;
  496. }
  497. //Переключение селектора вида карусели
  498. if((current_view == G_CAROUSEL_VIEW) && (carousel_info_selector != CAROUSEL_VALUES)) {
  499. carousel_info_selector = CAROUSEL_VALUES;
  500. return true;
  501. }
  502. //Переход в карусель из списка
  503. if(current_view == G_LIST_VIEW) {
  504. current_view = G_CAROUSEL_VIEW;
  505. return true;
  506. }
  507. }
  508. //Обработка длинного нажатия "Ок"
  509. if(event->key == InputKeyOk && event->type == InputTypeLong) {
  510. app->settings.temp_unit = !app->settings.temp_unit;
  511. }
  512. return true;
  513. }
  514. void unitemp_General_alloc(void) {
  515. view = view_alloc();
  516. view_set_context(view, app);
  517. view_set_draw_callback(view, _draw_callback);
  518. view_set_input_callback(view, _input_callback);
  519. view_dispatcher_add_view(app->view_dispatcher, UnitempViewGeneral, view);
  520. }
  521. void unitemp_General_switch(void) {
  522. app->sensors_ready = true;
  523. view_dispatcher_switch_to_view(app->view_dispatcher, UnitempViewGeneral);
  524. }
  525. void unitemp_General_free(void) {
  526. view_dispatcher_remove_view(app->view_dispatcher, UnitempViewGeneral);
  527. view_free(view);
  528. }