v2.0 beta7
This commit is contained in:
parent
09f742e2fb
commit
2ff2143add
36 changed files with 13766 additions and 13645 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
[](README-ru.md)
|
[](README-ru.md)
|
||||||
[](README.md)
|
[](README.md)
|
||||||
|
|
||||||
# BTHome THB1, THB2, THB3, BTH01, TH05(HW: v1.3..1.6), TH05F
|
# BTHome THB1, THB2, THB3, BTH01, TH05, TH05F
|
||||||
|
|
||||||
Кастомные прошивки для устройств Tuya на чипсете PHY622x2.
|
Кастомные прошивки для устройств Tuya на чипсете PHY622x2.
|
||||||
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
| [TH05_V1.3](https://pvvx.github.io/TH05-v1.3) | [TH05_V1.4](https://pvvx.github.io/TH-05) | [TH05F](https://pvvx.github.io/TH05F) | [KEY2](https://pvvx.github.io/iSearching) |
|
| [TH05_V1.3](https://pvvx.github.io/TH05-v1.3) | [TH05_V1.4](https://pvvx.github.io/TH-05) | [TH05F](https://pvvx.github.io/TH05F) | [KEY2](https://pvvx.github.io/iSearching) |
|
||||||
|:---:|:---:|:---:|:---:|
|
|:---:|:---:|:---:|:---:|
|
||||||
| <img src="https://pvvx.github.io/TH05-v1.3/img/TH05-V1.3.jpg" width="120"/> | <img src="https://pvvx.github.io/TH-05/img/TH05V14.jpg" width="120"/> | <img src="https://pvvx.github.io/TH05F/img/TH05F.jpg" width="120"/> | <img src="https://pvvx.github.io/iSearching/img/keys.jpg" width="120"/> |
|
| <img src="https://pvvx.github.io/TH05-v1.3/img/TH05-V1.3.jpg" width="120"/> | <img src="https://pvvx.github.io/TH-05/img/TH05V14.jpg" width="120"/> | <img src="https://pvvx.github.io/TH05F/img/TH05F.jpg" width="120"/> | <img src="https://pvvx.github.io/iSearching/img/keys.jpg" width="120"/> |
|
||||||
| | | | Поддерживает "FindMy" |
|
| | | | Поддерживает "[FindMy](https://github.com/pvvx/THB2/issues/94)" |
|
||||||
|
|
||||||
Прошивки работают с [Home Assistant](https://www.home-assistant.io/) и другим программным обеспечением, работающим в формате [BTHome](https://bthome.io/).
|
Прошивки работают с [Home Assistant](https://www.home-assistant.io/) и другим программным обеспечением, работающим в формате [BTHome](https://bthome.io/).
|
||||||
|
|
||||||
|
|
@ -100,7 +100,7 @@ LCD имеет разную разводку сегментов в зависи
|
||||||
| 1.7 | <ul><li>Исправление ошибки (> 42 C) для сенсора CHT8305</li></ul> |
|
| 1.7 | <ul><li>Исправление ошибки (> 42 C) для сенсора CHT8305</li></ul> |
|
||||||
| 1.8 | <ul><li>Добавлено отображение температуры в градусах Фаренгейта</li></ul> |
|
| 1.8 | <ul><li>Добавлено отображение температуры в градусах Фаренгейта</li></ul> |
|
||||||
| 1.9 | <ul><li>Исправлена ошибка восстановления измененного имени устройства после сброса питания</li></ul> |
|
| 1.9 | <ul><li>Исправлена ошибка восстановления измененного имени устройства после сброса питания</li></ul> |
|
||||||
| 2.0 | <ul><li>Добавлена обработка датчика CHT832x (поддержка платы TH05Y_v3.1)</li><li>Исправление ошибки в bin-файлах BOOT OTA</li><li>Добавлена функция сна при полном разряде батареи.</li><li>Добавлена опытная прошивка для брелков [iSearching](https://pvvx.github.io/iSearching) на чипе ST17H66B с поддержкой FindMy</li></ul> |
|
| 2.0 | <ul><li>Добавлена обработка датчика CHT832x (поддержка платы TH05Y_v3.1)</li><li>Исправление ошибки в bin-файлах BOOT OTA</li><li>Добавлена функция сна при полном разряде батареи.</li><li>Добавлена опытная прошивка для брелков [iSearching](https://pvvx.github.io/iSearching) на чипе ST17H66B с поддержкой FindMy</li><li>Исправлены ошибки отображения для TH05D</li></ul> |
|
||||||
|
|
||||||
## Прошивка
|
## Прошивка
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ Custom firmware for Tuya devices based on the PHY622x2 chipset.
|
||||||
| [TH05_V1.3](https://pvvx.github.io/TH05-v1.3) | [TH05_V1.4](https://pvvx.github.io/TH-05) | [TH05F](https://pvvx.github.io/TH05F) | [KEY2](https://pvvx.github.io/iSearching) |
|
| [TH05_V1.3](https://pvvx.github.io/TH05-v1.3) | [TH05_V1.4](https://pvvx.github.io/TH-05) | [TH05F](https://pvvx.github.io/TH05F) | [KEY2](https://pvvx.github.io/iSearching) |
|
||||||
|:---:|:---:|:---:|:---:|
|
|:---:|:---:|:---:|:---:|
|
||||||
| <img src="https://pvvx.github.io/TH05-v1.3/img/TH05-V1.3.jpg" width="120"/> | <img src="https://pvvx.github.io/TH-05/img/TH05V14.jpg" width="120"/> | <img src="https://pvvx.github.io/TH05F/img/TH05F.jpg" width="120"/> | <img src="https://pvvx.github.io/iSearching/img/keys.jpg" width="120"/> |
|
| <img src="https://pvvx.github.io/TH05-v1.3/img/TH05-V1.3.jpg" width="120"/> | <img src="https://pvvx.github.io/TH-05/img/TH05V14.jpg" width="120"/> | <img src="https://pvvx.github.io/TH05F/img/TH05F.jpg" width="120"/> | <img src="https://pvvx.github.io/iSearching/img/keys.jpg" width="120"/> |
|
||||||
| | | | Support "FindMy" |
|
| | | | Support "[FindMy](https://github.com/pvvx/THB2/issues/94)" |
|
||||||
|
|
||||||
|
|
||||||
This firmware works with [Home Assistant](https://www.home-assistant.io/) and other software running in the [BTHome](https://bthome.io/) format.
|
This firmware works with [Home Assistant](https://www.home-assistant.io/) and other software running in the [BTHome](https://bthome.io/) format.
|
||||||
|
|
@ -104,7 +104,7 @@ The sensors are detected automatically, but have different ports depending on th
|
||||||
| 1.7 | <ul><li>Fixed en error (> 42 C) for sensor CHT8305</li></ul> |
|
| 1.7 | <ul><li>Fixed en error (> 42 C) for sensor CHT8305</li></ul> |
|
||||||
| 1.8 | <ul><li>Added display of temperature in degrees Fahrenheit</li></ul> |
|
| 1.8 | <ul><li>Added display of temperature in degrees Fahrenheit</li></ul> |
|
||||||
| 1.9 | <ul><li>Fixed the bug of restoring the changed device name after power reset</li></ul> |
|
| 1.9 | <ul><li>Fixed the bug of restoring the changed device name after power reset</li></ul> |
|
||||||
| 2.0 | <ul><li>Added processing of the CHT832x sensor (Support board TH05Y_v3.1)</li><li>Fixing a bug in BOOT OTA bin files</li><li>Added sleep function when battery is completely discharged</li><li>Added experimental firmware for [iSearching](https://pvvx.github.io/iSearching) key fobs on ST17H66B chip (support "FindMy")</li></ul> |
|
| 2.0 | <ul><li>Added processing of the CHT832x sensor (Support board TH05Y_v3.1)</li><li>Fixing a bug in BOOT OTA bin files</li><li>Added sleep function when battery is completely discharged</li><li>Added experimental firmware for [iSearching](https://pvvx.github.io/iSearching) key fobs on ST17H66B chip (support "FindMy")</li><li>Fixed display errors for TH05D</li></ul> |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -113,8 +113,8 @@
|
||||||
:1036F0007925FF1F8525FF1FC11EFF1F791FFF1F93
|
:1036F0007925FF1F8525FF1FC11EFF1F791FFF1F93
|
||||||
:10370000391EFF1F0223F0B50124634D634E2B7059
|
:10370000391EFF1F0223F0B50124634D634E2B7059
|
||||||
:10371000634B8BB01C70634F039333680021092007
|
:10371000634B8BB01C70634F039333680021092007
|
||||||
:10372000BB7006F039FD092006F030FC031E05D100
|
:103720007B7006F039FD092006F030FC031E05D140
|
||||||
:10373000BA78552A02D0332A00D0A0E000233360A3
|
:103730007A78552A02D0332A00D0A0E000233360E3
|
||||||
:10374000042006F0A3FE08F023F8FFF75DFE07F063
|
:10374000042006F0A3FE08F023F8FFF75DFE07F063
|
||||||
:1037500027FF1F2201240021534B1E261A70534BB2
|
:1037500027FF1F2201240021534B1E261A70534BB2
|
||||||
:103760001C70534B1970534B19689143163A0A4316
|
:103760001C70534B1970534B19689143163A0A4316
|
||||||
|
|
@ -395,7 +395,7 @@
|
||||||
:104890001343290028002B7000F034FA404E062202
|
:104890001343290028002B7000F034FA404E062202
|
||||||
:1048A0002900300006F0D4FE00280ED00622290090
|
:1048A0002900300006F0D4FE00280ED00622290090
|
||||||
:1048B000300006F0ADFF06223A493000FEF724FC36
|
:1048B000300006F0ADFF06223A493000FEF724FC36
|
||||||
:1048C0000123394A51780B43537004236370BAE7CC
|
:1048C0000123394A11780B43137004236370BAE74C
|
||||||
:1048D000022DA4D17678012E10D12F4D1C22280054
|
:1048D000022DA4D17678012E10D12F4D1C22280054
|
||||||
:1048E0002E49FEF7D7FC1C2806D10E222900A01C59
|
:1048E0002E49FEF7D7FC1C2806D10E222900A01C59
|
||||||
:1048F00006F08EFF6670A6E7FE2391E7022E8ED1AA
|
:1048F00006F08EFF6670A6E7FE2391E7022E8ED1AA
|
||||||
|
|
@ -412,13 +412,13 @@
|
||||||
:1049A0006509FF1FADAC00002862FF1F9761FF1F64
|
:1049A0006509FF1FADAC00002862FF1F9761FF1F64
|
||||||
:1049B000F461FF1F4043FF1F8042FF1F8864FF1FF9
|
:1049B000F461FF1F4043FF1F8042FF1F8864FF1FF9
|
||||||
:1049C0003C4A3D4B1288CFE73C4B012D03D0727817
|
:1049C0003C4A3D4B1288CFE73C4B012D03D0727817
|
||||||
:1049D0005A704270A9E75B7822E7FFF71BFC0700DB
|
:1049D0001A704270A9E71B7822E7FFF71BFC07005B
|
||||||
:1049E000D6E6042D05D9364D009B2B6006F088FFD6
|
:1049E000D6E6042D05D9364D009B2B6006F088FFD6
|
||||||
:1049F000A860FFF7E3FC0422039003A9601C06F003
|
:1049F000A860FFF7E3FC0422039003A9601C06F003
|
||||||
:104A000007FF0527C4E62F4E062D15D906223000D4
|
:104A000007FF0527C4E62F4E062D15D906223000D4
|
||||||
:104A1000019906F01DFE00280ED0062201993000F3
|
:104A1000019906F01DFE00280ED0062201993000F3
|
||||||
:104A200006F0F6FE062228493000FEF76DFB012352
|
:104A200006F0F6FE062228493000FEF76DFB012352
|
||||||
:104A3000224A51780B43537006223100601C06F065
|
:104A3000224A11780B43137006223100601C06F0E5
|
||||||
:104A4000E7FE0727A4E6012D00D1E8E67078FFF71E
|
:104A4000E7FE0727A4E6012D00D1E8E67078FFF71E
|
||||||
:104A5000B3FD6AE7013D2A000199009806F0D8FEEF
|
:104A5000B3FD6AE7013D2A000199009806F0D8FEEF
|
||||||
:104A60001A490098AAB2FEF74FFB1BE6DA2B00D0DA
|
:104A60001A490098AAB2FEF74FFB1BE6DA2B00D0DA
|
||||||
|
|
@ -440,7 +440,7 @@
|
||||||
:104B600006F076FEE0E70E4B0821187806F090FE7E
|
:104B600006F076FEE0E70E4B0821187806F090FE7E
|
||||||
:104B70000E48FFF79DF90C4B0D4A9B7993800D4A27
|
:104B70000E48FFF79DF90C4B0D4A9B7993800D4A27
|
||||||
:104B800013800022074BDA740132FF321A820A4B7B
|
:104B800013800022074BDA740132FF321A820A4B7B
|
||||||
:104B90005B78002BC8D0094A136006F041FEC3E7DA
|
:104B90001B78002BC8D0094A136006F041FEC3E71A
|
||||||
:104BA0004862FF1F1462FF1F2C62FF1F8942FF1F14
|
:104BA0004862FF1F1462FF1F2C62FF1F8942FF1F14
|
||||||
:104BB000CC43FF1F7A42FF1F2862FF1F34F00040E2
|
:104BB000CC43FF1F7A42FF1F2862FF1F34F00040E2
|
||||||
:104BC00010B5002909D1092807D1063805F012FBD4
|
:104BC00010B5002909D1092807D1063805F012FBD4
|
||||||
|
|
@ -484,7 +484,7 @@
|
||||||
:104E200011424FD07D3A01981A70FFF789F8387017
|
:104E200011424FD07D3A01981A70FFF789F8387017
|
||||||
:104E30003A78354F01213878019B02F059F8334A0E
|
:104E30003A78354F01213878019B02F059F8334A0E
|
||||||
:104E4000334B12783878002102F052F80122314BAE
|
:104E4000334B12783878002102F052F80122314BAE
|
||||||
:104E5000314F1A70314B9B78552B35D1193B7B74F0
|
:104E5000314F1A70314B5B78552B35D1193B7B7430
|
||||||
:104E60002F4A304BA381E28123826282202128785D
|
:104E60002F4A304BA381E28123826282202128785D
|
||||||
:104E700006F016FB0120404205F072FC0120404282
|
:104E700006F016FB0120404205F072FC0120404282
|
||||||
:104E800005F00EFDFFF776FAFEF792FE0120404294
|
:104E800005F00EFDFFF776FAFEF792FE0120404294
|
||||||
|
|
@ -502,7 +502,7 @@
|
||||||
:104F400000D16FE0824B1B78002B41D0FFF736FA7F
|
:104F400000D16FE0824B1B78002B41D0FFF736FA7F
|
||||||
:104F5000804B814C814E99686268737A8A1ADB03B0
|
:104F5000804B814C814E99686268737A8A1ADB03B0
|
||||||
:104F60009A4238D36160FEF7C9FC637C002B2CD0D9
|
:104F60009A4238D36160FEF7C9FC637C002B2CD0D9
|
||||||
:104F7000013BDBB26374002B27D1794B9B78552B17
|
:104F7000013BDBB26374002B27D1794B5B78552B57
|
||||||
:104F800001D106F04DFCE37C764F002B36D000219A
|
:104F800001D106F04DFCE37C764F002B36D000219A
|
||||||
:104F9000032005F02FF9F3796374BB78002B14D14B
|
:104F9000032005F02FF9F3796374BB78002B14D14B
|
||||||
:104FA000A27C002A02D0A374FEF73EFD3B886E4E21
|
:104FA000A27C002A02D0A374FEF73EFD3B886E4E21
|
||||||
|
|
@ -2221,7 +2221,7 @@
|
||||||
:10BAB000746875622E636F6D2F70767678004B45D3
|
:10BAB000746875622E636F6D2F70767678004B45D3
|
||||||
:10BAC0005900000002000000D8BA0011292A282AD3
|
:10BAC0005900000002000000D8BA0011292A282AD3
|
||||||
:10BAD000272A262A252A242A0A1800000500000001
|
:10BAD000272A262A252A242A0A1800000500000001
|
||||||
:10BAE0001F501D10023CB40000011E002000000089
|
:10BAE0001F501D10023CB400000120002000000087
|
||||||
:10BAF000090060003031323334353637383941424D
|
:10BAF000090060003031323334353637383941424D
|
||||||
:10BB0000434445460000000001A000000000000082
|
:10BB0000434445460000000001A000000000000082
|
||||||
:10BB10006410B71DC8206E3BAC30D9269041DC764E
|
:10BB10006410B71DC8206E3BAC30D9269041DC764E
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Binary file not shown.
BIN
bin/KEY2_v20.bin
BIN
bin/KEY2_v20.bin
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/TH05_v20.bin
BIN
bin/TH05_v20.bin
Binary file not shown.
BIN
bin/THB1_v20.bin
BIN
bin/THB1_v20.bin
Binary file not shown.
BIN
bin/THB2_v20.bin
BIN
bin/THB2_v20.bin
Binary file not shown.
BIN
bin/THB3_v20.bin
BIN
bin/THB3_v20.bin
Binary file not shown.
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# rdwr_phy62x2.py 12.12.2024 pvvx #
|
# rdwr_phy62x2.py 20.12.2024 pvvx #
|
||||||
|
|
||||||
import serial
|
import serial
|
||||||
import time
|
import time
|
||||||
|
|
@ -24,7 +24,7 @@ PHY_WR_BLK_SIZE = 0x2000
|
||||||
|
|
||||||
__progname__ = 'PHY62x2/ST17H66B Utility'
|
__progname__ = 'PHY62x2/ST17H66B Utility'
|
||||||
__filename__ = 'rdwr_phy62x2.py'
|
__filename__ = 'rdwr_phy62x2.py'
|
||||||
__version__ = "12.12.24"
|
__version__ = "20.12.24"
|
||||||
|
|
||||||
def ParseHexFile(hexfile):
|
def ParseHexFile(hexfile):
|
||||||
try:
|
try:
|
||||||
|
|
@ -184,11 +184,14 @@ class phyflasher:
|
||||||
read = self._port.read(26)
|
read = self._port.read(26)
|
||||||
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
||||||
print('Revision:', read[2:19])
|
print('Revision:', read[2:19])
|
||||||
if read[11:15] != b'6222':
|
if read[11:15] == b'6230':
|
||||||
print('Wrong Version!')
|
print('Chip PHY6230: OTP Version!')
|
||||||
self.flash_id = int(read[2:11], 16)
|
else:
|
||||||
self.flash_size = 1 << ((self.flash_id >> 16) & 0xff)
|
if read[11:15] != b'6222':
|
||||||
print('FlashID: %06x, size: %d kbytes' % (self.flash_id, self.flash_size >> 10))
|
print('Wrong Version!')
|
||||||
|
self.flash_id = int(read[2:11], 16)
|
||||||
|
self.flash_size = 1 << ((self.flash_id >> 16) & 0xff)
|
||||||
|
print('FlashID: %06x, size: %d kbytes' % (self.flash_id, self.flash_size >> 10))
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
print('Error read Revision!')
|
print('Error read Revision!')
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "trigger.h"
|
#include "trigger.h"
|
||||||
|
#include "buzzer.h"
|
||||||
#include "bthome_beacon.h"
|
#include "bthome_beacon.h"
|
||||||
#include "findmy_beacon.h"
|
#include "findmy_beacon.h"
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
@ -297,16 +298,36 @@ int cmd_parser(uint8_t * obuf, uint8_t * ibuf, uint32_t len) {
|
||||||
olen = make_measure_msg(obuf);
|
olen = make_measure_msg(obuf);
|
||||||
#if (DEV_SERVICES & SERVICE_SCREEN)
|
#if (DEV_SERVICES & SERVICE_SCREEN)
|
||||||
} else if (cmd == CMD_ID_LCD_DUMP) { // Get/set lcd buf
|
} else if (cmd == CMD_ID_LCD_DUMP) { // Get/set lcd buf
|
||||||
if (--len > sizeof(display_buff))
|
if (--len > sizeof(lcdd.display_buff))
|
||||||
len = sizeof(display_buff);
|
len = sizeof(lcdd.display_buff);
|
||||||
if (len) {
|
if (len) {
|
||||||
wrk.lcd_ext_chow = 1;
|
lcdd.chow_ext_ut = clkt.utc_time_sec + 600;
|
||||||
memcpy(display_buff, &ibuf[1], len);
|
memcpy(lcdd.display_buff, &ibuf[1], len);
|
||||||
update_lcd();
|
update_lcd();
|
||||||
} else
|
} else {
|
||||||
wrk.lcd_ext_chow = 0;
|
lcdd.chow_ext_ut = 0;
|
||||||
memcpy(&obuf[1], display_buff, sizeof(display_buff));
|
chow_lcd(1);
|
||||||
olen = 1 + sizeof(display_buff);
|
}
|
||||||
|
memcpy(&obuf[1], lcdd.display_buff, sizeof(lcdd.display_buff));
|
||||||
|
olen = 1 + sizeof(lcdd.display_buff);
|
||||||
|
#endif
|
||||||
|
#if (DEV_SERVICES & SERVICE_SCREEN) && (OTA_TYPE == OTA_TYPE_APP)
|
||||||
|
} else if (cmd == CMD_ID_EXTDATA) { // Show ext. small and big number
|
||||||
|
if (--len > sizeof(lcdd.ext))
|
||||||
|
len = sizeof(lcdd.ext);
|
||||||
|
if (len) {
|
||||||
|
memcpy(&lcdd.ext, &ibuf[1], len);
|
||||||
|
if(lcdd.ext.vtime_sec == 0xffff)
|
||||||
|
lcdd.chow_ext_ut = 0xffffffff;
|
||||||
|
else
|
||||||
|
lcdd.chow_ext_ut = clkt.utc_time_sec + lcdd.ext.vtime_sec;
|
||||||
|
chow_ext_data();
|
||||||
|
} else {
|
||||||
|
lcdd.chow_ext_ut = 0;
|
||||||
|
chow_lcd(1);
|
||||||
|
}
|
||||||
|
memcpy(&obuf[1], &lcdd.ext, sizeof(lcdd.ext));
|
||||||
|
olen = 1 + sizeof(lcdd.ext);
|
||||||
#endif
|
#endif
|
||||||
} else if (cmd == CMD_ID_UTC_TIME) { // Get/set utc time
|
} else if (cmd == CMD_ID_UTC_TIME) { // Get/set utc time
|
||||||
if (len > 4) {
|
if (len > 4) {
|
||||||
|
|
|
||||||
|
|
@ -46,24 +46,24 @@
|
||||||
#define DEVICE_KEY2 32
|
#define DEVICE_KEY2 32
|
||||||
|
|
||||||
#ifndef DEVICE
|
#ifndef DEVICE
|
||||||
#define DEVICE DEVICE_KEY2
|
#define DEVICE DEVICE_TH05D
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// supported services by the device (bits)
|
// supported services by the device (bits)
|
||||||
#define SERVICE_OTA 0x00000001 // есть функция OTA
|
#define SERVICE_OTA 0x00000001 // есть функция OTA
|
||||||
#define SERVICE_OTA_EXT 0x00000002 // пока нет // есть расширенная функция OTA
|
//#define SERVICE_OTA_EXT 0x00000002 // пока нет // есть расширенная функция OTA
|
||||||
#define SERVICE_PINCODE 0x00000004 // пока нет // есть установка pin-code
|
//#define SERVICE_PINCODE 0x00000004 // пока нет // есть установка pin-code
|
||||||
#define SERVICE_BINDKEY 0x00000008 // есть шифрование
|
#define SERVICE_BINDKEY 0x00000008 // есть шифрование
|
||||||
#define SERVICE_HISTORY 0x00000010 // есть запись истории
|
#define SERVICE_HISTORY 0x00000010 // есть запись истории
|
||||||
#define SERVICE_SCREEN 0x00000020 // есть экран
|
#define SERVICE_SCREEN 0x00000020 // есть экран
|
||||||
#define SERVICE_LE_LR 0x00000040 // пока нет // Есть поддержка рекламы в LE Long Range
|
//#define SERVICE_LE_LR 0x00000040 // пока нет // Есть поддержка рекламы в LE Long Range
|
||||||
#define SERVICE_THS 0x00000080 // есть датчик температуры и влажности
|
#define SERVICE_THS 0x00000080 // есть датчик температуры и влажности
|
||||||
#define SERVICE_RDS 0x00000100 // есть обслуживние геркона/счета импульсов
|
#define SERVICE_RDS 0x00000100 // есть обслуживние геркона/счета импульсов
|
||||||
#define SERVICE_KEY 0x00000200 // есть кнопка
|
#define SERVICE_KEY 0x00000200 // есть кнопка
|
||||||
#define SERVICE_OUTS 0x00000400 // пока нет // есть обслуживние выходных пинов
|
//#define SERVICE_OUTS 0x00000400 // пока нет // есть обслуживние выходных пинов
|
||||||
#define SERVICE_INS 0x00000800 // пока нет // есть обслуживние входных пинов
|
//#define SERVICE_INS 0x00000800 // пока нет // есть обслуживние входных пинов
|
||||||
//#define SERVICE_TIME_ADJUST 0x00001000 // пока нет // есть функция коррекции счета времени
|
//#define SERVICE_TIME_ADJUST 0x00001000 // пока нет // есть функция коррекции счета времени
|
||||||
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет // есть реальные часы RTC
|
//#define SERVICE_HARD_CLOCK 0x00002000 // пока нет // есть реальные часы RTC
|
||||||
#define SERVICE_TH_TRG 0x00004000 // триггер по температуре и влажности
|
#define SERVICE_TH_TRG 0x00004000 // триггер по температуре и влажности
|
||||||
#define SERVICE_LED 0x00008000 // use led
|
#define SERVICE_LED 0x00008000 // use led
|
||||||
//#define SERVICE_MI_KEYS 0x00010000 // use mi keys (не используется)
|
//#define SERVICE_MI_KEYS 0x00010000 // use mi keys (не используется)
|
||||||
|
|
@ -462,7 +462,7 @@ typedef struct _work_parm_t {
|
||||||
#if (DEV_SERVICES & SERVICE_SCREEN)
|
#if (DEV_SERVICES & SERVICE_SCREEN)
|
||||||
uint8_t lcd_count;
|
uint8_t lcd_count;
|
||||||
#endif
|
#endif
|
||||||
uint8_t lcd_ext_chow; // показ TH/Clock отключен
|
// uint8_t lcd_ext_chow; // показ TH/Clock отключен
|
||||||
uint8_t reboot; // reboot on disconnect, записывается в [OTA_MODE_SELECT_REG]
|
uint8_t reboot; // reboot on disconnect, записывается в [OTA_MODE_SELECT_REG]
|
||||||
uint8_t boot_flg; // байт из [OTA_MODE_SELECT_REG]
|
uint8_t boot_flg; // байт из [OTA_MODE_SELECT_REG]
|
||||||
} work_parm_t;
|
} work_parm_t;
|
||||||
|
|
|
||||||
|
|
@ -127,9 +127,6 @@
|
||||||
#error "DEVICE Not released!"
|
#error "DEVICE Not released!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern uint8_t lcd_i2c_addr; // LCD controller I2C address
|
|
||||||
extern uint8_t display_buff[LCD_BUF_SIZE];
|
|
||||||
|
|
||||||
|
|
||||||
/* 0x0 = " "
|
/* 0x0 = " "
|
||||||
* 0x1 = "°Г"
|
* 0x1 = "°Г"
|
||||||
|
|
@ -147,14 +144,6 @@ typedef enum {
|
||||||
LCD_TSYMBOL_E = 7 // "°E"
|
LCD_TSYMBOL_E = 7 // "°E"
|
||||||
} LCD_TEMP_SYMBOLS;
|
} LCD_TEMP_SYMBOLS;
|
||||||
|
|
||||||
/* 0 = " " off,
|
|
||||||
* 1 = " ^_^ " happy
|
|
||||||
* 2 = " -^- " sad
|
|
||||||
* 3 = " ooo "
|
|
||||||
* 4 = "( )"
|
|
||||||
* 5 = "(^_^)" happy
|
|
||||||
* 6 = "(-^-)" sad
|
|
||||||
* 7 = "(ooo)" */
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
LD_SSYMBOL_OFF, // 0 = " " off,
|
LD_SSYMBOL_OFF, // 0 = " " off,
|
||||||
LD_SSYMBOL__HAPPY, // 1 = " ^_^ " happy
|
LD_SSYMBOL__HAPPY, // 1 = " ^_^ " happy
|
||||||
|
|
@ -166,20 +155,62 @@ typedef enum {
|
||||||
LD_SSYMBOL_ALL, // 7 = "(ooo)"
|
LD_SSYMBOL_ALL, // 7 = "(ooo)"
|
||||||
} LCD_SMILEY_SYMBOLS;
|
} LCD_SMILEY_SYMBOLS;
|
||||||
|
|
||||||
|
typedef struct _ext_lcd_data_t {
|
||||||
|
int16_t big_number; // -995..19995, x0.1
|
||||||
|
int16_t small_number; // -9..99, x1
|
||||||
|
uint16_t vtime_sec; // validity time, in sec
|
||||||
|
struct __attribute__((packed)) {
|
||||||
|
/* 0 = " " off,
|
||||||
|
* 1 = " ^_^ "
|
||||||
|
* 2 = " -^- "
|
||||||
|
* 3 = " ooo "
|
||||||
|
* 4 = "( )"
|
||||||
|
* 5 = "(^_^)" happy
|
||||||
|
* 6 = "(-^-)" sad
|
||||||
|
* 7 = "(ooo)" */
|
||||||
|
uint8_t smiley : 3;
|
||||||
|
uint8_t percent_on : 1;
|
||||||
|
uint8_t battery : 1;
|
||||||
|
/* 0 = " ", shr 0x00
|
||||||
|
* 1 = "°Г", shr 0x20
|
||||||
|
* 2 = " -", shr 0x40
|
||||||
|
* 3 = "°F", shr 0x60
|
||||||
|
* 4 = " _", shr 0x80
|
||||||
|
* 5 = "°C", shr 0xa0
|
||||||
|
* 6 = " =", shr 0xc0
|
||||||
|
* 7 = "°E", shr 0xe0 */
|
||||||
|
uint8_t temp_symbol : 3;
|
||||||
|
} flg;
|
||||||
|
} ext_lcd_data_t, * pext_lcd_data_t;
|
||||||
|
|
||||||
|
typedef struct _lcd_data_t {
|
||||||
|
uint32_t chow_ext_ut;
|
||||||
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
|
ext_lcd_data_t ext;
|
||||||
|
#endif
|
||||||
|
uint8_t lcd_i2c_addr; // LCD controller I2C address
|
||||||
|
uint8_t display_buff[LCD_BUF_SIZE];
|
||||||
|
uint8_t display_out_buff[LCD_BUF_SIZE+1];
|
||||||
|
} lcd_data_t;
|
||||||
|
|
||||||
|
extern lcd_data_t lcdd;
|
||||||
|
|
||||||
void init_lcd(void);
|
void init_lcd(void);
|
||||||
void update_lcd(void);
|
void update_lcd(void);
|
||||||
void show_small_number(int16_t number, bool percent);
|
//void show_small_number(int16_t number, bool percent);
|
||||||
void show_big_number_x10(int16_t number);
|
//void show_big_number_x10(int16_t number);
|
||||||
void show_battery_symbol(bool state);
|
//void show_battery_symbol(bool state);
|
||||||
void show_ble_symbol(bool state);
|
void show_ble_symbol(bool state);
|
||||||
void show_smiley(LCD_SMILEY_SYMBOLS symbol);
|
//void show_smiley(LCD_SMILEY_SYMBOLS symbol);
|
||||||
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol);
|
//void show_temp_symbol(LCD_TEMP_SYMBOLS symbol);
|
||||||
//void chow_clock(void);
|
|
||||||
//void chow_measure(void);
|
|
||||||
|
|
||||||
void chow_lcd(int flg);
|
void chow_lcd(int flg);
|
||||||
void lcd_show_version(void);
|
void lcd_show_version(void);
|
||||||
extern void send_to_lcd(uint8_t *pbuf, int len);
|
extern void send_to_lcd(uint8_t *pbuf, int len);
|
||||||
|
|
||||||
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
|
void chow_ext_data(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // (DEV_SERVICES & SERVICE_SCREEN)
|
#endif // (DEV_SERVICES & SERVICE_SCREEN)
|
||||||
#endif /* _LCD_TH05_H_ */
|
#endif /* _LCD_TH05_H_ */
|
||||||
|
|
|
||||||
|
|
@ -59,12 +59,7 @@ const uint8_t display_numbers[] = {
|
||||||
#define LCD_SYM_a 0b011110110 // "a"
|
#define LCD_SYM_a 0b011110110 // "a"
|
||||||
#define LCD_SYM_P 0b001110101 // "P"
|
#define LCD_SYM_P 0b001110101 // "P"
|
||||||
|
|
||||||
uint8_t lcd_i2c_addr; // = 0x3E
|
lcd_data_t lcdd;
|
||||||
|
|
||||||
uint8_t display_buff[LCD_BUF_SIZE] = {
|
|
||||||
LCD_SYM_o, LCD_SYM_o, LCD_SYM_o,
|
|
||||||
};
|
|
||||||
uint8_t display_out_buff[LCD_BUF_SIZE+1] = { 0 };
|
|
||||||
|
|
||||||
const uint8_t lcd_init_cmd[] = {
|
const uint8_t lcd_init_cmd[] = {
|
||||||
// LCD controller initialize:
|
// LCD controller initialize:
|
||||||
|
|
@ -87,10 +82,10 @@ const uint8_t lcd_init_cmd[] = {
|
||||||
* 0x6 = " ="
|
* 0x6 = " ="
|
||||||
* 0x7 = "°E" */
|
* 0x7 = "°E" */
|
||||||
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
display_buff[2] &= ~BIT(3);
|
lcdd.display_buff[2] &= ~BIT(3);
|
||||||
display_buff[3] &= ~(BIT(7)|BIT(5)) ;
|
lcdd.display_buff[3] &= ~(BIT(7)|BIT(5)) ;
|
||||||
display_buff[2] |= (symbol << 2) & BIT(3);
|
lcdd.display_buff[2] |= (symbol << 2) & BIT(3);
|
||||||
display_buff[3] |= (symbol << 5) & (BIT(7)|BIT(5));
|
lcdd.display_buff[3] |= (symbol << 5) & (BIT(7)|BIT(5));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0 = " " off,
|
/* 0 = " " off,
|
||||||
|
|
@ -102,95 +97,95 @@ void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
* 6 = "(-^-)" sad
|
* 6 = "(-^-)" sad
|
||||||
* 7 = "(ooo)" */
|
* 7 = "(ooo)" */
|
||||||
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
||||||
display_buff[3] &= ~0x15;
|
lcdd.display_buff[3] &= ~0x15;
|
||||||
symbol = (symbol & 1) | ((symbol << 1) & 4) | ((symbol << 2) & 0x10);
|
symbol = (symbol & 1) | ((symbol << 1) & 4) | ((symbol << 2) & 0x10);
|
||||||
display_buff[3] |= symbol;
|
lcdd.display_buff[3] |= symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_ble_symbol(bool state) {
|
void show_ble_symbol(bool state) {
|
||||||
if (state)
|
if (state)
|
||||||
display_buff[4] |= BIT(3);
|
lcdd.display_buff[4] |= BIT(3);
|
||||||
else
|
else
|
||||||
display_buff[4] &= ~BIT(3);
|
lcdd.display_buff[4] &= ~BIT(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_battery_symbol(bool state) {
|
void show_battery_symbol(bool state) {
|
||||||
if (state)
|
if (state)
|
||||||
display_buff[3] |= BIT(6);
|
lcdd.display_buff[3] |= BIT(6);
|
||||||
else
|
else
|
||||||
display_buff[3] &= ~BIT(6);
|
lcdd.display_buff[3] &= ~BIT(6);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_big_number_x10(int16_t number) {
|
void show_big_number_x10(int16_t number) {
|
||||||
display_buff[2] &= BIT(3); // F/C "_"
|
lcdd.display_buff[2] &= BIT(3); // F/C "_"
|
||||||
if (number > 19995) {
|
if (number > 19995) {
|
||||||
display_buff[0] = LCD_SYM_H; // "H"
|
lcdd.display_buff[0] = LCD_SYM_H; // "H"
|
||||||
display_buff[1] = LCD_SYM_i; // "i"
|
lcdd.display_buff[1] = LCD_SYM_i; // "i"
|
||||||
} else if (number < -995) {
|
} else if (number < -995) {
|
||||||
display_buff[0] = LCD_SYM_L; // "L"
|
lcdd.display_buff[0] = LCD_SYM_L; // "L"
|
||||||
display_buff[1] = LCD_SYM_o; // "o"
|
lcdd.display_buff[1] = LCD_SYM_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
display_buff[0] = 0;
|
lcdd.display_buff[0] = 0;
|
||||||
display_buff[1] = 0;
|
lcdd.display_buff[1] = 0;
|
||||||
/* number: -995..19995 */
|
/* number: -995..19995 */
|
||||||
if (number > 1995 || number < -95) {
|
if (number > 1995 || number < -95) {
|
||||||
display_buff[1] = 0; // no point, show: -99..1999
|
lcdd.display_buff[1] = 0; // no point, show: -99..1999
|
||||||
if (number < 0){
|
if (number < 0){
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[0] = BIT(2); // "-"
|
lcdd.display_buff[0] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
number = (number + 5) / 10; // round(div 10)
|
number = (number + 5) / 10; // round(div 10)
|
||||||
} else { // show: -9.9..199.9
|
} else { // show: -9.9..199.9
|
||||||
display_buff[1] = BIT(3); // point,
|
lcdd.display_buff[1] = BIT(3); // point,
|
||||||
if (number < 0){
|
if (number < 0){
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[0] = BIT(2); // "-"
|
lcdd.display_buff[0] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* number: -99..1999 */
|
/* number: -99..1999 */
|
||||||
if (number > 999) display_buff[0] |= BIT(3); // "1" 1000..1999
|
if (number > 999) lcdd.display_buff[0] |= BIT(3); // "1" 1000..1999
|
||||||
if (number > 99) display_buff[0] |= display_numbers[number / 100 % 10];
|
if (number > 99) lcdd.display_buff[0] |= display_numbers[number / 100 % 10];
|
||||||
if (number > 9) display_buff[1] |= display_numbers[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[1] |= display_numbers[number / 10 % 10];
|
||||||
else display_buff[1] |= LCD_SYM_0; // "0"
|
else lcdd.display_buff[1] |= LCD_SYM_0; // "0"
|
||||||
display_buff[2] |= display_numbers[number %10];
|
lcdd.display_buff[2] |= display_numbers[number %10];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -9 .. 99 */
|
/* -9 .. 99 */
|
||||||
void show_small_number(int16_t number, bool percent) {
|
void show_small_number(int16_t number, bool percent) {
|
||||||
|
|
||||||
display_buff[4] &= BIT(3); // connect
|
lcdd.display_buff[4] &= BIT(3); // connect
|
||||||
display_buff[5] = percent? BIT(3) : 0;
|
lcdd.display_buff[5] = percent? BIT(3) : 0;
|
||||||
if (number > 99) {
|
if (number > 99) {
|
||||||
display_buff[4] |= LCD_SYM_H; // "H"
|
lcdd.display_buff[4] |= LCD_SYM_H; // "H"
|
||||||
display_buff[5] |= LCD_SYM_i; // "i"
|
lcdd.display_buff[5] |= LCD_SYM_i; // "i"
|
||||||
} else if (number < -9) {
|
} else if (number < -9) {
|
||||||
display_buff[4] |= LCD_SYM_L; // "L"
|
lcdd.display_buff[4] |= LCD_SYM_L; // "L"
|
||||||
display_buff[5] |= LCD_SYM_o; // "o"
|
lcdd.display_buff[5] |= LCD_SYM_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[4] = BIT(2); // "-"
|
lcdd.display_buff[4] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
if (number > 9) display_buff[4] |= display_numbers[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[4] |= display_numbers[number / 10];
|
||||||
display_buff[5] |= display_numbers[number %10];
|
lcdd.display_buff[5] |= display_numbers[number %10];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_show_version(void) {
|
void lcd_show_version(void) {
|
||||||
#if OTA_TYPE
|
#if OTA_TYPE
|
||||||
display_buff[0] = LCD_SYM_b;
|
lcdd.display_buff[0] = LCD_SYM_b;
|
||||||
display_buff[1] = LCD_SYM_o;
|
lcdd.display_buff[1] = LCD_SYM_o;
|
||||||
display_buff[2] = LCD_SYM_t;
|
lcdd.display_buff[2] = LCD_SYM_t;
|
||||||
#else
|
#else
|
||||||
display_buff[0] = LCD_SYM_A;
|
lcdd.display_buff[0] = LCD_SYM_A;
|
||||||
display_buff[1] = LCD_SYM_P;
|
lcdd.display_buff[1] = LCD_SYM_P;
|
||||||
display_buff[2] = LCD_SYM_P;
|
lcdd.display_buff[2] = LCD_SYM_P;
|
||||||
#endif
|
#endif
|
||||||
display_buff[3] &= BIT(6); // bat
|
lcdd.display_buff[3] &= BIT(6); // bat
|
||||||
display_buff[4] &= BIT(3); // connect
|
lcdd.display_buff[4] &= BIT(3); // connect
|
||||||
display_buff[4] |= display_numbers[(APP_VERSION>>4) & 0x0f];
|
lcdd.display_buff[4] |= display_numbers[(APP_VERSION>>4) & 0x0f];
|
||||||
display_buff[5] = display_numbers[APP_VERSION & 0x0f];
|
lcdd.display_buff[5] = display_numbers[APP_VERSION & 0x0f];
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -198,13 +193,13 @@ void chow_clock(void) {
|
||||||
uint32_t tmp = clkt.utc_time_sec / 60;
|
uint32_t tmp = clkt.utc_time_sec / 60;
|
||||||
uint32_t min = tmp % 60;
|
uint32_t min = tmp % 60;
|
||||||
uint32_t hrs = (tmp / 60) % 24;
|
uint32_t hrs = (tmp / 60) % 24;
|
||||||
display_buff[0] = 0;
|
lcdd.display_buff[0] = 0;
|
||||||
display_buff[1] = display_numbers[(hrs / 10) % 10];
|
lcdd.display_buff[1] = display_numbers[hrs / 10];
|
||||||
display_buff[2] = display_numbers[hrs % 10];
|
lcdd.display_buff[2] = display_numbers[hrs % 10];
|
||||||
display_buff[3] &= BIT(6); // bat
|
lcdd.display_buff[3] &= BIT(6); // bat
|
||||||
display_buff[4] &= BIT(3); // connect
|
lcdd.display_buff[4] &= BIT(3); // connect
|
||||||
display_buff[4] |= display_numbers[(min / 10) % 10];
|
lcdd.display_buff[4] |= display_numbers[min / 10];
|
||||||
display_buff[5] = display_numbers[min % 10];
|
lcdd.display_buff[5] = display_numbers[min % 10];
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -265,12 +260,30 @@ static void chow_measure(void) {
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
|
|
||||||
|
void chow_ext_data(void) {
|
||||||
|
show_big_number_x10(lcdd.ext.big_number);
|
||||||
|
show_small_number(lcdd.ext.small_number, lcdd.ext.flg.percent_on);
|
||||||
|
show_battery_symbol(lcdd.ext.flg.battery);
|
||||||
|
show_smiley(lcdd.ext.flg.smiley);
|
||||||
|
show_temp_symbol(lcdd.ext.flg.temp_symbol);
|
||||||
|
update_lcd();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* flg != 0 -> chow_measure */
|
/* flg != 0 -> chow_measure */
|
||||||
void chow_lcd(int flg) {
|
void chow_lcd(int flg) {
|
||||||
#if OTA_TYPE == OTA_TYPE_BOOT
|
#if OTA_TYPE == OTA_TYPE_BOOT
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(flg)
|
if(flg)
|
||||||
chow_measure();
|
chow_measure();
|
||||||
#else
|
#else
|
||||||
|
if(cfg.flg & FLG_DISPLAY_OFF)
|
||||||
|
return;
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(cfg.flg & FLG_SHOW_TIME) {
|
if(cfg.flg & FLG_SHOW_TIME) {
|
||||||
if(wrk.lcd_count++ & 1)
|
if(wrk.lcd_count++ & 1)
|
||||||
chow_clock();
|
chow_clock();
|
||||||
|
|
@ -283,9 +296,9 @@ void chow_lcd(int flg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_to_lcd(uint8_t *pbuf, int len) {
|
void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
if (lcd_i2c_addr) {
|
if (lcdd.lcd_i2c_addr) {
|
||||||
init_i2c(&i2c_dev1);
|
init_i2c(&i2c_dev1);
|
||||||
send_i2c_buf(&i2c_dev1, lcd_i2c_addr, pbuf, len);
|
send_i2c_buf(&i2c_dev1, lcdd.lcd_i2c_addr, pbuf, len);
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -293,12 +306,12 @@ void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
|
|
||||||
void update_lcd(void) {
|
void update_lcd(void) {
|
||||||
#if (OTA_TYPE == OTA_TYPE_APP)
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
if(lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
if(lcdd.lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
if(memcmp(&display_out_buff[1], display_buff, sizeof(display_buff))) {
|
if(memcmp(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff))) {
|
||||||
memcpy(&display_out_buff[1], display_buff, sizeof(display_buff));
|
memcpy(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff));
|
||||||
send_to_lcd(display_out_buff, sizeof(display_out_buff));
|
send_to_lcd(lcdd.display_out_buff, sizeof(lcdd.display_out_buff));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -310,9 +323,9 @@ void init_lcd(void) {
|
||||||
if(cfg.flg & FLG_DISPLAY_OFF)
|
if(cfg.flg & FLG_DISPLAY_OFF)
|
||||||
send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd0); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
|
send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd0); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
|
||||||
#endif
|
#endif
|
||||||
lcd_i2c_addr = LCD_I2C_ADDR;
|
lcdd.lcd_i2c_addr = LCD_I2C_ADDR;
|
||||||
} else
|
} else
|
||||||
lcd_i2c_addr = 0;
|
lcdd.lcd_i2c_addr = 0;
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
i2c_dev1.speed = I2C_400KHZ;
|
i2c_dev1.speed = I2C_400KHZ;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -123,12 +123,7 @@ const uint8_t display_numbers12[] = {
|
||||||
#define LCD_SYM12_a 0b001101101 // "a"
|
#define LCD_SYM12_a 0b001101101 // "a"
|
||||||
#define LCD_SYM12_P 0b001110011 // "P"
|
#define LCD_SYM12_P 0b001110011 // "P"
|
||||||
|
|
||||||
uint8_t lcd_i2c_addr; // = 0x3E
|
lcd_data_t lcdd;
|
||||||
|
|
||||||
uint8_t display_buff[LCD_BUF_SIZE] = {
|
|
||||||
0, LCD_SYM12_o, LCD_SYM12_o, 0
|
|
||||||
};
|
|
||||||
uint8_t display_out_buff[LCD_BUF_SIZE+1] = { 0 };
|
|
||||||
|
|
||||||
const uint8_t lcd_init_cmd[] = {
|
const uint8_t lcd_init_cmd[] = {
|
||||||
// LCD controller initialize:
|
// LCD controller initialize:
|
||||||
|
|
@ -151,13 +146,13 @@ const uint8_t lcd_init_cmd[] = {
|
||||||
* 0x6 = " ="
|
* 0x6 = " ="
|
||||||
* 0x7 = "°E" */
|
* 0x7 = "°E" */
|
||||||
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
display_buff[5] &= ~(BIT(1) | BIT(2) | BIT(3));
|
lcdd.display_buff[5] &= ~(BIT(1) | BIT(2) | BIT(3));
|
||||||
if(symbol & 1)
|
if(symbol & 1)
|
||||||
display_buff[5] |= BIT(3);
|
lcdd.display_buff[5] |= BIT(3);
|
||||||
if(symbol & 2)
|
if(symbol & 2)
|
||||||
display_buff[5] |= BIT(1);
|
lcdd.display_buff[5] |= BIT(1);
|
||||||
if(symbol & 4)
|
if(symbol & 4)
|
||||||
display_buff[5] |= BIT(2);
|
lcdd.display_buff[5] |= BIT(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0 = " " off,
|
/* 0 = " " off,
|
||||||
|
|
@ -169,72 +164,74 @@ void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
* 6 = "(-^-)" sad
|
* 6 = "(-^-)" sad
|
||||||
* 7 = "(ooo)" */
|
* 7 = "(ooo)" */
|
||||||
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
||||||
display_buff[0] &= ~(BIT(0) | BIT(1) | BIT(2) | BIT(3));
|
lcdd.display_buff[0] &= ~(BIT(0) | BIT(1) | BIT(2) | BIT(3));
|
||||||
if(symbol & 1)
|
if(symbol & 1)
|
||||||
display_buff[0] |= BIT(1) | BIT(3);
|
lcdd.display_buff[0] |= BIT(1) | BIT(3);
|
||||||
if(symbol & 2)
|
if(symbol & 2)
|
||||||
display_buff[0] |= BIT(1) | BIT(2);
|
lcdd.display_buff[0] |= BIT(1) | BIT(2);
|
||||||
if(symbol & 4)
|
if(symbol & 4)
|
||||||
display_buff[0] |= BIT(0);
|
lcdd.display_buff[0] |= BIT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_ble_symbol(bool state) {
|
void show_ble_symbol(bool state) {
|
||||||
if (state)
|
if (state)
|
||||||
display_buff[0] |= BIT(4);
|
lcdd.display_buff[0] |= BIT(4);
|
||||||
else
|
else
|
||||||
display_buff[0] &= ~BIT(4);
|
lcdd.display_buff[0] &= ~BIT(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_battery(uint8_t level) {
|
void show_battery_symbol(bool state) {
|
||||||
display_buff[3] &= ~(BIT(1) | BIT(2) | BIT(5) | BIT(6));
|
lcdd.display_buff[3] &= ~(BIT(1) | BIT(2) | BIT(5) | BIT(6));
|
||||||
display_buff[4] &= ~(BIT(5)); // | BIT(6));
|
lcdd.display_buff[4] &= ~(BIT(5) | BIT(6));
|
||||||
display_buff[4] |= BIT(6);
|
if (state) {
|
||||||
if(level > 84)
|
lcdd.display_buff[4] |= BIT(6);
|
||||||
display_buff[4] |= BIT(5);
|
if(measured_data.battery > 84)
|
||||||
if(level > 68)
|
lcdd.display_buff[4] |= BIT(5);
|
||||||
display_buff[3] |= BIT(2);
|
if(measured_data.battery > 68)
|
||||||
if(level > 52)
|
lcdd.display_buff[3] |= BIT(2);
|
||||||
display_buff[3] |= BIT(1);
|
if(measured_data.battery > 52)
|
||||||
if(level > 36)
|
lcdd.display_buff[3] |= BIT(1);
|
||||||
display_buff[3] |= BIT(5);
|
if(measured_data.battery > 36)
|
||||||
if(level > 20)
|
lcdd.display_buff[3] |= BIT(5);
|
||||||
display_buff[3] |= BIT(6);
|
if(measured_data.battery > 20)
|
||||||
|
lcdd.display_buff[3] |= BIT(6);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_big_number_x10(int16_t number) {
|
void show_big_number_x10(int16_t number) {
|
||||||
display_buff[5] &= BIT(1) | BIT(2) | BIT(3); // F/C "_"
|
lcdd.display_buff[5] &= BIT(1) | BIT(2) | BIT(3); // F/C "_"
|
||||||
display_buff[4] &= BIT(5) | BIT(6) | BIT(7); // bat, %
|
lcdd.display_buff[4] &= BIT(5) | BIT(6) | BIT(7); // bat, %
|
||||||
if (number > 19995) {
|
if (number > 19995) {
|
||||||
display_buff[7] = LCD_SYM67_H; // "H"
|
lcdd.display_buff[7] = LCD_SYM67_H; // "H"
|
||||||
display_buff[6] = LCD_SYM67_i; // "i"
|
lcdd.display_buff[6] = LCD_SYM67_i; // "i"
|
||||||
} else if (number < -995) {
|
} else if (number < -995) {
|
||||||
display_buff[7] = LCD_SYM67_L; // "L"
|
lcdd.display_buff[7] = LCD_SYM67_L; // "L"
|
||||||
display_buff[6] = LCD_SYM67_o; // "o"
|
lcdd.display_buff[6] = LCD_SYM67_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
display_buff[6] = 0;
|
lcdd.display_buff[6] = 0;
|
||||||
display_buff[7] = 0;
|
lcdd.display_buff[7] = 0;
|
||||||
/* number: -19995..19995 */
|
/* number: -19995..19995 */
|
||||||
if (number > 1995 || number < -1995) {
|
if (number > 1995 || number < -1995) {
|
||||||
//display_buff[5] &= ~BIT(0); // no point, show: -1999..1999
|
//lcdd.display_buff[5] &= ~BIT(0); // no point, show: -1999..1999
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[6] = BIT(0); // "-"
|
lcdd.display_buff[6] = BIT(0); // "-"
|
||||||
}
|
}
|
||||||
number = (number + 5) / 10; // round(div 10)
|
number = (number + 5) / 10; // round(div 10)
|
||||||
} else { // show: -199.9..199.9
|
} else { // show: -199.9..199.9
|
||||||
display_buff[5] |= BIT(0); // point,
|
lcdd.display_buff[5] |= BIT(0); // point,
|
||||||
if (number < 0){
|
if (number < 0){
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[6] = BIT(2); // "-"
|
lcdd.display_buff[6] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* number: -1999..1999 */
|
/* number: -1999..1999 */
|
||||||
if (number > 999) display_buff[7] = BIT(0); // "1" 1000..1999
|
if (number > 999) lcdd.display_buff[7] = BIT(0); // "1" 1000..1999
|
||||||
if (number > 99) display_buff[7] |= display_numbers67[number / 100 % 10];
|
if (number > 99) lcdd.display_buff[7] |= display_numbers67[(number / 100) % 10];
|
||||||
if (number > 9) display_buff[6] |= display_numbers67[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[6] |= display_numbers67[(number / 10) % 10];
|
||||||
else display_buff[6] |= LCD_SYM67_0; // "0"
|
else lcdd.display_buff[6] |= LCD_SYM67_0; // "0"
|
||||||
display_buff[4] |= display_numbers45[number %10] & 0x0f;
|
lcdd.display_buff[4] |= display_numbers45[number %10] & 0x0f;
|
||||||
display_buff[5] |= display_numbers45[number %10] & 0xe0;
|
lcdd.display_buff[5] |= display_numbers45[number %10] & 0xe0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -242,43 +239,44 @@ void show_big_number_x10(int16_t number) {
|
||||||
void show_small_number(int16_t number, bool percent) {
|
void show_small_number(int16_t number, bool percent) {
|
||||||
|
|
||||||
if(percent)
|
if(percent)
|
||||||
display_buff[4] |= BIT(7);
|
lcdd.display_buff[4] |= BIT(7);
|
||||||
else
|
else
|
||||||
display_buff[4] &= ~BIT(7);
|
lcdd.display_buff[4] &= ~BIT(7);
|
||||||
|
|
||||||
if (number > 99) {
|
if (number > 99) {
|
||||||
display_buff[1] |= LCD_SYM12_H; // "H"
|
lcdd.display_buff[1] = LCD_SYM12_H; // "H"
|
||||||
display_buff[2] |= LCD_SYM12_i; // "i"
|
lcdd.display_buff[2] = LCD_SYM12_i; // "i"
|
||||||
} else if (number < -9) {
|
} else if (number < -9) {
|
||||||
display_buff[1] |= LCD_SYM12_L; // "L"
|
lcdd.display_buff[1] = LCD_SYM12_L; // "L"
|
||||||
display_buff[2] |= LCD_SYM12_o; // "o"
|
lcdd.display_buff[2] = LCD_SYM12_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
|
lcdd.display_buff[1] = 0;
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[1] = BIT(5); // "-"
|
lcdd.display_buff[1] = BIT(5); // "-"
|
||||||
}
|
}
|
||||||
if (number > 9) display_buff[1] = display_numbers12[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[1] = display_numbers12[number / 10];
|
||||||
display_buff[2] = display_numbers12[number %10];
|
lcdd.display_buff[2] = display_numbers12[number %10];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_show_version(void) {
|
void lcd_show_version(void) {
|
||||||
display_buff[0] &= BIT(4); // connect
|
lcdd.display_buff[0] &= BIT(4); // connect
|
||||||
display_buff[3] &= BIT(1) | BIT(2) | BIT(5) | BIT(6); // bat
|
lcdd.display_buff[3] &= BIT(1) | BIT(2) | BIT(5) | BIT(6); // bat
|
||||||
display_buff[4] &= BIT(5) | BIT(6);
|
lcdd.display_buff[4] &= BIT(5) | BIT(6);
|
||||||
#if OTA_TYPE
|
#if OTA_TYPE
|
||||||
display_buff[7] = LCD_SYM67_b;
|
lcdd.display_buff[7] = LCD_SYM67_b;
|
||||||
display_buff[6] = LCD_SYM67_o;
|
lcdd.display_buff[6] = LCD_SYM67_o;
|
||||||
display_buff[5] = LCD_SYM45_t & 0xe0;
|
lcdd.display_buff[5] = LCD_SYM45_t & 0xe0;
|
||||||
display_buff[4] |= LCD_SYM45_t & 0x0f;
|
lcdd.display_buff[4] |= LCD_SYM45_t & 0x0f;
|
||||||
#else
|
#else
|
||||||
display_buff[7] = LCD_SYM67_A;
|
lcdd.display_buff[7] = LCD_SYM67_A;
|
||||||
display_buff[6] = LCD_SYM67_P;
|
lcdd.display_buff[6] = LCD_SYM67_P;
|
||||||
display_buff[5] = LCD_SYM45_P & 0xe0;
|
lcdd.display_buff[5] = LCD_SYM45_P & 0xe0;
|
||||||
display_buff[4] |= LCD_SYM45_P & 0x0f;
|
lcdd.display_buff[4] |= LCD_SYM45_P & 0x0f;
|
||||||
#endif
|
#endif
|
||||||
display_buff[1] = display_numbers12[(APP_VERSION>>4) & 0x0f];
|
lcdd.display_buff[1] = display_numbers12[(APP_VERSION>>4) & 0x0f];
|
||||||
display_buff[2] = display_numbers12[APP_VERSION & 0x0f];
|
lcdd.display_buff[2] = display_numbers12[APP_VERSION & 0x0f];
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -287,16 +285,16 @@ void chow_clock(void) {
|
||||||
uint32_t min = tmp % 60;
|
uint32_t min = tmp % 60;
|
||||||
uint32_t hrs = (tmp / 60) % 24;
|
uint32_t hrs = (tmp / 60) % 24;
|
||||||
|
|
||||||
display_buff[0] &= BIT(4); // connect
|
lcdd.display_buff[0] &= BIT(4); // connect
|
||||||
display_buff[3] &= BIT(1) | BIT(2) | BIT(5) | BIT(6); // bat
|
lcdd.display_buff[3] &= BIT(1) | BIT(2) | BIT(5) | BIT(6); // bat
|
||||||
display_buff[4] &= BIT(5) | BIT(6);
|
lcdd.display_buff[4] &= BIT(5) | BIT(6);
|
||||||
|
|
||||||
display_buff[7] = display_numbers67[(hrs / 10) % 10];
|
lcdd.display_buff[7] = display_numbers67[hrs / 10];
|
||||||
display_buff[6] = display_numbers67[hrs % 10];
|
lcdd.display_buff[6] = display_numbers67[hrs % 10];
|
||||||
display_buff[5] = 0;
|
lcdd.display_buff[5] = 0;
|
||||||
|
|
||||||
display_buff[1] = display_numbers12[(min / 10) % 10];
|
lcdd.display_buff[1] = display_numbers12[min / 10];
|
||||||
display_buff[2] = display_numbers12[min % 10];
|
lcdd.display_buff[2] = display_numbers12[min % 10];
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -313,7 +311,7 @@ static void chow_measure(void) {
|
||||||
if(h > 99)
|
if(h > 99)
|
||||||
h = 99;
|
h = 99;
|
||||||
show_small_number(h, true);
|
show_small_number(h, true);
|
||||||
show_battery(measured_data.battery);
|
show_battery_symbol(1);
|
||||||
#if (OTA_TYPE == OTA_TYPE_APP)
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
if(cfg.flg & FLG_SHOW_SMILEY) {
|
if(cfg.flg & FLG_SHOW_SMILEY) {
|
||||||
#if (DEV_SERVICES & SERVICE_TH_TRG)
|
#if (DEV_SERVICES & SERVICE_TH_TRG)
|
||||||
|
|
@ -357,12 +355,30 @@ static void chow_measure(void) {
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
|
|
||||||
|
void chow_ext_data(void) {
|
||||||
|
show_big_number_x10(lcdd.ext.big_number);
|
||||||
|
show_small_number(lcdd.ext.small_number, lcdd.ext.flg.percent_on);
|
||||||
|
show_battery_symbol(lcdd.ext.flg.battery);
|
||||||
|
show_smiley(lcdd.ext.flg.smiley);
|
||||||
|
show_temp_symbol(lcdd.ext.flg.temp_symbol);
|
||||||
|
update_lcd();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* flg != 0 -> chow_measure */
|
/* flg != 0 -> chow_measure */
|
||||||
void chow_lcd(int flg) {
|
void chow_lcd(int flg) {
|
||||||
#if OTA_TYPE == OTA_TYPE_BOOT
|
#if OTA_TYPE == OTA_TYPE_BOOT
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(flg)
|
if(flg)
|
||||||
chow_measure();
|
chow_measure();
|
||||||
#else
|
#else
|
||||||
|
if(cfg.flg & FLG_DISPLAY_OFF)
|
||||||
|
return;
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(cfg.flg & FLG_SHOW_TIME) {
|
if(cfg.flg & FLG_SHOW_TIME) {
|
||||||
if(wrk.lcd_count++ & 1)
|
if(wrk.lcd_count++ & 1)
|
||||||
chow_clock();
|
chow_clock();
|
||||||
|
|
@ -375,9 +391,9 @@ void chow_lcd(int flg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_to_lcd(uint8_t *pbuf, int len) {
|
void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
if (lcd_i2c_addr) {
|
if (lcdd.lcd_i2c_addr) {
|
||||||
init_i2c(&i2c_dev1);
|
init_i2c(&i2c_dev1);
|
||||||
send_i2c_buf(&i2c_dev1, lcd_i2c_addr, pbuf, len);
|
send_i2c_buf(&i2c_dev1, lcdd.lcd_i2c_addr, pbuf, len);
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -385,12 +401,12 @@ void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
|
|
||||||
void update_lcd(void) {
|
void update_lcd(void) {
|
||||||
#if (OTA_TYPE == OTA_TYPE_APP)
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
if(lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
if(lcdd.lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
if(memcmp(&display_out_buff[1], display_buff, sizeof(display_buff))) {
|
if(memcmp(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff))) {
|
||||||
memcpy(&display_out_buff[1], display_buff, sizeof(display_buff));
|
memcpy(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff));
|
||||||
send_to_lcd(display_out_buff, sizeof(display_out_buff));
|
send_to_lcd(lcdd.display_out_buff, sizeof(lcdd.display_out_buff));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -402,9 +418,9 @@ void init_lcd(void) {
|
||||||
if(cfg.flg & FLG_DISPLAY_OFF)
|
if(cfg.flg & FLG_DISPLAY_OFF)
|
||||||
send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd0); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
|
send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd0); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
|
||||||
#endif
|
#endif
|
||||||
lcd_i2c_addr = LCD_I2C_ADDR;
|
lcdd.lcd_i2c_addr = LCD_I2C_ADDR;
|
||||||
} else
|
} else
|
||||||
lcd_i2c_addr = 0;
|
lcdd.lcd_i2c_addr = 0;
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
i2c_dev1.speed = I2C_400KHZ;
|
i2c_dev1.speed = I2C_400KHZ;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,10 +63,7 @@ const uint8_t display_numbers[] = {
|
||||||
#define LCD_SYM_a 0b011110110 // "a"
|
#define LCD_SYM_a 0b011110110 // "a"
|
||||||
#define LCD_SYM_P 0b001110011 // "P"
|
#define LCD_SYM_P 0b001110011 // "P"
|
||||||
|
|
||||||
uint8_t display_buff[LCD_BUF_SIZE] = {
|
lcd_data_t lcdd;
|
||||||
0, LCD_SYM_o, LCD_SYM_o, 0
|
|
||||||
};
|
|
||||||
uint8_t display_out_buff[LCD_BUF_SIZE+1] = { 8, 0 };
|
|
||||||
|
|
||||||
const uint8_t lcd_init_cmd[] = {
|
const uint8_t lcd_init_cmd[] = {
|
||||||
// LCD controller initialize:
|
// LCD controller initialize:
|
||||||
|
|
@ -89,14 +86,14 @@ const uint8_t lcd_init_cmd[] = {
|
||||||
* 0x6 = " ="
|
* 0x6 = " ="
|
||||||
* 0x7 = "°E" */
|
* 0x7 = "°E" */
|
||||||
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
display_buff[2] &= ~BIT(3);
|
lcdd.display_buff[2] &= ~BIT(3);
|
||||||
display_buff[3] &= ~(BIT(6) | BIT(7));
|
lcdd.display_buff[3] &= ~(BIT(6) | BIT(7));
|
||||||
if(symbol & 1)
|
if(symbol & 1)
|
||||||
display_buff[3] |= BIT(6);
|
lcdd.display_buff[3] |= BIT(6);
|
||||||
if(symbol & 2)
|
if(symbol & 2)
|
||||||
display_buff[2] |= BIT(3);
|
lcdd.display_buff[2] |= BIT(3);
|
||||||
if(symbol & 4)
|
if(symbol & 4)
|
||||||
display_buff[3] |= BIT(7);
|
lcdd.display_buff[3] |= BIT(7);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0 = " " off,
|
/* 0 = " " off,
|
||||||
|
|
@ -108,99 +105,99 @@ void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
* 6 = "(-^-)" sad
|
* 6 = "(-^-)" sad
|
||||||
* 7 = "(ooo)" */
|
* 7 = "(ooo)" */
|
||||||
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
||||||
display_buff[3] &= ~(BIT(0) | BIT(1) | BIT(4));
|
lcdd.display_buff[3] &= ~(BIT(0) | BIT(1) | BIT(4));
|
||||||
if(symbol & 1)
|
if(symbol & 1)
|
||||||
display_buff[3] |= BIT(0);
|
lcdd.display_buff[3] |= BIT(0);
|
||||||
if(symbol & 2)
|
if(symbol & 2)
|
||||||
display_buff[3] |= BIT(1);
|
lcdd.display_buff[3] |= BIT(1);
|
||||||
if(symbol & 4)
|
if(symbol & 4)
|
||||||
display_buff[3] |= BIT(4);
|
lcdd.display_buff[3] |= BIT(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_ble_symbol(bool state) {
|
void show_ble_symbol(bool state) {
|
||||||
if (state)
|
if (state)
|
||||||
display_buff[4] |= BIT(3);
|
lcdd.display_buff[4] |= BIT(3);
|
||||||
else
|
else
|
||||||
display_buff[4] &= ~BIT(3);
|
lcdd.display_buff[4] &= ~BIT(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_battery_symbol(bool state) {
|
void show_battery_symbol(bool state) {
|
||||||
if (state)
|
if (state)
|
||||||
display_buff[3] |= BIT(5);
|
lcdd.display_buff[3] |= BIT(5);
|
||||||
else
|
else
|
||||||
display_buff[3] &= ~BIT(5);
|
lcdd.display_buff[3] &= ~BIT(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_big_number_x10(int16_t number) {
|
void show_big_number_x10(int16_t number) {
|
||||||
display_buff[2] &= BIT(3); // F/C "_"
|
lcdd.display_buff[2] &= BIT(3); // F/C "_"
|
||||||
if (number > 19995) {
|
if (number > 19995) {
|
||||||
display_buff[0] = LCD_SYM_H; // "H"
|
lcdd.display_buff[0] = LCD_SYM_H; // "H"
|
||||||
display_buff[1] = LCD_SYM_i; // "i"
|
lcdd.display_buff[1] = LCD_SYM_i; // "i"
|
||||||
} else if (number < -995) {
|
} else if (number < -995) {
|
||||||
display_buff[0] = LCD_SYM_L; // "L"
|
lcdd.display_buff[0] = LCD_SYM_L; // "L"
|
||||||
display_buff[1] = LCD_SYM_o; // "o"
|
lcdd.display_buff[1] = LCD_SYM_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
display_buff[0] = 0;
|
lcdd.display_buff[0] = 0;
|
||||||
display_buff[1] = 0;
|
lcdd.display_buff[1] = 0;
|
||||||
/* number: -995..19995 */
|
/* number: -995..19995 */
|
||||||
if (number > 1995 || number < -95) {
|
if (number > 1995 || number < -95) {
|
||||||
display_buff[1] = 0; // no point, show: -99..1999
|
lcdd.display_buff[1] = 0; // no point, show: -99..1999
|
||||||
if (number < 0){
|
if (number < 0){
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[0] = BIT(2); // "-"
|
lcdd.display_buff[0] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
number = (number + 5) / 10; // round(div 10)
|
number = (number + 5) / 10; // round(div 10)
|
||||||
} else { // show: -9.9..199.9
|
} else { // show: -9.9..199.9
|
||||||
display_buff[1] = BIT(3); // point,
|
lcdd.display_buff[1] = BIT(3); // point,
|
||||||
if (number < 0){
|
if (number < 0){
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[0] = BIT(2); // "-"
|
lcdd.display_buff[0] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* number: -99..1999 */
|
/* number: -99..1999 */
|
||||||
if (number > 999) display_buff[0] |= BIT(3); // "1" 1000..1999
|
if (number > 999) lcdd.display_buff[0] |= BIT(3); // "1" 1000..1999
|
||||||
if (number > 99) display_buff[0] |= display_numbers[number / 100 % 10];
|
if (number > 99) lcdd.display_buff[0] |= display_numbers[number / 100 % 10];
|
||||||
if (number > 9) display_buff[1] |= display_numbers[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[1] |= display_numbers[number / 10 % 10];
|
||||||
else display_buff[1] |= LCD_SYM_0; // "0"
|
else lcdd.display_buff[1] |= LCD_SYM_0; // "0"
|
||||||
display_buff[2] |= display_numbers[number %10];
|
lcdd.display_buff[2] |= display_numbers[number %10];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -9 .. 99 */
|
/* -9 .. 99 */
|
||||||
void show_small_number(int16_t number, bool percent) {
|
void show_small_number(int16_t number, bool percent) {
|
||||||
|
|
||||||
display_buff[4] &= BIT(3); // connect
|
lcdd.display_buff[4] &= BIT(3); // connect
|
||||||
display_buff[5] = percent? BIT(3) : 0;
|
lcdd.display_buff[5] = percent? BIT(3) : 0;
|
||||||
if (number > 99) {
|
if (number > 99) {
|
||||||
display_buff[4] |= LCD_SYM_H; // "H"
|
lcdd.display_buff[4] |= LCD_SYM_H; // "H"
|
||||||
display_buff[5] |= LCD_SYM_i; // "i"
|
lcdd.display_buff[5] |= LCD_SYM_i; // "i"
|
||||||
} else if (number < -9) {
|
} else if (number < -9) {
|
||||||
display_buff[4] |= LCD_SYM_L; // "L"
|
lcdd.display_buff[4] |= LCD_SYM_L; // "L"
|
||||||
display_buff[5] |= LCD_SYM_o; // "o"
|
lcdd.display_buff[5] |= LCD_SYM_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[4] = BIT(2); // "-"
|
lcdd.display_buff[4] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
if (number > 9) display_buff[4] |= display_numbers[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[4] |= display_numbers[number / 10];
|
||||||
display_buff[5] |= display_numbers[number %10];
|
lcdd.display_buff[5] |= display_numbers[number %10];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_show_version(void) {
|
void lcd_show_version(void) {
|
||||||
#if OTA_TYPE
|
#if OTA_TYPE
|
||||||
display_buff[0] = LCD_SYM_b;
|
lcdd.display_buff[0] = LCD_SYM_b;
|
||||||
display_buff[1] = LCD_SYM_o;
|
lcdd.display_buff[1] = LCD_SYM_o;
|
||||||
display_buff[2] = LCD_SYM_t;
|
lcdd.display_buff[2] = LCD_SYM_t;
|
||||||
#else
|
#else
|
||||||
display_buff[0] = LCD_SYM_A;
|
lcdd.display_buff[0] = LCD_SYM_A;
|
||||||
display_buff[1] = LCD_SYM_P;
|
lcdd.display_buff[1] = LCD_SYM_P;
|
||||||
display_buff[2] = LCD_SYM_P;
|
lcdd.display_buff[2] = LCD_SYM_P;
|
||||||
#endif
|
#endif
|
||||||
display_buff[3] &= BIT(5); // bat
|
lcdd.display_buff[3] &= BIT(5); // bat
|
||||||
display_buff[4] &= BIT(3); // connect
|
lcdd.display_buff[4] &= BIT(3); // connect
|
||||||
display_buff[4] |= display_numbers[(APP_VERSION >> 4) & 0x0f];
|
lcdd.display_buff[4] |= display_numbers[(APP_VERSION >> 4) & 0x0f];
|
||||||
display_buff[5] = display_numbers[APP_VERSION & 0x0f];
|
lcdd.display_buff[5] = display_numbers[APP_VERSION & 0x0f];
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -208,13 +205,13 @@ void chow_clock(void) {
|
||||||
uint32_t tmp = clkt.utc_time_sec / 60;
|
uint32_t tmp = clkt.utc_time_sec / 60;
|
||||||
uint32_t min = tmp % 60;
|
uint32_t min = tmp % 60;
|
||||||
uint32_t hrs = (tmp / 60) % 24;
|
uint32_t hrs = (tmp / 60) % 24;
|
||||||
display_buff[0] = 0;
|
lcdd.display_buff[0] = 0;
|
||||||
display_buff[1] = display_numbers[(hrs / 10) % 10];
|
lcdd.display_buff[1] = display_numbers[hrs / 10];
|
||||||
display_buff[2] = display_numbers[hrs % 10];
|
lcdd.display_buff[2] = display_numbers[hrs % 10];
|
||||||
display_buff[3] &= BIT(5); // bat
|
lcdd.display_buff[3] &= BIT(5); // bat
|
||||||
display_buff[4] &= BIT(3); // connect
|
lcdd.display_buff[4] &= BIT(3); // connect
|
||||||
display_buff[4] |= display_numbers[(min / 10) % 10];
|
lcdd.display_buff[4] |= display_numbers[min / 10];
|
||||||
display_buff[5] = display_numbers[min % 10];
|
lcdd.display_buff[5] = display_numbers[min % 10];
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -275,14 +272,30 @@ static void chow_measure(void) {
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
|
|
||||||
|
void chow_ext_data(void) {
|
||||||
|
show_big_number_x10(lcdd.ext.big_number);
|
||||||
|
show_small_number(lcdd.ext.small_number, lcdd.ext.flg.percent_on);
|
||||||
|
show_battery_symbol(lcdd.ext.flg.battery);
|
||||||
|
show_smiley(lcdd.ext.flg.smiley);
|
||||||
|
show_temp_symbol(lcdd.ext.flg.temp_symbol);
|
||||||
|
update_lcd();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* flg != 0 -> chow_measure */
|
/* flg != 0 -> chow_measure */
|
||||||
void chow_lcd(int flg) {
|
void chow_lcd(int flg) {
|
||||||
if(wrk.lcd_ext_chow) // показ TH/Clock отключен
|
|
||||||
return;
|
|
||||||
#if OTA_TYPE == OTA_TYPE_BOOT
|
#if OTA_TYPE == OTA_TYPE_BOOT
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(flg)
|
if(flg)
|
||||||
chow_measure();
|
chow_measure();
|
||||||
#else
|
#else
|
||||||
|
if(cfg.flg & FLG_DISPLAY_OFF)
|
||||||
|
return;
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(cfg.flg & FLG_SHOW_TIME) {
|
if(cfg.flg & FLG_SHOW_TIME) {
|
||||||
if(wrk.lcd_count++ & 1)
|
if(wrk.lcd_count++ & 1)
|
||||||
chow_clock();
|
chow_clock();
|
||||||
|
|
@ -295,7 +308,7 @@ void chow_lcd(int flg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_to_lcd(uint8_t *pbuf, int len) {
|
void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
if (lcd_i2c_addr) {
|
if (lcdd.lcd_i2c_addr) {
|
||||||
init_i2c(&i2c_dev1);
|
init_i2c(&i2c_dev1);
|
||||||
send_i2c_buf(&i2c_dev1, lcd_i2c_addr, pbuf, len);
|
send_i2c_buf(&i2c_dev1, lcd_i2c_addr, pbuf, len);
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
|
|
@ -305,12 +318,12 @@ void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
|
|
||||||
void update_lcd(void) {
|
void update_lcd(void) {
|
||||||
#if (OTA_TYPE == OTA_TYPE_APP)
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
if(lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
if(lcdd.lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
if(memcmp(&display_out_buff[1], display_buff, sizeof(display_buff))) {
|
if(memcmp(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff))) {
|
||||||
memcpy(&display_out_buff[1], display_buff, sizeof(display_buff));
|
memcpy(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff));
|
||||||
send_to_lcd(display_out_buff, sizeof(display_out_buff));
|
send_to_lcd(lcdd.display_out_buff, sizeof(lcdd.display_out_buff));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -333,9 +346,9 @@ void init_lcd(void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
lcd_i2c_addr = LCD_I2C_ADDR;
|
lcdd.lcd_i2c_addr = LCD_I2C_ADDR;
|
||||||
} else
|
} else
|
||||||
lcd_i2c_addr = 0;
|
lcdd.lcd_i2c_addr = 0;
|
||||||
i2c_dev1.speed = I2C_400KHZ;
|
i2c_dev1.speed = I2C_400KHZ;
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,13 +59,7 @@ const uint8_t display_numbers[] = {
|
||||||
#define LCD_SYM_a 0b001101110 // "a"
|
#define LCD_SYM_a 0b001101110 // "a"
|
||||||
#define LCD_SYM_P 0b001110011 // "P"
|
#define LCD_SYM_P 0b001110011 // "P"
|
||||||
|
|
||||||
uint8_t lcd_i2c_addr; // = 0x3E
|
lcd_data_t lcdd;
|
||||||
|
|
||||||
uint8_t display_buff[LCD_BUF_SIZE] = {
|
|
||||||
LCD_SYM_o, LCD_SYM_o, LCD_SYM_o,
|
|
||||||
};
|
|
||||||
uint8_t display_out_buff[LCD_BUF_SIZE+1] = { 0 };
|
|
||||||
/* blink off: display_out_buff[0] = 0xf0, on: display_out_buff[0] = 0xf2 */
|
|
||||||
|
|
||||||
const uint8_t lcd_init_cmd[] = {
|
const uint8_t lcd_init_cmd[] = {
|
||||||
// LCD controller initialize:
|
// LCD controller initialize:
|
||||||
|
|
@ -89,10 +83,10 @@ const uint8_t lcd_init_cmd[] = {
|
||||||
* 0x6 = " ="
|
* 0x6 = " ="
|
||||||
* 0x7 = "°E" */
|
* 0x7 = "°E" */
|
||||||
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
display_buff[3] &= ~(BIT(1)|BIT(2)|BIT(3)) ;
|
lcdd.display_buff[3] &= ~(BIT(1)|BIT(2)|BIT(3)) ;
|
||||||
display_buff[3] |= (symbol << 2) & BIT(2);
|
lcdd.display_buff[3] |= (symbol << 2) & BIT(2);
|
||||||
display_buff[3] |= (symbol << 2) & BIT(3);
|
lcdd.display_buff[3] |= (symbol << 2) & BIT(3);
|
||||||
display_buff[3] |= (symbol >> 1) & BIT(1);
|
lcdd.display_buff[3] |= (symbol >> 1) & BIT(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0 = " " off,
|
/* 0 = " " off,
|
||||||
|
|
@ -105,108 +99,103 @@ void show_temp_symbol(LCD_TEMP_SYMBOLS symbol) {
|
||||||
* 7 = "(ooo)" */
|
* 7 = "(ooo)" */
|
||||||
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
void show_smiley(LCD_SMILEY_SYMBOLS symbol) {
|
||||||
if(symbol & 4)
|
if(symbol & 4)
|
||||||
display_buff[4] |= BIT(7);
|
lcdd.display_buff[4] |= BIT(7);
|
||||||
else
|
else
|
||||||
display_buff[4] &= ~BIT(7);
|
lcdd.display_buff[4] &= ~BIT(7);
|
||||||
display_buff[6] = symbol << 6;
|
lcdd.display_buff[6] = symbol << 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_ble_symbol(bool state) {
|
void show_ble_symbol(bool state) {
|
||||||
if (state)
|
if (state)
|
||||||
display_buff[1] |= BIT(7);
|
lcdd.display_buff[1] |= BIT(7);
|
||||||
else
|
else
|
||||||
display_buff[1] &= ~BIT(7);
|
lcdd.display_buff[1] &= ~BIT(7);
|
||||||
}
|
|
||||||
|
|
||||||
void show_battery(uint8_t level) {
|
|
||||||
display_buff[3] &= ~(BIT(4) | BIT(5) | BIT(6) | BIT(7));
|
|
||||||
if(level > 80)
|
|
||||||
display_buff[3] |= BIT(4);
|
|
||||||
if(level > 60)
|
|
||||||
display_buff[3] |= BIT(5);
|
|
||||||
if(level > 40)
|
|
||||||
display_buff[3] |= BIT(6);
|
|
||||||
if(level > 20)
|
|
||||||
display_buff[3] |= BIT(7);
|
|
||||||
display_buff[3] |= BIT(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_battery_symbol(bool state) {
|
void show_battery_symbol(bool state) {
|
||||||
if (state)
|
lcdd.display_buff[3] &= ~(BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7));
|
||||||
display_buff[3] |= BIT(0);
|
if (state) {
|
||||||
else
|
if(measured_data.battery > 80)
|
||||||
display_buff[3] &= ~(BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7));
|
lcdd.display_buff[3] |= BIT(4);
|
||||||
|
if(measured_data.battery > 60)
|
||||||
|
lcdd.display_buff[3] |= BIT(5);
|
||||||
|
if(measured_data.battery > 40)
|
||||||
|
lcdd.display_buff[3] |= BIT(6);
|
||||||
|
if(measured_data.battery > 20)
|
||||||
|
lcdd.display_buff[3] |= BIT(7);
|
||||||
|
lcdd.display_buff[3] |= BIT(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_big_number_x10(int16_t number) {
|
void show_big_number_x10(int16_t number) {
|
||||||
display_buff[1] &= BIT(7); // connect
|
lcdd.display_buff[1] &= BIT(7); // connect
|
||||||
if (number > 19995) {
|
if (number > 19995) {
|
||||||
display_buff[0] = LCD_SYM_H; // "H"
|
lcdd.display_buff[0] = LCD_SYM_H; // "H"
|
||||||
display_buff[1] |= LCD_SYM_i; // "i"
|
lcdd.display_buff[1] |= LCD_SYM_i; // "i"
|
||||||
} else if (number < -995) {
|
} else if (number < -995) {
|
||||||
display_buff[0] = LCD_SYM_L; // "L"
|
lcdd.display_buff[0] = LCD_SYM_L; // "L"
|
||||||
display_buff[1] |= LCD_SYM_o; // "o"
|
lcdd.display_buff[1] |= LCD_SYM_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
display_buff[0] = 0;
|
lcdd.display_buff[0] = 0;
|
||||||
/* number: -995..19995 */
|
/* number: -995..19995 */
|
||||||
if (number > 1995 || number < -95) {
|
if (number > 1995 || number < -95) {
|
||||||
display_buff[2] = 0; // no point, show: -99..1999
|
lcdd.display_buff[2] = 0; // no point, show: -99..1999
|
||||||
if (number < 0){
|
if (number < 0){
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[0] = BIT(5); // "-"
|
lcdd.display_buff[0] = BIT(5); // "-"
|
||||||
}
|
}
|
||||||
number = (number + 5) / 10; // round(div 10)
|
number = (number + 5) / 10; // round(div 10)
|
||||||
} else { // show: -9.9..199.9
|
} else { // show: -9.9..199.9
|
||||||
display_buff[2] = BIT(7); // point,
|
lcdd.display_buff[2] = BIT(7); // point,
|
||||||
if (number < 0){
|
if (number < 0){
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[0] = BIT(5); // "-"
|
lcdd.display_buff[0] = BIT(5); // "-"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* number: -99..1999 */
|
/* number: -99..1999 */
|
||||||
if (number > 999) display_buff[0] |= BIT(7); // "1" 1000..1999
|
if (number > 999) lcdd.display_buff[0] |= BIT(7); // "1" 1000..1999
|
||||||
if (number > 99) display_buff[0] |= display_numbers[number / 100 % 10];
|
if (number > 99) lcdd.display_buff[0] |= display_numbers[number / 100 % 10];
|
||||||
if (number > 9) display_buff[1] |= display_numbers[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[1] |= display_numbers[number / 10 % 10];
|
||||||
else display_buff[1] |= LCD_SYM_0; // "0"
|
else lcdd.display_buff[1] |= LCD_SYM_0; // "0"
|
||||||
display_buff[2] |= display_numbers[number %10];
|
lcdd.display_buff[2] |= display_numbers[number %10];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -9 .. 99 */
|
/* -9 .. 99 */
|
||||||
void show_small_number(int16_t number, bool percent) {
|
void show_small_number(int16_t number, bool percent) {
|
||||||
|
|
||||||
display_buff[4] &= BIT(7); // smiley
|
lcdd.display_buff[4] &= BIT(7); // smiley
|
||||||
display_buff[5] = percent? BIT(7) : 0;
|
lcdd.display_buff[5] = percent? BIT(7) : 0;
|
||||||
if (number > 99) {
|
if (number > 99) {
|
||||||
display_buff[4] |= LCD_SYM_H; // "H"
|
lcdd.display_buff[4] |= LCD_SYM_H; // "H"
|
||||||
display_buff[5] |= LCD_SYM_i; // "i"
|
lcdd.display_buff[5] |= LCD_SYM_i; // "i"
|
||||||
} else if (number < -9) {
|
} else if (number < -9) {
|
||||||
display_buff[4] |= LCD_SYM_L; // "L"
|
lcdd.display_buff[4] |= LCD_SYM_L; // "L"
|
||||||
display_buff[5] |= LCD_SYM_o; // "o"
|
lcdd.display_buff[5] |= LCD_SYM_o; // "o"
|
||||||
} else {
|
} else {
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
number = -number;
|
number = -number;
|
||||||
display_buff[4] = BIT(2); // "-"
|
lcdd.display_buff[4] = BIT(2); // "-"
|
||||||
}
|
}
|
||||||
if (number > 9) display_buff[4] |= display_numbers[number / 10 % 10];
|
if (number > 9) lcdd.display_buff[4] |= display_numbers[number / 10];
|
||||||
display_buff[5] |= display_numbers[number %10];
|
lcdd.display_buff[5] |= display_numbers[number %10];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_show_version(void) {
|
void lcd_show_version(void) {
|
||||||
display_buff[1] &= BIT(7); // connect
|
lcdd.display_buff[1] &= BIT(7); // connect
|
||||||
#if OTA_TYPE
|
#if OTA_TYPE
|
||||||
display_buff[0] = LCD_SYM_b;
|
lcdd.display_buff[0] = LCD_SYM_b;
|
||||||
display_buff[1] |= LCD_SYM_o;
|
lcdd.display_buff[1] |= LCD_SYM_o;
|
||||||
display_buff[2] = LCD_SYM_t;
|
lcdd.display_buff[2] = LCD_SYM_t;
|
||||||
#else
|
#else
|
||||||
display_buff[0] = LCD_SYM_A;
|
lcdd.display_buff[0] = LCD_SYM_A;
|
||||||
display_buff[1] |= LCD_SYM_P;
|
lcdd.display_buff[1] |= LCD_SYM_P;
|
||||||
display_buff[2] = LCD_SYM_P;
|
lcdd.display_buff[2] = LCD_SYM_P;
|
||||||
#endif
|
#endif
|
||||||
display_buff[3] &= BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7); // bat
|
lcdd.display_buff[3] &= BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7); // bat
|
||||||
display_buff[4] = display_numbers[(APP_VERSION>>4) & 0x0f];
|
lcdd.display_buff[4] = display_numbers[(APP_VERSION>>4) & 0x0f];
|
||||||
display_buff[5] = display_numbers[APP_VERSION & 0x0f];
|
lcdd.display_buff[5] = display_numbers[APP_VERSION & 0x0f];
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -214,14 +203,14 @@ void chow_clock(void) {
|
||||||
uint32_t tmp = clkt.utc_time_sec / 60;
|
uint32_t tmp = clkt.utc_time_sec / 60;
|
||||||
uint32_t min = tmp % 60;
|
uint32_t min = tmp % 60;
|
||||||
uint32_t hrs = (tmp / 60) % 24;
|
uint32_t hrs = (tmp / 60) % 24;
|
||||||
display_buff[0] = 0;
|
lcdd.display_buff[0] = 0;
|
||||||
display_buff[1] &= BIT(7); // connect
|
lcdd.display_buff[1] &= BIT(7); // connect
|
||||||
display_buff[1] |= display_numbers[(hrs / 10) % 10];
|
lcdd.display_buff[1] |= display_numbers[hrs / 10];
|
||||||
display_buff[2] = display_numbers[hrs % 10];
|
lcdd.display_buff[2] = display_numbers[hrs % 10];
|
||||||
display_buff[3] &= BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7); // bat
|
lcdd.display_buff[3] &= BIT(0) | BIT(4) | BIT(5) | BIT(6) | BIT(7); // bat
|
||||||
display_buff[4] = display_numbers[(min / 10) % 10];
|
lcdd.display_buff[4] = display_numbers[min / 10];
|
||||||
display_buff[5] = display_numbers[min % 10];
|
lcdd.display_buff[5] = display_numbers[min % 10];
|
||||||
display_buff[6] = 0;
|
lcdd.display_buff[6] = 0;
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -238,7 +227,7 @@ static void chow_measure(void) {
|
||||||
if(h > 99)
|
if(h > 99)
|
||||||
h = 99;
|
h = 99;
|
||||||
show_small_number(h, true);
|
show_small_number(h, true);
|
||||||
show_battery(measured_data.battery);
|
show_battery_symbol(1);
|
||||||
#if (OTA_TYPE == OTA_TYPE_APP)
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
if(cfg.flg & FLG_SHOW_SMILEY) {
|
if(cfg.flg & FLG_SHOW_SMILEY) {
|
||||||
#if (DEV_SERVICES & SERVICE_TH_TRG)
|
#if (DEV_SERVICES & SERVICE_TH_TRG)
|
||||||
|
|
@ -282,13 +271,30 @@ static void chow_measure(void) {
|
||||||
update_lcd();
|
update_lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
|
|
||||||
|
void chow_ext_data(void) {
|
||||||
|
show_big_number_x10(lcdd.ext.big_number);
|
||||||
|
show_small_number(lcdd.ext.small_number, lcdd.ext.flg.percent_on);
|
||||||
|
show_battery_symbol(lcdd.ext.flg.battery);
|
||||||
|
show_smiley(lcdd.ext.flg.smiley);
|
||||||
|
show_temp_symbol(lcdd.ext.flg.temp_symbol);
|
||||||
|
update_lcd();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* flg != 0 -> chow_measure */
|
/* flg != 0 -> chow_measure */
|
||||||
void chow_lcd(int flg) {
|
void chow_lcd(int flg) {
|
||||||
#if OTA_TYPE == OTA_TYPE_BOOT
|
#if OTA_TYPE == OTA_TYPE_BOOT
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(flg)
|
if(flg)
|
||||||
chow_measure();
|
chow_measure();
|
||||||
#else
|
#else
|
||||||
if(cfg.flg & FLG_DISPLAY_OFF) return;
|
if(cfg.flg & FLG_DISPLAY_OFF)
|
||||||
|
return;
|
||||||
|
if(clkt.utc_time_sec < lcdd.chow_ext_ut)
|
||||||
|
return;
|
||||||
if(cfg.flg & FLG_SHOW_TIME) {
|
if(cfg.flg & FLG_SHOW_TIME) {
|
||||||
if(wrk.lcd_count++ & 1)
|
if(wrk.lcd_count++ & 1)
|
||||||
chow_clock();
|
chow_clock();
|
||||||
|
|
@ -301,9 +307,9 @@ void chow_lcd(int flg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_to_lcd(uint8_t *pbuf, int len) {
|
void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
if (lcd_i2c_addr) {
|
if (lcdd.lcd_i2c_addr) {
|
||||||
init_i2c(&i2c_dev1);
|
init_i2c(&i2c_dev1);
|
||||||
send_i2c_buf(&i2c_dev1, lcd_i2c_addr, pbuf, len);
|
send_i2c_buf(&i2c_dev1, lcdd.lcd_i2c_addr, pbuf, len);
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -311,12 +317,12 @@ void send_to_lcd(uint8_t *pbuf, int len) {
|
||||||
|
|
||||||
void update_lcd(void) {
|
void update_lcd(void) {
|
||||||
#if (OTA_TYPE == OTA_TYPE_APP)
|
#if (OTA_TYPE == OTA_TYPE_APP)
|
||||||
if(lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
if(lcdd.lcd_i2c_addr == 0 || (cfg.flg & FLG_DISPLAY_OFF) != 0)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
if(memcmp(&display_out_buff[1], display_buff, sizeof(display_buff))) {
|
if(memcmp(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff))) {
|
||||||
memcpy(&display_out_buff[1], display_buff, sizeof(display_buff));
|
memcpy(&lcdd.display_out_buff[1], lcdd.display_buff, sizeof(lcdd.display_buff));
|
||||||
send_to_lcd(display_out_buff, sizeof(display_out_buff));
|
send_to_lcd(lcdd.display_out_buff, sizeof(lcdd.display_out_buff));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -330,9 +336,9 @@ void init_lcd(void) {
|
||||||
// else
|
// else
|
||||||
// send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd8); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
|
// send_i2c_byte(&i2c_dev1, LCD_I2C_ADDR, 0xd8); // Mode Set (MODE SET): Display disable, 1/3 Bias, power saving
|
||||||
#endif
|
#endif
|
||||||
lcd_i2c_addr = LCD_I2C_ADDR;
|
lcdd.lcd_i2c_addr = LCD_I2C_ADDR;
|
||||||
} else
|
} else
|
||||||
lcd_i2c_addr = 0;
|
lcdd.lcd_i2c_addr = 0;
|
||||||
deinit_i2c(&i2c_dev1);
|
deinit_i2c(&i2c_dev1);
|
||||||
// i2c_dev1.speed = I2C_400KHZ;
|
// i2c_dev1.speed = I2C_400KHZ;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# rdwr_phy62x2.py 12.12.2024 pvvx #
|
# rdwr_phy62x2.py 20.12.2024 pvvx #
|
||||||
|
|
||||||
import serial
|
import serial
|
||||||
import time
|
import time
|
||||||
|
|
@ -24,7 +24,7 @@ PHY_WR_BLK_SIZE = 0x2000
|
||||||
|
|
||||||
__progname__ = 'PHY62x2/ST17H66B Utility'
|
__progname__ = 'PHY62x2/ST17H66B Utility'
|
||||||
__filename__ = 'rdwr_phy62x2.py'
|
__filename__ = 'rdwr_phy62x2.py'
|
||||||
__version__ = "12.12.24"
|
__version__ = "20.12.24"
|
||||||
|
|
||||||
def ParseHexFile(hexfile):
|
def ParseHexFile(hexfile):
|
||||||
try:
|
try:
|
||||||
|
|
@ -184,11 +184,14 @@ class phyflasher:
|
||||||
read = self._port.read(26)
|
read = self._port.read(26)
|
||||||
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
||||||
print('Revision:', read[2:19])
|
print('Revision:', read[2:19])
|
||||||
if read[11:15] != b'6222':
|
if read[11:15] == b'6230':
|
||||||
print('Wrong Version!')
|
print('Chip PHY6230: OTP Version!')
|
||||||
self.flash_id = int(read[2:11], 16)
|
else:
|
||||||
self.flash_size = 1 << ((self.flash_id >> 16) & 0xff)
|
if read[11:15] != b'6222':
|
||||||
print('FlashID: %06x, size: %d kbytes' % (self.flash_id, self.flash_size >> 10))
|
print('Wrong Version!')
|
||||||
|
self.flash_id = int(read[2:11], 16)
|
||||||
|
self.flash_size = 1 << ((self.flash_id >> 16) & 0xff)
|
||||||
|
print('FlashID: %06x, size: %d kbytes' % (self.flash_id, self.flash_size >> 10))
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
print('Error read Revision!')
|
print('Error read Revision!')
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# rdwr_phy62x2.py 12.12.2024 pvvx #
|
# rdwr_phy62x2.py 20.12.2024 pvvx #
|
||||||
|
|
||||||
import serial
|
import serial
|
||||||
import time
|
import time
|
||||||
|
|
@ -24,7 +24,7 @@ PHY_WR_BLK_SIZE = 0x2000
|
||||||
|
|
||||||
__progname__ = 'PHY62x2/ST17H66B Utility'
|
__progname__ = 'PHY62x2/ST17H66B Utility'
|
||||||
__filename__ = 'rdwr_phy62x2.py'
|
__filename__ = 'rdwr_phy62x2.py'
|
||||||
__version__ = "12.12.24"
|
__version__ = "20.12.24"
|
||||||
|
|
||||||
def ParseHexFile(hexfile):
|
def ParseHexFile(hexfile):
|
||||||
try:
|
try:
|
||||||
|
|
@ -184,11 +184,14 @@ class phyflasher:
|
||||||
read = self._port.read(26)
|
read = self._port.read(26)
|
||||||
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
||||||
print('Revision:', read[2:19])
|
print('Revision:', read[2:19])
|
||||||
if read[11:15] != b'6222':
|
if read[11:15] == b'6230':
|
||||||
print('Wrong Version!')
|
print('Chip PHY6230: OTP Version!')
|
||||||
self.flash_id = int(read[2:11], 16)
|
else:
|
||||||
self.flash_size = 1 << ((self.flash_id >> 16) & 0xff)
|
if read[11:15] != b'6222':
|
||||||
print('FlashID: %06x, size: %d kbytes' % (self.flash_id, self.flash_size >> 10))
|
print('Wrong Version!')
|
||||||
|
self.flash_id = int(read[2:11], 16)
|
||||||
|
self.flash_size = 1 << ((self.flash_id >> 16) & 0xff)
|
||||||
|
print('FlashID: %06x, size: %d kbytes' % (self.flash_id, self.flash_size >> 10))
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
print('Error read Revision!')
|
print('Error read Revision!')
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue