Compare commits
13 Commits
V3.0_first
...
ca26f090fa
| Author | SHA1 | Date | |
|---|---|---|---|
| ca26f090fa | |||
| 66e276f15e | |||
| 65e5d0d753 | |||
| 3ece894592 | |||
| f0e0781100 | |||
| fe4b57808d | |||
| 60947059e8 | |||
| d2fb6b8411 | |||
| 4d92e0c2a6 | |||
| b57eb2513c | |||
| 3f98a321fc | |||
| 27858948e5 | |||
| e87012cc9c |
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"board": {
|
||||
"active_layer": 36,
|
||||
"active_layer": 31,
|
||||
"active_layer_preset": "",
|
||||
"auto_track_width": false,
|
||||
"hidden_netclasses": [],
|
||||
@@ -68,7 +68,7 @@
|
||||
39,
|
||||
40
|
||||
],
|
||||
"visible_layers": "ffc7055_fffffff8",
|
||||
"visible_layers": "ffc7075_ffffffff",
|
||||
"zone_display_mode": 1
|
||||
},
|
||||
"git": {
|
||||
|
||||
@@ -59,23 +59,30 @@
|
||||
}
|
||||
],
|
||||
"drc_exclusions": [
|
||||
"footprint_symbol_mismatch|177050000|59025000|a624af3d-bffa-4ff7-9554-e16d3c677f69|00000000-0000-0000-0000-000000000000",
|
||||
"footprint_symbol_mismatch|237580000|53970000|c9d8d35b-26b7-4992-9d25-be9130d57b1a|00000000-0000-0000-0000-000000000000",
|
||||
"footprint_symbol_mismatch|256580000|49370000|b33af7ef-63da-4a51-8d8a-183cadd974de|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|09cad967-1882-4dd3-8900-445282e228e5|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|20ab85c0-b3f3-4826-a86d-065fee01e11f|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|3da9717d-9800-42f9-97d1-56d23bf085aa|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|444aab2b-3a9b-444e-b60c-b5b5ff830942|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|6b067fd3-d374-4937-8779-958994d9163b|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|9839c562-7672-4ea8-a74d-bea83ae26677|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|9ce2df19-edf4-40d2-8e85-8c33008b8df0|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|a8ab716a-cd1e-4842-ad8e-3d6d1db9770b|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|aaf09ae3-4ace-49d7-a050-44cb4c93d63b|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|af55e8a2-ba8d-462e-807f-99ca5906f801|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|c36efd78-869f-40e7-86fc-97e5ed683fec|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|d668fda0-e4be-4e1f-95b8-8cd59a67cb21|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|d99401c6-2b75-46f7-8616-cdd7755709ee|00000000-0000-0000-0000-000000000000",
|
||||
"net_conflict|177050000|59025000|f1fd5816-e8bd-4ba6-9d53-54b58d25e2dc|00000000-0000-0000-0000-000000000000"
|
||||
"solder_mask_bridge|176260000|56670000|9839c562-7672-4ea8-a74d-bea83ae26677|d5ef1ade-5176-4779-aaf0-75a583095401",
|
||||
"solder_mask_bridge|176260000|57120000|9839c562-7672-4ea8-a74d-bea83ae26677|aaecf811-fc68-432e-8032-ac52f2f4c632",
|
||||
"solder_mask_bridge|176260000|57920000|aaf09ae3-4ace-49d7-a050-44cb4c93d63b|aaecf811-fc68-432e-8032-ac52f2f4c632",
|
||||
"solder_mask_bridge|176260000|58370000|aaf09ae3-4ace-49d7-a050-44cb4c93d63b|ee82357c-9139-4ef8-a542-8725e3254fe0",
|
||||
"solder_mask_bridge|176660000|56270000|3da9717d-9800-42f9-97d1-56d23bf085aa|d5ef1ade-5176-4779-aaf0-75a583095401",
|
||||
"solder_mask_bridge|176660000|57520000|09cad967-1882-4dd3-8900-445282e228e5|aaecf811-fc68-432e-8032-ac52f2f4c632",
|
||||
"solder_mask_bridge|176660000|58770000|a8ab716a-cd1e-4842-ad8e-3d6d1db9770b|ee82357c-9139-4ef8-a542-8725e3254fe0",
|
||||
"solder_mask_bridge|177110000|56270000|3da9717d-9800-42f9-97d1-56d23bf085aa|02c6a0d6-d749-439d-8aea-2a55ff23d509",
|
||||
"solder_mask_bridge|177110000|57520000|09cad967-1882-4dd3-8900-445282e228e5|b83e5527-c0f3-4e61-bd5b-3079ced0723c",
|
||||
"solder_mask_bridge|177110000|58770000|a8ab716a-cd1e-4842-ad8e-3d6d1db9770b|173bfee3-0343-4ee2-91d9-e73a12cffe08",
|
||||
"solder_mask_bridge|177510000|56670000|444aab2b-3a9b-444e-b60c-b5b5ff830942|02c6a0d6-d749-439d-8aea-2a55ff23d509",
|
||||
"solder_mask_bridge|177510000|57120000|444aab2b-3a9b-444e-b60c-b5b5ff830942|b83e5527-c0f3-4e61-bd5b-3079ced0723c",
|
||||
"solder_mask_bridge|177510000|57920000|f1fd5816-e8bd-4ba6-9d53-54b58d25e2dc|b83e5527-c0f3-4e61-bd5b-3079ced0723c",
|
||||
"solder_mask_bridge|177510000|58370000|f1fd5816-e8bd-4ba6-9d53-54b58d25e2dc|173bfee3-0343-4ee2-91d9-e73a12cffe08",
|
||||
"solder_mask_bridge|177910000|56270000|9ce2df19-edf4-40d2-8e85-8c33008b8df0|02c6a0d6-d749-439d-8aea-2a55ff23d509",
|
||||
"solder_mask_bridge|177910000|57520000|c36efd78-869f-40e7-86fc-97e5ed683fec|b83e5527-c0f3-4e61-bd5b-3079ced0723c",
|
||||
"solder_mask_bridge|177910000|58770000|d668fda0-e4be-4e1f-95b8-8cd59a67cb21|173bfee3-0343-4ee2-91d9-e73a12cffe08",
|
||||
"solder_mask_bridge|178360000|56270000|9ce2df19-edf4-40d2-8e85-8c33008b8df0|50a027a2-4230-4974-b6cb-9aa24d6b855f",
|
||||
"solder_mask_bridge|178360000|57520000|c36efd78-869f-40e7-86fc-97e5ed683fec|ae02705d-fc4c-4270-b7c5-41495037850e",
|
||||
"solder_mask_bridge|178360000|58770000|d668fda0-e4be-4e1f-95b8-8cd59a67cb21|08dd9140-8967-4746-a078-91e200a8f376",
|
||||
"solder_mask_bridge|178760000|56670000|20ab85c0-b3f3-4826-a86d-065fee01e11f|50a027a2-4230-4974-b6cb-9aa24d6b855f",
|
||||
"solder_mask_bridge|178760000|57120000|20ab85c0-b3f3-4826-a86d-065fee01e11f|ae02705d-fc4c-4270-b7c5-41495037850e",
|
||||
"solder_mask_bridge|178760000|57920000|6b067fd3-d374-4937-8779-958994d9163b|ae02705d-fc4c-4270-b7c5-41495037850e",
|
||||
"solder_mask_bridge|178760000|58370000|6b067fd3-d374-4937-8779-958994d9163b|08dd9140-8967-4746-a078-91e200a8f376"
|
||||
],
|
||||
"meta": {
|
||||
"filename": "board_design_settings.json",
|
||||
@@ -98,6 +105,7 @@
|
||||
"footprint_type_mismatch": "ignore",
|
||||
"hole_clearance": "error",
|
||||
"hole_near_hole": "error",
|
||||
"holes_co_located": "warning",
|
||||
"invalid_outline": "error",
|
||||
"isolated_copper": "warning",
|
||||
"item_on_disabled_layer": "error",
|
||||
@@ -1069,6 +1077,7 @@
|
||||
},
|
||||
"schematic": {
|
||||
"annotate_start_num": 0,
|
||||
"bom_export_filename": "",
|
||||
"bom_fmt_presets": [],
|
||||
"bom_fmt_settings": {
|
||||
"field_delimiter": ",",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -4,11 +4,14 @@ target = "riscv32imac-esp-espidf"
|
||||
|
||||
[target.riscv32imac-esp-espidf]
|
||||
linker = "ldproxy"
|
||||
# runner = "espflash flash --monitor --partition-table partitions.csv -b no-reset" # Select this runner for espflash v2.x.x
|
||||
runner = "espflash flash --monitor --partition-table partitions.csv -b no-reset" # Select this runner for espflash v2.x.x
|
||||
#runner = "cargo runner"
|
||||
|
||||
|
||||
|
||||
# runner = "espflash flash --monitor --baud 921600 --partition-table partitions.csv -b no-reset" # Select this runner for espflash v2.x.x
|
||||
# runner = espflash erase-parts otadata
|
||||
|
||||
runner = "cargo runner"
|
||||
rustflags = [ "--cfg", "espidf_time64"] # Extending time_t for ESP IDF 5: https://github.com/esp-rs/rust/issues/110
|
||||
|
||||
[unstable]
|
||||
|
||||
@@ -68,7 +68,7 @@ serde_json = "1.0.108"
|
||||
strum = { version = "0.26.1", features = ["derive"] }
|
||||
once_cell = "1.19.0"
|
||||
measurements = "0.11.0"
|
||||
bq34z100 = "0.2.1"
|
||||
bq34z100 = { version = "0.3.0" , features = ["flashstream"] }
|
||||
|
||||
[patch.crates-io]
|
||||
#esp-idf-hal = { git = "https://github.com/esp-rs/esp-idf-hal.git" }
|
||||
@@ -76,6 +76,7 @@ esp-idf-hal = { git = "https://github.com/empirephoenix/esp-idf-hal.git" }
|
||||
#esp-idf-sys = { git = "https://github.com/empirephoenix/esp-idf-sys.git" }
|
||||
#esp-idf-sys = { git = "https://github.com/esp-rs/esp-idf-sys.git" }
|
||||
#esp-idf-svc = { git = "https://github.com/esp-rs/esp-idf-svc.git" }
|
||||
#bq34z100 = { path = "../../bq34z100_rust" }
|
||||
|
||||
[build-dependencies]
|
||||
embuild = "0.31.3"
|
||||
|
||||
197
rust/bq34z100_golden_image/0100_2_02-bq34z100.df.fs
Normal file
197
rust/bq34z100_golden_image/0100_2_02-bq34z100.df.fs
Normal file
@@ -0,0 +1,197 @@
|
||||
;--------------------------------------------------------
|
||||
;Verify Existing Firmware Version
|
||||
;--------------------------------------------------------
|
||||
W: AA 00 01 00
|
||||
C: AA 00 01 00
|
||||
W: AA 00 02 00
|
||||
C: AA 00 02 00
|
||||
;--------------------------------------------------------
|
||||
;Unseal device
|
||||
;--------------------------------------------------------
|
||||
W: AA 00 14 04
|
||||
W: AA 00 72 36
|
||||
W: AA 00 FF FF
|
||||
W: AA 00 FF FF
|
||||
X: 1000
|
||||
;--------------------------------------------------------
|
||||
;Go To ROM Mode
|
||||
;--------------------------------------------------------
|
||||
W: AA 00 00 0F
|
||||
X: 1000
|
||||
;--------------------------------------------------------
|
||||
;Data Block
|
||||
;--------------------------------------------------------
|
||||
W: 16 00 03 00 00
|
||||
W: 16 64 03 00
|
||||
X: 20
|
||||
C: 16 66 00
|
||||
W: 16 00 02 00 00 00 EA FF 33 FA FA 33 B5 FB 33 95 FE 33 AD FE 33 FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F 02 02 3F 58 CB 33 C3 A0 08 1F 00 00 00 00 00 FF AA 0E FB A7 0E FF A6 0E FF A1 0E FF A0 0E FE A3 0E 54 A2 0E DE FF 3A 67 FF 3A E2 FF 33 FF AF 0E
|
||||
W: 16 64 3D 38
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 02 01 00 00 01 4F 03 3F 11 0C D9 FF 30 E0 FF 35 2F 10 0C E0 FF 35 FF FF 23 E3 AF 04 E2 BF 04 D1 FF 36 E2 A0 04 E3 A1 04 00 C7 02 01 C6 02 E5 AF 04 E3 BF 01 E4 AF 04 E2 BF 01 FF AC 0E E1 1C 04 8A FF 31 E2 A0 04 E3 A1 04 02 AB 18 7F 2B 0E FF 1B 0E BF FF 32 FC FA 0E FB AF 0C 02 2B 18 FF 1B 0E 98 FF 36
|
||||
W: 16 64 AE 2C
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 05
|
||||
W: 16 64 05 00
|
||||
X: 170
|
||||
C: 16 66 00
|
||||
C: 16 04 0A 91 AF DC
|
||||
W: 16 00 0C 00 00 00 83 DE
|
||||
W: 16 64 6D 01
|
||||
X: 400
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 00 00 00 7F 71 20 5C 94 08 98 C0 FB 50 00 00 00 00 13 88 51 F6 C9 F4 14 52 09 21 32 6D 00 00 00 00 D0 7E
|
||||
W: 16 64 D1 0A
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 01 00 00 17 DF 00 00 17 F3 00 00 3A 36 FD 91 00 25 30 01 00 EF 05 11 05 01 00 00 10 01 00 3C 00 50 3C 00
|
||||
W: 16 64 43 06
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 02 00 00 64 3C 00 20 03 E8 00 00 04 10 68 FE D5 FB 95 00 02 00 14 03 E8 01 00 01 F4 00 1E 00 3C 0E 10 00
|
||||
W: 16 64 05 08
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 03 00 00 0A 46 05 32 01 0F 01 F4 00 64 46 50 0A 0E D8 0E 99 01 90 00 64 19 00 01 00 14 00 01 00 14 03 23
|
||||
W: 16 64 88 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 04 00 00 07 08 25 5A 32 0F 64 60 00 A0 0B B8 00 C8 28 01 F4 00 00 00 00 00 00 00 00 00 00 43 80 04 00 00
|
||||
W: 16 64 B0 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 05 00 00 0F 00 2A 04 0A 7D 00 00 01 0A FE 76 E7 54 00 28 03 E8 02 01 2C F0 00 01 07 10 63 10 48 10 2D 10
|
||||
W: 16 64 DF 06
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 06 00 00 15 0F FC 0F E6 0F D0 0F BC 0F A8 0F 96 0F 84 0F 74 0F 65 0F 56 0F 45 0F 30 0F 1C 0F 09 0E F9 0E
|
||||
W: 16 64 05 09
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 07 00 00 EF 0E E6 0E DF 0E D8 0E D3 0E CF 0E CB 0E CA 0E C9 0E C7 0E C2 0E B8 0E AC 0E 9A 0E 85 0E 7B 0E
|
||||
W: 16 64 04 0D
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 08 00 00 75 0E 56 0E 30 0D AB 0A 69 FF 2B FF 41 FF 56 FF 61 FF 67 FF 3B FF 16 FF 21 FF 21 FE EB FE B5 FE
|
||||
W: 16 64 02 12
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 09 00 00 7F FE 5E FE 7F FE E8 00 02 00 9A 00 2E FF E2 FF CD FF B7 FF A1 FF 77 FF 36 FE DA FE 62 FC F3 FA
|
||||
W: 16 64 EA 15
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0A 00 00 B3 F8 ED F7 7C F7 3B F7 B2 F7 FC F8 32 F8 F7 F9 F0 F9 B0 F9 18 EC 9D 4D C0 FF 65 FF AC FF 98 FF
|
||||
W: 16 64 E4 18
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0B 00 00 75 FF BB FF 82 FF 93 FF BB FF D5 FF E4 FF CE FF AD 00 80 FF 73 00 00 FF 16 FE EC FE ED FE DC FE
|
||||
W: 16 64 F5 17
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0C 00 00 F3 FF 09 FE F7 FE AC FE 9E FE C6 FE DA FE DC FE 8E FF 75 00 00 00 00 01 C2 00 32 FF CE 02 26 64
|
||||
W: 16 64 10 13
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0D 00 00 7B 20 00 00 60 7E 00 00 00 00 64 00 19 00 64 28 63 5F 64 62 00 64 00 1E 00 B4 00 64 00 F0 00 FA
|
||||
W: 16 64 A5 07
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0E 00 00 11 10 10 68 41 D9 AF 37 00 00 00 01 00 14 00 00 0A F0 00 0A 05 00 32 01 C2 14 14 00 00 3C 00 4B
|
||||
W: 16 64 73 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0F 00 00 00 28 00 3C 3C 01 90 36 72 04 14 FF FF FF FF 01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 04
|
||||
W: 16 64 02 0E
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 10 00 00 01 2C 00 C8 00 00 00 00 00 A0 00 AF 00 00 0A 64 01 00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 09 03
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 1B 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 12 00 00 02 26 02 01 F4 02 58 02 02 26 0E 00 00 00 00 00 00 00 00 00 00 00 00 01 00 DC 84 E5 5F 00 00 0E
|
||||
W: 16 64 80 04
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 13 00 00 10 00 00 00 01 00 00 03 84 64 03 E8 15 18 FE 70 10 68 10 68 10 04 0A 32 1E 00 0A 2D 37 01 01 01
|
||||
W: 16 64 6E 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 14 00 00 0B 62 71 33 34 7A 31 30 30 2D 47 31 0B 54 65 78 61 73 20 49 6E 73 74 2E 04 4C 49 4F 4E 00 96 00
|
||||
W: 16 64 DB 08
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 15 00 00 AF 00 4B 00 64 0A F0 02 0B 54 10 CC 02 10 68 64 01 03 05 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 9B 04
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 13 0D
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 17 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 01 20
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 18 00 00 FF 55 00 69 00 64 00 71 00 8F 00 62 00 61 00 6C 00 59 00 56 00 55 00 57 00 5A 00 6E 02 87 05 DC
|
||||
W: 16 64 FF 07
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 23 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1A 00 00 FF FF 00 69 00 64 00 71 00 8F 00 62 00 61 00 6C 00 59 00 56 00 55 00 57 00 5A 00 6E 02 87 05 DC
|
||||
W: 16 64 AB 08
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 25 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1C 00 00 64 3C 00 20 03 E8 00 00 04 10 68 FE D5 FB 95 00 02 00 14 03 E8 01 00 01 F4 00 1E 00 3C 0E 10 00
|
||||
W: 16 64 1F 08
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1D 00 00 0A 46 05 32 01 0F 01 F4 00 64 46 50 0A 0E D8 0E 99 01 90 00 64 19 00 01 00 14 00 01 00 14 03 23
|
||||
W: 16 64 A2 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1E 00 00 FF FF FF FF 00 00 00 01 FF FF FF FD FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 0B 1C
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1F 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 09 20
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 08
|
||||
W: 16 64 08 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
C: 16 04 5B 67
|
||||
W: 16 00 05
|
||||
W: 16 64 05 00
|
||||
X: 170
|
||||
C: 16 66 00
|
||||
C: 16 04 0A 91 AF DC
|
||||
W: 16 00 01 00 00 05 54 54 15
|
||||
W: 16 64 C3 00
|
||||
X: 20
|
||||
C: 16 66 00
|
||||
W: 16 00 05
|
||||
W: 16 64 05 00
|
||||
X: 170
|
||||
C: 16 66 00
|
||||
C: 16 04 5F E5 84 DC
|
||||
;--------------------------------------------------------
|
||||
;Execute Flash Code
|
||||
;--------------------------------------------------------
|
||||
W: 16 00 0F
|
||||
W: 16 64 0F 00
|
||||
X: 4000
|
||||
@@ -1,5 +1,5 @@
|
||||
# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K)
|
||||
CONFIG_ESP_MAIN_TASK_STACK_SIZE=25000
|
||||
CONFIG_ESP_MAIN_TASK_STACK_SIZE=50000
|
||||
|
||||
# Use this to set FreeRTOS kernel tick frequency to 1000 Hz (100 Hz by default).
|
||||
# This allows to use 1 ms granuality for thread sleeps (10 ms by default).
|
||||
|
||||
@@ -60,7 +60,6 @@ pub struct Plant {
|
||||
pub pump_hour_start: u8,
|
||||
pub pump_hour_end: u8,
|
||||
pub sensor_b: bool,
|
||||
pub sensor_p: bool,
|
||||
}
|
||||
impl Default for Plant {
|
||||
fn default() -> Self {
|
||||
@@ -72,7 +71,6 @@ impl Default for Plant {
|
||||
pump_hour_end: 20,
|
||||
mode: Mode::OFF,
|
||||
sensor_b: false,
|
||||
sensor_p: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
720
rust/src/main.rs
720
rust/src/main.rs
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
use bq34z100::{Bq34Z100Error, Bq34z100g1, Bq34z100g1Driver};
|
||||
//mod config;
|
||||
|
||||
use chrono_tz::Europe::Berlin;
|
||||
use embedded_svc::wifi::{
|
||||
AccessPointConfiguration, AccessPointInfo, AuthMethod, ClientConfiguration, Configuration,
|
||||
@@ -17,7 +17,7 @@ use esp_idf_svc::mqtt::client::{EspMqttClient, LwtConfiguration, MqttClientConfi
|
||||
use esp_idf_svc::nvs::EspDefaultNvsPartition;
|
||||
use esp_idf_svc::wifi::config::{ScanConfig, ScanType};
|
||||
use esp_idf_svc::wifi::EspWifi;
|
||||
use measurements::{Frequency, Temperature};
|
||||
use measurements::Temperature;
|
||||
use plant_ctrl2::sipo::ShiftRegister40;
|
||||
|
||||
use anyhow::anyhow;
|
||||
@@ -48,15 +48,11 @@ use esp_idf_sys::{esp, gpio_hold_dis, gpio_hold_en, vTaskDelay, EspError};
|
||||
use one_wire_bus::OneWire;
|
||||
|
||||
use crate::config::{self, Config, WifiConfig};
|
||||
use crate::STAY_ALIVE;
|
||||
use crate::{plant_hal, STAY_ALIVE};
|
||||
|
||||
//Only support for 8 right now!
|
||||
pub const PLANT_COUNT: usize = 8;
|
||||
const PINS_PER_PLANT: usize = 5;
|
||||
const PLANT_PUMP_OFFSET: usize = 0;
|
||||
const PLANT_FAULT_OFFSET: usize = 1;
|
||||
const PLANT_MOIST_PUMP_OFFSET: usize = 2;
|
||||
const PLANT_MOIST_A_OFFSET: usize = 3;
|
||||
const PLANT_MOIST_B_OFFSET: usize = 4;
|
||||
const REPEAT_MOIST_MEASURE: usize = 3;
|
||||
|
||||
const SPIFFS_PARTITION_NAME: &str = "storage";
|
||||
const WIFI_CONFIG_FILE: &str = "/spiffs/wifi.cfg";
|
||||
@@ -64,6 +60,51 @@ const CONFIG_FILE: &str = "/spiffs/config.cfg";
|
||||
|
||||
const TANK_MULTI_SAMPLE: usize = 11;
|
||||
|
||||
const PUMP8_BIT: usize = 0;
|
||||
const PUMP1_BIT: usize = 1;
|
||||
const PUMP2_BIT: usize = 2;
|
||||
const PUMP3_BIT: usize = 3;
|
||||
const PUMP4_BIT: usize = 4;
|
||||
const PUMP5_BIT: usize = 5;
|
||||
const PUMP6_BIT: usize = 6;
|
||||
const PUMP7_BIT: usize = 7;
|
||||
|
||||
const MS_0: usize = 8;
|
||||
const MS_4: usize = 9;
|
||||
const MS_2: usize = 10;
|
||||
const MS_3: usize = 11;
|
||||
const SENSOR_ON: usize = 12;
|
||||
const MS_1: usize = 13;
|
||||
//unused 14
|
||||
//unused 15
|
||||
|
||||
const FAULT_3: usize = 16;
|
||||
const FAULT_8: usize = 17;
|
||||
const FAULT_7: usize = 18;
|
||||
const FAULT_6: usize = 19;
|
||||
const FAULT_5: usize = 20;
|
||||
const FAULT_4: usize = 21;
|
||||
const FAULT_1: usize = 22;
|
||||
const FAULT_2: usize = 23;
|
||||
|
||||
const SENSOR_A_1: u8 = 7;
|
||||
const SENSOR_A_2: u8 = 6;
|
||||
const SENSOR_A_3: u8 = 5;
|
||||
const SENSOR_A_4: u8 = 4;
|
||||
const SENSOR_A_5: u8 = 3;
|
||||
const SENSOR_A_6: u8 = 2;
|
||||
const SENSOR_A_7: u8 = 1;
|
||||
const SENSOR_A_8: u8 = 0;
|
||||
|
||||
const SENSOR_B_1: u8 = 8;
|
||||
const SENSOR_B_2: u8 = 9;
|
||||
const SENSOR_B_3: u8 = 10;
|
||||
const SENSOR_B_4: u8 = 11;
|
||||
const SENSOR_B_5: u8 = 12;
|
||||
const SENSOR_B_6: u8 = 13;
|
||||
const SENSOR_B_7: u8 = 14;
|
||||
const SENSOR_B_8: u8 = 15;
|
||||
|
||||
#[link_section = ".rtc.data"]
|
||||
static mut LAST_WATERING_TIMESTAMP: [i64; PLANT_COUNT] = [0; PLANT_COUNT];
|
||||
#[link_section = ".rtc.data"]
|
||||
@@ -88,7 +129,6 @@ pub enum ClearConfigType {
|
||||
pub enum Sensor {
|
||||
A,
|
||||
B,
|
||||
PUMP,
|
||||
}
|
||||
pub trait PlantCtrlBoardInteraction {
|
||||
fn time(&mut self) -> Result<chrono::DateTime<Utc>>;
|
||||
@@ -125,7 +165,7 @@ pub trait PlantCtrlBoardInteraction {
|
||||
//keep state during deepsleep
|
||||
fn light(&mut self, enable: bool) -> Result<()>;
|
||||
|
||||
fn measure_moisture_hz(&self, plant: usize, sensor: Sensor) -> Result<i32>;
|
||||
fn measure_moisture_hz(&mut self, plant: usize, sensor: Sensor) -> Result<i32>;
|
||||
fn pump(&self, plant: usize, enable: bool) -> Result<()>;
|
||||
fn last_pump_time(&self, plant: usize) -> Option<chrono::DateTime<Utc>>;
|
||||
fn store_last_pump_time(&mut self, plant: usize, time: chrono::DateTime<Utc>);
|
||||
@@ -149,6 +189,9 @@ pub trait PlantCtrlBoardInteraction {
|
||||
fn is_wifi_config_file_existant(&mut self) -> bool;
|
||||
fn mqtt(&mut self, config: &Config) -> Result<()>;
|
||||
fn mqtt_publish(&mut self, config: &Config, subtopic: &str, message: &[u8]) -> Result<()>;
|
||||
|
||||
fn sensor_multiplexer(&mut self, n: u8) -> Result<()>;
|
||||
fn flash_bq34_z100(&mut self, line: &str, dryrun: bool) -> Result<()>;
|
||||
}
|
||||
|
||||
pub trait CreatePlantHal<'a> {
|
||||
@@ -163,6 +206,8 @@ pub struct PlantCtrlBoard<'a> {
|
||||
PinDriver<'a, esp_idf_hal::gpio::AnyIOPin, InputOutput>,
|
||||
PinDriver<'a, esp_idf_hal::gpio::AnyIOPin, InputOutput>,
|
||||
>,
|
||||
shift_register_enable_invert:
|
||||
PinDriver<'a, esp_idf_hal::gpio::AnyIOPin, esp_idf_hal::gpio::Output>,
|
||||
tank_channel: AdcChannelDriver<'a, Gpio5, AdcDriver<'a, esp_idf_hal::adc::ADC1>>,
|
||||
solar_is_day: PinDriver<'a, esp_idf_hal::gpio::AnyIOPin, esp_idf_hal::gpio::Input>,
|
||||
boot_button: PinDriver<'a, esp_idf_hal::gpio::AnyIOPin, esp_idf_hal::gpio::Input>,
|
||||
@@ -266,7 +311,17 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
}
|
||||
|
||||
fn pump(&self, plant: usize, enable: bool) -> Result<()> {
|
||||
let index = plant * PINS_PER_PLANT + PLANT_PUMP_OFFSET;
|
||||
let index = match plant {
|
||||
0 => PUMP1_BIT,
|
||||
1 => PUMP2_BIT,
|
||||
2 => PUMP3_BIT,
|
||||
3 => PUMP4_BIT,
|
||||
4 => PUMP5_BIT,
|
||||
5 => PUMP6_BIT,
|
||||
6 => PUMP7_BIT,
|
||||
7 => PUMP8_BIT,
|
||||
_ => bail!("Invalid pump {plant}",),
|
||||
};
|
||||
//currently infailable error, keep for future as result anyway
|
||||
self.shift_register.decompose()[index].set_state(enable.into())?;
|
||||
Ok(())
|
||||
@@ -296,7 +351,17 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
}
|
||||
|
||||
fn fault(&self, plant: usize, enable: bool) {
|
||||
let index = plant * PINS_PER_PLANT + PLANT_FAULT_OFFSET;
|
||||
let index = match plant {
|
||||
0 => FAULT_1,
|
||||
1 => FAULT_2,
|
||||
2 => FAULT_3,
|
||||
3 => FAULT_4,
|
||||
4 => FAULT_5,
|
||||
5 => FAULT_6,
|
||||
6 => FAULT_7,
|
||||
7 => FAULT_8,
|
||||
_ => panic!("Invalid plant id {}", plant),
|
||||
};
|
||||
self.shift_register.decompose()[index]
|
||||
.set_state(enable.into())
|
||||
.unwrap()
|
||||
@@ -338,36 +403,76 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
self.time()
|
||||
}
|
||||
|
||||
fn measure_moisture_hz(&self, plant: usize, sensor: Sensor) -> Result<i32> {
|
||||
fn measure_moisture_hz(&mut self, plant: usize, sensor: Sensor) -> Result<i32> {
|
||||
let sensor_channel = match sensor {
|
||||
Sensor::A => match plant {
|
||||
0 => SENSOR_A_1,
|
||||
1 => SENSOR_A_2,
|
||||
2 => SENSOR_A_3,
|
||||
3 => SENSOR_A_4,
|
||||
4 => SENSOR_A_5,
|
||||
5 => SENSOR_A_6,
|
||||
6 => SENSOR_A_7,
|
||||
7 => SENSOR_A_8,
|
||||
_ => bail!("Invalid plant id {}", plant),
|
||||
},
|
||||
Sensor::B => match plant {
|
||||
0 => SENSOR_B_1,
|
||||
1 => SENSOR_B_2,
|
||||
2 => SENSOR_B_3,
|
||||
3 => SENSOR_B_4,
|
||||
4 => SENSOR_B_5,
|
||||
5 => SENSOR_B_6,
|
||||
6 => SENSOR_B_7,
|
||||
7 => SENSOR_B_8,
|
||||
_ => bail!("Invalid plant id {}", plant),
|
||||
},
|
||||
};
|
||||
|
||||
let mut results = [0; REPEAT_MOIST_MEASURE];
|
||||
for repeat in 0..REPEAT_MOIST_MEASURE {
|
||||
self.signal_counter.counter_pause()?;
|
||||
self.signal_counter.counter_clear()?;
|
||||
//
|
||||
let offset = match sensor {
|
||||
Sensor::A => PLANT_MOIST_A_OFFSET,
|
||||
Sensor::B => PLANT_MOIST_B_OFFSET,
|
||||
Sensor::PUMP => PLANT_MOIST_PUMP_OFFSET,
|
||||
};
|
||||
let index = plant * PINS_PER_PLANT + offset;
|
||||
//Disable all
|
||||
self.shift_register.decompose()[MS_4].set_high().unwrap();
|
||||
|
||||
self.sensor_multiplexer(sensor_channel)?;
|
||||
|
||||
self.shift_register.decompose()[MS_4].set_low().unwrap();
|
||||
self.shift_register.decompose()[SENSOR_ON]
|
||||
.set_high()
|
||||
.unwrap();
|
||||
|
||||
let delay = Delay::new_default();
|
||||
let measurement = 100;
|
||||
let measurement = 10;
|
||||
let factor = 1000 as f32 / measurement as f32;
|
||||
|
||||
self.shift_register.decompose()[index].set_high().unwrap();
|
||||
//give some time to stabilize
|
||||
delay.delay_ms(10);
|
||||
self.signal_counter.counter_resume()?;
|
||||
delay.delay_ms(measurement);
|
||||
self.signal_counter.counter_pause()?;
|
||||
self.shift_register.decompose()[index].set_low().unwrap();
|
||||
self.shift_register.decompose()[MS_4].set_high().unwrap();
|
||||
self.shift_register.decompose()[SENSOR_ON]
|
||||
.set_low()
|
||||
.unwrap();
|
||||
delay.delay_ms(10);
|
||||
let unscaled = self.signal_counter.get_counter_value()? as i32;
|
||||
let hz = (unscaled as f32 * factor) as i32;
|
||||
println!("Measuring {:?} @ {} with {}", sensor, plant, hz);
|
||||
Ok(hz)
|
||||
results[repeat] = hz;
|
||||
//println!("Measuring {:?} @ {} with {}", sensor, plant, hz);
|
||||
}
|
||||
results.sort();
|
||||
|
||||
let mid = results.len() / 2;
|
||||
|
||||
Ok(results[mid])
|
||||
}
|
||||
|
||||
fn general_fault(&mut self, enable: bool) {
|
||||
unsafe { gpio_hold_dis(self.general_fault.pin()) };
|
||||
self.general_fault.set_state(enable.into()).unwrap();
|
||||
unsafe { gpio_hold_en(self.general_fault.pin()) };
|
||||
}
|
||||
|
||||
fn wifi_ap(&mut self) -> Result<()> {
|
||||
@@ -534,27 +639,9 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
}
|
||||
|
||||
fn wifi_scan(&mut self) -> Result<Vec<AccessPointInfo>> {
|
||||
//remove this parts
|
||||
for i in 1..11 {
|
||||
println!("Scanning channel {}", i);
|
||||
self.wifi_driver.start_scan(
|
||||
&ScanConfig {
|
||||
scan_type: ScanType::Passive(Duration::from_secs(1)),
|
||||
show_hidden: false,
|
||||
channel: Some(i),
|
||||
..Default::default()
|
||||
},
|
||||
true,
|
||||
)?;
|
||||
let sr = self.wifi_driver.get_scan_result()?;
|
||||
for r in sr.iter() {
|
||||
println!("Found wifi {}", r.ssid);
|
||||
}
|
||||
}
|
||||
|
||||
self.wifi_driver.start_scan(
|
||||
&ScanConfig {
|
||||
scan_type: ScanType::Passive(Duration::from_secs(1)),
|
||||
scan_type: ScanType::Passive(Duration::from_secs(5)),
|
||||
show_hidden: false,
|
||||
..Default::default()
|
||||
},
|
||||
@@ -585,28 +672,25 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
unsafe { vTaskDelay(500) };
|
||||
self.light(false)?;
|
||||
unsafe { vTaskDelay(500) };
|
||||
for i in 0..8 {
|
||||
for i in 0..PLANT_COUNT {
|
||||
self.fault(i, true);
|
||||
unsafe { vTaskDelay(500) };
|
||||
self.fault(i, false);
|
||||
unsafe { vTaskDelay(500) };
|
||||
}
|
||||
for i in 0..8 {
|
||||
for i in 0..PLANT_COUNT {
|
||||
self.pump(i, true)?;
|
||||
unsafe { vTaskDelay(100) };
|
||||
self.pump(i, false)?;
|
||||
unsafe { vTaskDelay(100) };
|
||||
}
|
||||
for i in 0..8 {
|
||||
self.measure_moisture_hz(i, Sensor::A)?;
|
||||
for plant in 0..PLANT_COUNT {
|
||||
let a = self.measure_moisture_hz(plant, plant_hal::Sensor::A);
|
||||
let b = self.measure_moisture_hz(plant, plant_hal::Sensor::B);
|
||||
print!("P:{} a:{:?} b:{:?}", plant, a, b)
|
||||
}
|
||||
for i in 0..8 {
|
||||
self.measure_moisture_hz(i, Sensor::B)?;
|
||||
}
|
||||
for i in 0..8 {
|
||||
self.measure_moisture_hz(i, Sensor::PUMP)?;
|
||||
}
|
||||
|
||||
println!();
|
||||
Delay::new_default().delay_ms(10);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -801,7 +885,7 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
};
|
||||
}
|
||||
None => {
|
||||
bail!("No mqtt client, aborting publish");
|
||||
bail!("No mqtt client");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -885,6 +969,47 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
None => bail!("Error reading State of Health bq34z100 not found"),
|
||||
}
|
||||
}
|
||||
|
||||
fn sensor_multiplexer(&mut self, n: u8) -> Result<()> {
|
||||
assert!(n < 16);
|
||||
let is_bit_set = |b: u8| -> bool { n & (1 << b) != 0 };
|
||||
|
||||
let pin_0 = &mut self.shift_register.decompose()[MS_0];
|
||||
let pin_1 = &mut self.shift_register.decompose()[MS_1];
|
||||
let pin_2 = &mut self.shift_register.decompose()[MS_2];
|
||||
let pin_3 = &mut self.shift_register.decompose()[MS_3];
|
||||
if is_bit_set(0) {
|
||||
pin_0.set_high()?;
|
||||
} else {
|
||||
pin_0.set_low()?;
|
||||
}
|
||||
if is_bit_set(1) {
|
||||
pin_1.set_high()?;
|
||||
} else {
|
||||
pin_1.set_low()?;
|
||||
}
|
||||
if is_bit_set(2) {
|
||||
pin_2.set_high()?;
|
||||
} else {
|
||||
pin_2.set_low()?;
|
||||
}
|
||||
if is_bit_set(3) {
|
||||
pin_3.set_high()?;
|
||||
} else {
|
||||
pin_3.set_low()?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn flash_bq34_z100(&mut self, line: &str, dryrun: bool) -> Result<()> {
|
||||
match &mut self.battery_driver {
|
||||
Some(driver) => match driver.write_flash_stream_i2c(line, dryrun) {
|
||||
OkStd(r) => Ok(r),
|
||||
Err(err) => bail!("Error reading SoC {:?}", err),
|
||||
},
|
||||
None => bail!("Error reading SoC bq34z100 not found"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn print_battery(
|
||||
@@ -969,7 +1094,7 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
|
||||
let mut battery_driver: Bq34z100g1Driver<I2cDriver, Delay> = Bq34z100g1Driver {
|
||||
i2c: driver,
|
||||
delay: Delay::new_default(),
|
||||
delay: Delay::new(0),
|
||||
flash_block_data: [0; 32],
|
||||
};
|
||||
|
||||
@@ -986,7 +1111,19 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
|
||||
let mut one_wire_pin = PinDriver::input_output_od(peripherals.pins.gpio18)?;
|
||||
one_wire_pin.set_pull(Pull::Floating).unwrap();
|
||||
//TODO make to none if not possible to init
|
||||
|
||||
//disable all
|
||||
let ms0 = &mut shift_register.decompose()[MS_0];
|
||||
ms0.set_low()?;
|
||||
let ms1 = &mut shift_register.decompose()[MS_1];
|
||||
ms1.set_low()?;
|
||||
let ms2 = &mut shift_register.decompose()[MS_2];
|
||||
ms2.set_low()?;
|
||||
let ms3 = &mut shift_register.decompose()[MS_3];
|
||||
ms3.set_low()?;
|
||||
|
||||
let ms4 = &mut shift_register.decompose()[MS_4];
|
||||
ms4.set_high()?;
|
||||
|
||||
//init,reset rtc memory depending on cause
|
||||
let reasons = ResetReason::get();
|
||||
@@ -1099,6 +1236,7 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
let mut general_fault = PinDriver::input_output(peripherals.pins.gpio6.downgrade())?;
|
||||
general_fault.set_pull(Pull::Floating)?;
|
||||
general_fault.set_low()?;
|
||||
|
||||
let one_wire_bus = OneWire::new(one_wire_pin)
|
||||
.map_err(|err| -> anyhow::Error { anyhow!("Missing attribute: {:?}", err) })?;
|
||||
|
||||
@@ -1110,8 +1248,12 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
} else {
|
||||
println!("Managed to comunnicate with battery");
|
||||
}
|
||||
|
||||
let shift_register_enable_invert = PinDriver::output(peripherals.pins.gpio21.downgrade())?;
|
||||
|
||||
let rv = Mutex::new(PlantCtrlBoard {
|
||||
shift_register,
|
||||
shift_register_enable_invert,
|
||||
tank_channel,
|
||||
solar_is_day,
|
||||
boot_button,
|
||||
@@ -1126,6 +1268,14 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
//battery_driver: None,
|
||||
battery_driver: Some(battery_driver),
|
||||
});
|
||||
|
||||
let _ = rv.lock().is_ok_and(|mut board| {
|
||||
unsafe { gpio_hold_dis(board.shift_register_enable_invert.pin()) };
|
||||
board.shift_register_enable_invert.set_low().unwrap();
|
||||
unsafe { gpio_hold_en(board.shift_register_enable_invert.pin()) };
|
||||
return true;
|
||||
});
|
||||
|
||||
Ok(rv)
|
||||
}
|
||||
}
|
||||
|
||||
197
rust/src/webserver/0100_2_02-bq34z100.df.fs
Normal file
197
rust/src/webserver/0100_2_02-bq34z100.df.fs
Normal file
@@ -0,0 +1,197 @@
|
||||
;--------------------------------------------------------
|
||||
;Verify Existing Firmware Version
|
||||
;--------------------------------------------------------
|
||||
W: AA 00 01 00
|
||||
C: AA 00 00 01
|
||||
W: AA 00 02 00
|
||||
C: AA 00 02 02
|
||||
;--------------------------------------------------------
|
||||
;Unseal device
|
||||
;--------------------------------------------------------
|
||||
W: AA 00 14 04
|
||||
W: AA 00 72 36
|
||||
W: AA 00 FF FF
|
||||
W: AA 00 FF FF
|
||||
X: 1000
|
||||
;--------------------------------------------------------
|
||||
;Go To ROM Mode
|
||||
;--------------------------------------------------------
|
||||
W: AA 00 00 0F
|
||||
X: 1000
|
||||
;--------------------------------------------------------
|
||||
;Data Block
|
||||
;--------------------------------------------------------
|
||||
W: 16 00 03 00 00
|
||||
W: 16 64 03 00
|
||||
X: 20
|
||||
C: 16 66 00
|
||||
W: 16 00 02 00 00 00 EA FF 33 FA FA 33 B5 FB 33 95 FE 33 AD FE 33 FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F FF FF 3F 02 02 3F 58 CB 33 C3 A0 08 1F 00 00 00 00 00 FF AA 0E FB A7 0E FF A6 0E FF A1 0E FF A0 0E FE A3 0E 54 A2 0E DE FF 3A 67 FF 3A E2 FF 33 FF AF 0E
|
||||
W: 16 64 3D 38
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 02 01 00 00 01 4F 03 3F 11 0C D9 FF 30 E0 FF 35 2F 10 0C E0 FF 35 FF FF 23 E3 AF 04 E2 BF 04 D1 FF 36 E2 A0 04 E3 A1 04 00 C7 02 01 C6 02 E5 AF 04 E3 BF 01 E4 AF 04 E2 BF 01 FF AC 0E E1 1C 04 8A FF 31 E2 A0 04 E3 A1 04 02 AB 18 7F 2B 0E FF 1B 0E BF FF 32 FC FA 0E FB AF 0C 02 2B 18 FF 1B 0E 98 FF 36
|
||||
W: 16 64 AE 2C
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 05
|
||||
W: 16 64 05 00
|
||||
X: 170
|
||||
C: 16 66 00
|
||||
C: 16 04 0A 91 AF DC
|
||||
W: 16 00 0C 00 00 00 83 DE
|
||||
W: 16 64 6D 01
|
||||
X: 400
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 00 00 00 7E 22 B7 35 92 38 D0 0B F9 F1 E5 BC 00 00 14 B0 51 F6 C9 F4 14 52 09 21 32 6D 00 00 00 00 D0 7E
|
||||
W: 16 64 0B 0D
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 01 00 00 17 DF 00 00 17 F3 00 00 3A 36 FD 91 00 25 30 01 00 EF 02 11 05 01 00 00 10 01 00 3C 00 50 3C 00
|
||||
W: 16 64 40 06
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 02 00 00 64 3C 00 20 03 E8 00 00 04 10 68 FE D5 FB 95 00 02 00 14 03 E8 01 00 01 F4 00 1E 00 3C 0E 10 00
|
||||
W: 16 64 05 08
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 03 00 00 0A 46 05 32 01 0F 01 F4 00 64 46 50 0A 0D 0C 0C C0 01 90 00 64 19 00 01 00 14 00 01 00 14 03 23
|
||||
W: 16 64 E0 04
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 04 00 00 07 08 25 5A 32 0F 64 60 00 A0 0B B8 00 C8 28 01 F4 00 00 00 00 00 00 00 00 00 00 43 80 04 00 00
|
||||
W: 16 64 B0 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 05 00 00 0F 00 2A 04 0A 7D 00 00 01 0A FE 76 E7 54 00 28 03 E8 02 01 2C F0 00 04 18 0D 5B 0D 28 0D 02 0D
|
||||
W: 16 64 94 06
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 06 00 00 0A 0D 06 0D 06 0D 07 0D 06 0D 05 0D 04 0D 04 0D 03 0D 08 0D 04 0C F9 0C ED 0C EC 0C E0 0C DA 0C
|
||||
W: 16 64 A5 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 07 00 00 D6 0C D7 0C DA 0C D9 0C D9 0C D8 0C D5 0C D2 0C D2 0C D0 0C C9 0C BE 0C B4 0C A7 0C 9A 0C 8A 0C
|
||||
W: 16 64 31 0D
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 08 00 00 85 0C 7E 0C 2D 0B 64 09 64 FD 9E 03 6B 05 37 00 58 01 FA 01 D6 01 17 01 50 01 94 01 E2 01 CE 02
|
||||
W: 16 64 57 09
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 09 00 00 62 FF 67 01 99 03 7D 05 9C 00 DA 02 CB 03 AD 04 A1 04 72 02 F1 03 A0 03 85 03 E7 04 86 04 EE 02
|
||||
W: 16 64 8E 0B
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0A 00 00 AB 01 0C FE D1 FE EE FF 28 FF 76 FF 51 00 13 00 88 FE 42 FD 29 05 9B 23 48 FF 7E FF 8B FF 6C FF
|
||||
W: 16 64 F0 11
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0B 00 00 46 FF 97 FF 8D FF 97 FF 98 FF 84 FF 8C FF AB FF B1 FF B1 FF 92 FF 74 FF 35 FF 0B FF 06 FF 5E FF
|
||||
W: 16 64 65 17
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0C 00 00 13 FF 17 FF 10 FE C7 FE D8 FF 0C FF 05 FE E3 FF 2E FF 1D FE B7 00 00 01 C2 00 32 FF CE 02 26 64
|
||||
W: 16 64 25 11
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0D 00 00 7B 1F BE 77 60 7E 00 00 00 00 64 00 19 00 64 28 63 5F 64 62 00 64 00 1E 00 B4 00 64 00 F0 00 FA
|
||||
W: 16 64 D9 08
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0E 00 00 11 10 10 68 49 FA 18 37 09 18 00 04 00 14 00 00 0A F0 00 0A 05 00 32 01 C2 14 14 00 00 3C 00 4B
|
||||
W: 16 64 29 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 0F 00 00 00 28 00 3C 3C 01 90 36 72 04 14 FF FF FF FF 01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 04
|
||||
W: 16 64 02 0E
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 10 00 00 01 75 FE 79 08 1E FF 83 7F FF 00 AF 00 04 0A 64 01 00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 8B 06
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 1B 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 12 00 00 02 26 02 01 F4 02 58 02 02 26 0E 00 00 00 00 00 00 00 00 00 00 00 00 17 00 DC 84 E5 5F 60 1C 0E
|
||||
W: 16 64 12 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 13 00 00 10 00 21 00 01 00 01 03 E8 64 17 70 64 00 FE 70 10 68 10 68 10 04 0A 32 1E 00 0A 2D 37 01 01 03
|
||||
W: 16 64 C9 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 14 00 00 0B 62 71 33 34 7A 31 30 30 2D 47 31 0B 54 65 78 61 73 20 49 6E 73 74 2E 04 4C 49 46 4F 00 96 00
|
||||
W: 16 64 D3 08
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 15 00 00 AF 00 4B 00 64 0A F0 02 0B 54 10 CC 02 10 68 64 01 03 05 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 9B 04
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 13 0D
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 17 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 01 20
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 18 00 00 FF 55 00 1A 00 1C 00 23 00 35 00 1E 00 20 00 27 00 22 00 25 00 42 00 3F 00 41 00 76 00 9D 02 0A
|
||||
W: 16 64 91 04
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 23 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1A 00 00 FF FF 00 1A 00 1C 00 23 00 35 00 1E 00 20 00 27 00 22 00 25 00 42 00 3F 00 41 00 76 00 9D 02 0A
|
||||
W: 16 64 3D 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
W: 16 64 25 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1C 00 00 11 10 10 68 49 FA 18 37 09 18 00 04 00 14 00 00 0A F0 00 0A 05 00 32 01 C2 14 14 00 00 3C 00 4B
|
||||
W: 16 64 37 05
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1D 00 00 00 28 00 3C 3C 01 90 36 72 04 14 FF FF FF FF 01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 04
|
||||
W: 16 64 10 0E
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1E 00 00 FF FF FF FF 00 00 02 6B FF FF FD 93 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 0B 1C
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 0A 1F 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
W: 16 64 09 20
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
W: 16 00 08
|
||||
W: 16 64 08 00
|
||||
X: 2
|
||||
C: 16 66 00
|
||||
C: 16 04 F1 4C
|
||||
W: 16 00 05
|
||||
W: 16 64 05 00
|
||||
X: 170
|
||||
C: 16 66 00
|
||||
C: 16 04 0A 91 AF DC
|
||||
W: 16 00 01 00 00 05 54 54 15
|
||||
W: 16 64 C3 00
|
||||
X: 20
|
||||
C: 16 66 00
|
||||
W: 16 00 05
|
||||
W: 16 64 05 00
|
||||
X: 170
|
||||
C: 16 66 00
|
||||
C: 16 04 5F E5 84 DC
|
||||
;--------------------------------------------------------
|
||||
;Execute Flash Code
|
||||
;--------------------------------------------------------
|
||||
W: 16 00 0F
|
||||
W: 16 64 0F 00
|
||||
X: 4000
|
||||
@@ -17,6 +17,15 @@
|
||||
<p id="loaded_n_total"></p>
|
||||
</form>
|
||||
|
||||
<h2>Battery Firmeware (bq34z100 may be R2)</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="battery_flash_file" id="battery_flash_file"><br>
|
||||
<progress id="battery_flash_progressBar" value="0" max="100" style="width:300px;"></progress>
|
||||
<input type="button" name="battery_flash_button" id="battery_flash_button"><br>
|
||||
<h3 id="battery_flash_status"></h3>
|
||||
<p id="battery_flash_loaded_n_total"></p>
|
||||
<div style="height: 100px; display: block; overflow-y: auto;" id = "battery_flash_message"></div>
|
||||
</form>
|
||||
|
||||
|
||||
<h2>config</h2>
|
||||
|
||||
@@ -17,6 +17,16 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<h2>Battery Firmeware (bq34z100 may be R2)</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="battery_flash_file" id="battery_flash_file"><br>
|
||||
<progress id="battery_flash_progressBar" value="0" max="100" style="width:300px;"></progress>
|
||||
<input type="button" name="battery_flash_button" id="battery_flash_button"><br>
|
||||
<h3 id="battery_flash_status"></h3>
|
||||
<p id="battery_flash_loaded_n_total"></p>
|
||||
<div style="height: 100px; display: block; overflow-y: auto;" id = "battery_flash_message"></div>
|
||||
</form>
|
||||
|
||||
<div>
|
||||
<h2>WIFI</h2>
|
||||
<input type="button" id="scan" value="Scan">
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
//offer ota and config mode
|
||||
|
||||
use std::{
|
||||
collections::VecDeque,
|
||||
io::{BufRead, Read, Write},
|
||||
str::from_utf8,
|
||||
sync::{atomic::AtomicBool, Arc},
|
||||
};
|
||||
|
||||
use crate::{espota::OtaUpdate, BOARD_ACCESS};
|
||||
use core::result::Result::Ok;
|
||||
use embedded_svc::http::Method;
|
||||
use embedded_svc::http::{Method};
|
||||
use esp_idf_hal::delay::Delay;
|
||||
use esp_idf_svc::http::server::{Configuration, EspHttpServer};
|
||||
use esp_idf_sys::vTaskDelay;
|
||||
use heapless::String;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@@ -289,4 +293,72 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/flashbattery", Method::Post, move |mut request| {
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
let mut buffer: [u8; 32] = [0; 32];
|
||||
let mut line_buffer: VecDeque<u8> = VecDeque::new();
|
||||
|
||||
let is_dry_run = !request.uri().ends_with("?flash=true");
|
||||
let mut total_read: usize = 0;
|
||||
|
||||
let mut toggle = true;
|
||||
let delay = Delay::new(1);
|
||||
loop {
|
||||
delay.delay_us(2);
|
||||
let read = request.read(&mut buffer).unwrap();
|
||||
total_read += read;
|
||||
println!("received {read} bytes ota {total_read}");
|
||||
if read == 0 {
|
||||
if line_buffer.len() > 0 {
|
||||
println!("No further body but no endline");
|
||||
let mut line = std::string::String::new();
|
||||
line_buffer.read_to_string(&mut line).unwrap();
|
||||
let msg = format!("Finished reading, but there is still some leftover in buffer and no full line {line}<br>");
|
||||
println!("{}", msg);
|
||||
let mut response = request.into_status_response(400_u16).unwrap();
|
||||
response.write(msg.as_bytes()).unwrap();
|
||||
response.flush().unwrap();
|
||||
return anyhow::Ok(())
|
||||
}
|
||||
break;
|
||||
}
|
||||
let to_write = &buffer[0..read];
|
||||
line_buffer.write_all(to_write).unwrap();
|
||||
println!("Write to deque new lenght is {}", line_buffer.len());
|
||||
board.general_fault(toggle);
|
||||
toggle = !toggle;
|
||||
println!("Updated btn");
|
||||
|
||||
loop {
|
||||
println!("Check for line");
|
||||
let has_line = line_buffer.contains(&b'\n');
|
||||
if has_line {
|
||||
println!("Was no line no string read");
|
||||
break;
|
||||
}
|
||||
let mut line = std::string::String::new();
|
||||
let line_size = line_buffer.read_line(&mut line)?;
|
||||
println!("Processing line with size {} {}", line_size, line);
|
||||
let validate = board.flash_bq34_z100(&line, is_dry_run);
|
||||
delay.delay_us(2);
|
||||
if validate.is_err() {
|
||||
let mut response = request.into_status_response(400_u16).unwrap();
|
||||
let err = validate.unwrap_err();
|
||||
let err_str = err.to_string();
|
||||
let err_msg = err_str.as_bytes();
|
||||
response
|
||||
.write(err_msg)
|
||||
.unwrap();
|
||||
return anyhow::Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut response = request.into_status_response(200_u16).unwrap();
|
||||
let msg = format!("Finished writing {total_read} bytes<br>");
|
||||
response.write(msg.as_bytes()).unwrap();
|
||||
board.general_fault(false);
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
}
|
||||
|
||||
38
rust/src_webpack/src/battery.ts
Normal file
38
rust/src_webpack/src/battery.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
let battery_flash_button = document.getElementById("battery_flash_button") as HTMLButtonElement;
|
||||
let battery_flash_file = document.getElementById("battery_flash_file") as HTMLInputElement;
|
||||
let battery_flash_message = document.getElementById("battery_flash_message") as HTMLElement;
|
||||
let battery_flash_progressBar = document.getElementById("battery_flash_progressBar") as HTMLProgressElement;
|
||||
let battery_flash_loaded_n_total = document.getElementById("battery_flash_loaded_n_total") as HTMLElement;
|
||||
let battery_flash_status = document.getElementById("battery_flash_status") as HTMLElement;
|
||||
|
||||
|
||||
var ajax = new XMLHttpRequest();
|
||||
|
||||
ajax.upload.addEventListener("progress", event => {
|
||||
battery_flash_loaded_n_total.innerHTML = "Uploaded " + event.loaded + " bytes of " + event.total;
|
||||
var percent = (event.loaded / event.total) * 100;
|
||||
battery_flash_progressBar.value = Math.round(percent);
|
||||
battery_flash_status.innerHTML = Math.round(percent) + "%";
|
||||
battery_flash_message.innerHTML = "in progress";
|
||||
}, false);
|
||||
ajax.addEventListener("load", () => {
|
||||
battery_flash_status.innerHTML = ajax.responseText;
|
||||
battery_flash_message.innerHTML = "finished";
|
||||
battery_flash_progressBar.value = 0;
|
||||
}, false);
|
||||
ajax.addEventListener("error", () => {
|
||||
battery_flash_status.innerHTML = ajax.responseText;
|
||||
battery_flash_message.innerHTML = "failed";
|
||||
}, false);
|
||||
ajax.addEventListener("abort", () => {
|
||||
battery_flash_status.innerHTML = ajax.responseText;
|
||||
battery_flash_message.innerHTML = "aborted";
|
||||
}, false);
|
||||
|
||||
|
||||
|
||||
|
||||
battery_flash_button.onclick = async function (){
|
||||
ajax.open("POST", "/flashbattery");
|
||||
ajax.send(battery_flash_file.files[0]);
|
||||
};
|
||||
@@ -327,7 +327,8 @@ let fromWrapper = (() => {
|
||||
updateJson()
|
||||
fetch("/set_config", {
|
||||
method :"POST",
|
||||
body: json.value
|
||||
body: json.value,
|
||||
|
||||
})
|
||||
.then(response => response.text())
|
||||
.then(text => submit_status.innerText = text)
|
||||
|
||||
@@ -3,7 +3,7 @@ const path = require('path');
|
||||
|
||||
module.exports = {
|
||||
mode: "development",
|
||||
entry: ['./src/form.ts','./src/ota.ts','./src/wifi.ts'],
|
||||
entry: ['./src/form.ts','./src/ota.ts','./src/wifi.ts', "./src/battery.ts"],
|
||||
devtool: 'inline-source-map',
|
||||
module: {
|
||||
rules: [
|
||||
|
||||
Reference in New Issue
Block a user