Explorar el Código

custom picowota fork to show stuff on lcd and use flash wifi credentials

Thomas Buck hace 5 meses
padre
commit
a5644ba7a5
Se han modificado 11 ficheros con 205 adiciones y 13 borrados
  1. 1
    1
      .gitmodules
  2. 40
    0
      CMakeLists.txt
  3. 7
    0
      include/log.h
  4. 1
    1
      include/ring.h
  5. 3
    0
      include/wifi.h
  6. 1
    1
      picowota
  7. 48
    4
      src/log.c
  8. 7
    0
      src/mem.c
  9. 77
    0
      src/ota_shim.c
  10. 16
    6
      src/ring.c
  11. 4
    0
      src/wifi.c

+ 1
- 1
.gitmodules Ver fichero

12
 	url = https://github.com/hepingood/st7789
12
 	url = https://github.com/hepingood/st7789
13
 [submodule "picowota"]
13
 [submodule "picowota"]
14
 	path = picowota
14
 	path = picowota
15
-	url = https://github.com/usedbytes/picowota
15
+	url = https://github.com/xythobuz/picowota

+ 40
- 0
CMakeLists.txt Ver fichero

199
     CYW43_HOST_NAME="pico-volcano"
199
     CYW43_HOST_NAME="pico-volcano"
200
 )
200
 )
201
 
201
 
202
+set(PICOWOTA_ADDITIONAL_SOURCES
203
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/wifi.c
204
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/lcd.c
205
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/log.c
206
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/mem.c
207
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/ring.c
208
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/textbox.c
209
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/text.c
210
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/ota_shim.c
211
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/workflow_default.c
212
+
213
+    ${CMAKE_CURRENT_SOURCE_DIR}/st7789/src/driver_st7789.c
214
+
215
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_encoding.c
216
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_font.c
217
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_justify.c
218
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_kerning.c
219
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_rlefont.c
220
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_bwfont.c
221
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_scaledfont.c
222
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder/mf_wordwrap.c
223
+)
224
+set(PICOWOTA_ADDITIONAL_INCLUDES
225
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
226
+    ${CMAKE_CURRENT_SOURCE_DIR}/conf
227
+    ${CMAKE_CURRENT_SOURCE_DIR}/data
228
+    ${CMAKE_CURRENT_SOURCE_DIR}/st7789/src
229
+    ${CMAKE_CURRENT_SOURCE_DIR}/st7789/interface
230
+    ${CMAKE_CURRENT_SOURCE_DIR}/mcufont/decoder
231
+    ${CMAKE_CURRENT_BINARY_DIR}/fatfs
232
+    ${CMAKE_CURRENT_SOURCE_DIR}/pico-sdk/src/rp2_common/pico_btstack/include
233
+    ${CMAKE_CURRENT_SOURCE_DIR}/pico-sdk/lib/btstack/platform/embedded
234
+)
235
+set(PICOWOTA_ADDITIONAL_LIBS
236
+    hardware_spi
237
+    hardware_pwm
238
+    hardware_flash
239
+    pico_flash
240
+)
241
+
202
 add_subdirectory(picowota)
242
 add_subdirectory(picowota)
203
 picowota_build_combined(gadget)
243
 picowota_build_combined(gadget)

+ 7
- 0
include/log.h Ver fichero

25
 
25
 
26
 // for output that is stored in the debug log.
26
 // for output that is stored in the debug log.
27
 // will be re-played from buffer when terminal connects
27
 // will be re-played from buffer when terminal connects
28
+#ifndef PICOWOTA
28
 #define debug(fmt, ...) debug_log(true, \
29
 #define debug(fmt, ...) debug_log(true, \
29
         "%08lu %s: " fmt "\r\n", \
30
         "%08lu %s: " fmt "\r\n", \
30
         to_ms_since_boot(get_absolute_time()), \
31
         to_ms_since_boot(get_absolute_time()), \
31
         __func__, \
32
         __func__, \
32
         ##__VA_ARGS__)
33
         ##__VA_ARGS__)
34
+#else // PICOWOTA
35
+#define debug(fmt, ...) debug_log(true, \
36
+        fmt "\r\n", \
37
+        ##__VA_ARGS__)
38
+#endif // PICOWOTA
33
 
39
 
34
 // for interactive output. is not stored or re-played.
40
 // for interactive output. is not stored or re-played.
35
 #define print(fmt, ...) debug_log(false, fmt, ##__VA_ARGS__)
41
 #define print(fmt, ...) debug_log(false, fmt, ##__VA_ARGS__)
42
 void log_dump_to_usb(void);
48
 void log_dump_to_usb(void);
43
 void log_dump_to_uart(void);
49
 void log_dump_to_uart(void);
44
 void log_dump_to_disk(void);
50
 void log_dump_to_disk(void);
51
+void log_dump_to_lcd(void);
45
 
52
 
46
 void debug_handle_input(const void *buff, size_t len);
53
 void debug_handle_input(const void *buff, size_t len);
47
 
54
 

+ 1
- 1
include/ring.h Ver fichero

36
 #define rb_push(rb, v) rb_add(rb, v, 1)
36
 #define rb_push(rb, v) rb_add(rb, v, 1)
37
 size_t rb_len(struct ring_buffer *rb);
37
 size_t rb_len(struct ring_buffer *rb);
38
 #define rb_space(rb) ((rb)->size - rb_len(rb))
38
 #define rb_space(rb) ((rb)->size - rb_len(rb))
39
-void rb_dump(struct ring_buffer *rb, void (*write)(const void *, size_t));
39
+void rb_dump(struct ring_buffer *rb, void (*write)(const void *, size_t), size_t skip);
40
 void rb_move(struct ring_buffer *rb, void (*write)(const void *, size_t));
40
 void rb_move(struct ring_buffer *rb, void (*write)(const void *, size_t));
41
 void rb_peek(struct ring_buffer *rb, void *buf);
41
 void rb_peek(struct ring_buffer *rb, void *buf);
42
 void rb_pop(struct ring_buffer *rb, void *buf);
42
 void rb_pop(struct ring_buffer *rb, void *buf);

+ 3
- 0
include/wifi.h Ver fichero

19
 #ifndef __WIFI_H__
19
 #ifndef __WIFI_H__
20
 #define __WIFI_H__
20
 #define __WIFI_H__
21
 
21
 
22
+#include <stdbool.h>
23
+
22
 #define WIFI_MAX_NET_COUNT 5
24
 #define WIFI_MAX_NET_COUNT 5
23
 #define WIFI_MAX_NAME_LEN 32
25
 #define WIFI_MAX_NAME_LEN 32
24
 #define WIFI_MAX_PASS_LEN 32
26
 #define WIFI_MAX_PASS_LEN 32
32
 void wifi_deinit(void);
34
 void wifi_deinit(void);
33
 
35
 
34
 bool wifi_initialized(void);
36
 bool wifi_initialized(void);
37
+bool wifi_ready(void);
35
 const char *wifi_state(void);
38
 const char *wifi_state(void);
36
 
39
 
37
 void wifi_run(void);
40
 void wifi_run(void);

+ 1
- 1
picowota

1
-Subproject commit ac8960b274f0f76013364a9b83325036cb52f030
1
+Subproject commit 4abdeee20f2dd8f813f322b61ce1afee7b502d12

+ 48
- 4
src/log.c Ver fichero

17
  */
17
  */
18
 
18
 
19
 #include <stdio.h>
19
 #include <stdio.h>
20
+#include <string.h>
20
 
21
 
21
 #include "hardware/watchdog.h"
22
 #include "hardware/watchdog.h"
22
 #include "ff.h"
23
 #include "ff.h"
23
 
24
 
24
 #include "config.h"
25
 #include "config.h"
25
 #include "main.h"
26
 #include "main.h"
27
+#include "lcd.h"
28
+#include "textbox.h"
26
 #include "usb_cdc.h"
29
 #include "usb_cdc.h"
27
 #include "serial.h"
30
 #include "serial.h"
28
 #include "ring.h"
31
 #include "ring.h"
33
 
36
 
34
 static uint8_t line_buff[256] = {0};
37
 static uint8_t line_buff[256] = {0};
35
 static volatile bool got_input = false;
38
 static volatile bool got_input = false;
39
+static int16_t lcd_off = 0;
40
+
41
+#ifndef PICOWOTA
36
 static FIL log_file_fat;
42
 static FIL log_file_fat;
43
+#endif // PICOWOTA
37
 
44
 
38
 static void add_to_log(const void *buff, size_t len) {
45
 static void add_to_log(const void *buff, size_t len) {
39
     rb_add(&log, buff, len);
46
     rb_add(&log, buff, len);
40
 }
47
 }
41
 
48
 
49
+static void lcd_write(const void *buf, size_t len) {
50
+    char tmp[len + 1];
51
+    memcpy(tmp, buf, len);
52
+    tmp[len] = '\0';
53
+    lcd_off = text_box(tmp, false,
54
+                       "fixed_10x20",
55
+                       0, LCD_WIDTH,
56
+                       lcd_off, LCD_HEIGHT - lcd_off,
57
+                       0);
58
+}
59
+
60
+void log_dump_to_lcd(void) {
61
+    static size_t prev_len = 0;
62
+    size_t len = rb_len(&log);
63
+    if (len == prev_len) {
64
+        return;
65
+    }
66
+    prev_len = len;
67
+
68
+    lcd_off = 0;
69
+
70
+    const size_t todo = 120;
71
+    size_t text_off = 0;
72
+    if (len > todo) {
73
+        text_off = len - todo;
74
+    }
75
+
76
+    rb_dump(&log, lcd_write, text_off);
77
+}
78
+
79
+#ifndef PICOWOTA
42
 static void log_dump_to_x(void (*write)(const void *, size_t)) {
80
 static void log_dump_to_x(void (*write)(const void *, size_t)) {
43
     if (rb_len(&log) == 0) {
81
     if (rb_len(&log) == 0) {
44
         return;
82
         return;
49
         write(line_buff, l);
87
         write(line_buff, l);
50
     }
88
     }
51
 
89
 
52
-    rb_dump(&log, write);
90
+    rb_dump(&log, write, 0);
53
 
91
 
54
     l = snprintf((char *)line_buff, sizeof(line_buff), "\r\n\r\nlive log:\r\n");
92
     l = snprintf((char *)line_buff, sizeof(line_buff), "\r\n\r\nlive log:\r\n");
55
     if ((l > 0) && (l <= (int)sizeof(line_buff))) {
93
     if ((l > 0) && (l <= (int)sizeof(line_buff))) {
64
 void log_dump_to_uart(void) {
102
 void log_dump_to_uart(void) {
65
 #ifndef NDEBUG
103
 #ifndef NDEBUG
66
     log_dump_to_x(serial_write);
104
     log_dump_to_x(serial_write);
67
-#endif
105
+#endif // NDEBUG
68
 }
106
 }
69
 
107
 
70
 static void log_file_write_callback(const void *data, size_t len) {
108
 static void log_file_write_callback(const void *data, size_t len) {
82
         return;
120
         return;
83
     }
121
     }
84
 
122
 
85
-    rb_dump(&log, log_file_write_callback);
123
+    rb_dump(&log, log_file_write_callback, 0);
86
 
124
 
87
     res = f_close(&log_file_fat);
125
     res = f_close(&log_file_fat);
88
     if (res != FR_OK) {
126
     if (res != FR_OK) {
90
     }
128
     }
91
 }
129
 }
92
 
130
 
131
+#endif // PICOWOTA
132
+
93
 void debug_log_va(bool log, const char *format, va_list args) {
133
 void debug_log_va(bool log, const char *format, va_list args) {
94
     int l = vsnprintf((char *)line_buff, sizeof(line_buff), format, args);
134
     int l = vsnprintf((char *)line_buff, sizeof(line_buff), format, args);
95
 
135
 
101
         l = snprintf((char *)line_buff, sizeof(line_buff), "%s: message too long (%d)\r\n", __func__, l);
141
         l = snprintf((char *)line_buff, sizeof(line_buff), "%s: message too long (%d)\r\n", __func__, l);
102
     }
142
     }
103
     if ((l > 0) && (l <= (int)sizeof(line_buff))) {
143
     if ((l > 0) && (l <= (int)sizeof(line_buff))) {
144
+#ifndef PICOWOTA
104
         usb_cdc_write(line_buff, l);
145
         usb_cdc_write(line_buff, l);
105
 
146
 
106
 #ifndef NDEBUG
147
 #ifndef NDEBUG
107
         serial_write(line_buff, l);
148
         serial_write(line_buff, l);
108
-#endif
149
+#endif // NDEBUG
150
+#endif // PICOWOTA
109
 
151
 
110
         if (log) {
152
         if (log) {
111
             add_to_log(line_buff, l);
153
             add_to_log(line_buff, l);
120
     va_end(args);
162
     va_end(args);
121
 }
163
 }
122
 
164
 
165
+#ifndef PICOWOTA
123
 void debug_handle_input(const void *buff, size_t len) {
166
 void debug_handle_input(const void *buff, size_t len) {
124
     (void)buff;
167
     (void)buff;
125
 
168
 
145
     usb_cdc_set_reroute(false);
188
     usb_cdc_set_reroute(false);
146
     serial_set_reroute(false);
189
     serial_set_reroute(false);
147
 }
190
 }
191
+#endif // PICOWOTA

+ 7
- 0
src/mem.c Ver fichero

87
     }
87
     }
88
 
88
 
89
     // TODO better way to pre-define WiFi credentials
89
     // TODO better way to pre-define WiFi credentials
90
+#if defined(DEFAULT_WIFI_SSID) && defined(DEFAULT_WIFI_PASS)
90
     data_ram.data.net_count = 1;
91
     data_ram.data.net_count = 1;
91
     strcpy(data_ram.data.net[0].name, DEFAULT_WIFI_SSID);
92
     strcpy(data_ram.data.net[0].name, DEFAULT_WIFI_SSID);
92
     strcpy(data_ram.data.net[0].pass, DEFAULT_WIFI_PASS);
93
     strcpy(data_ram.data.net[0].pass, DEFAULT_WIFI_PASS);
94
+#else
95
+    data_ram.data.net_count = 0;
96
+#endif
93
 }
97
 }
94
 
98
 
95
 void mem_load(void) {
99
 void mem_load(void) {
110
         } else {
114
         } else {
111
             debug("loading from flash (0x%08lX)", checksum);
115
             debug("loading from flash (0x%08lX)", checksum);
112
             data_ram = *flash_ptr;
116
             data_ram = *flash_ptr;
117
+            debug("%s", data_ram.data.net[0].pass);
113
         }
118
         }
114
     } else {
119
     } else {
115
         debug("invalid config (0x%02X != 0x%02X)", flash_ptr->version, MEM_VERSION);
120
         debug("invalid config (0x%02X != 0x%02X)", flash_ptr->version, MEM_VERSION);
116
     }
121
     }
117
 
122
 
123
+#if defined(DEFAULT_WIFI_SSID) && defined(DEFAULT_WIFI_PASS)
118
     // add default WiFi from #define to flash config, if it is not there yet
124
     // add default WiFi from #define to flash config, if it is not there yet
119
     bool found = false;
125
     bool found = false;
120
     for (uint16_t i = 0; i < data_ram.data.net_count; i++) {
126
     for (uint16_t i = 0; i < data_ram.data.net_count; i++) {
133
         strcpy(data_ram.data.net[data_ram.data.net_count].pass, DEFAULT_WIFI_PASS);
139
         strcpy(data_ram.data.net[data_ram.data.net_count].pass, DEFAULT_WIFI_PASS);
134
         data_ram.data.net_count++;
140
         data_ram.data.net_count++;
135
     }
141
     }
142
+#endif
136
 }
143
 }
137
 
144
 
138
 static void mem_write_flash(void *param) {
145
 static void mem_write_flash(void *param) {

+ 77
- 0
src/ota_shim.c Ver fichero

1
+/*
2
+ * ota_shim.c
3
+ *
4
+ * Copyright (c) 2023 Thomas Buck (thomas@xythobuz.de)
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * See <http://www.gnu.org/licenses/>.
17
+ */
18
+
19
+#include "pico/cyw43_arch.h"
20
+
21
+#include "config.h"
22
+#include "lcd.h"
23
+#include "log.h"
24
+#include "mem.h"
25
+#include "wifi.h"
26
+
27
+int picowota_network_init(void) {
28
+    debug("mem_load");
29
+    mem_load();
30
+
31
+    debug("lcd_init");
32
+    lcd_init();
33
+
34
+    lcd_set_backlight(mem_data()->backlight);
35
+    log_dump_to_lcd();
36
+
37
+    debug("cyw43_arch_init");
38
+    log_dump_to_lcd();
39
+
40
+    if (cyw43_arch_init_with_country(COUNTRY_CODE)) {
41
+        debug("failed to init cyw43");
42
+        log_dump_to_lcd();
43
+
44
+        return 1;
45
+    }
46
+
47
+    debug("wifi_init");
48
+    log_dump_to_lcd();
49
+
50
+    wifi_init();
51
+
52
+    const char *prev = NULL;
53
+    while (!wifi_ready()) {
54
+        cyw43_arch_poll();
55
+        wifi_run();
56
+
57
+        const char *state = wifi_state();
58
+        if (state != prev) {
59
+            prev = state;
60
+            debug("new state: %s", state);
61
+        }
62
+
63
+        log_dump_to_lcd();
64
+
65
+        // TODO open AP when timed out?
66
+    }
67
+
68
+    debug("wifi ready");
69
+    log_dump_to_lcd();
70
+
71
+    return 0;
72
+}
73
+
74
+void picowota_network_deinit(void) {
75
+    debug("wifi_deinit");
76
+    wifi_deinit();
77
+}

+ 16
- 6
src/ring.c Ver fichero

16
  * See <http://www.gnu.org/licenses/>.
16
  * See <http://www.gnu.org/licenses/>.
17
  */
17
  */
18
 
18
 
19
+#define MIN(x, y) ((x < y) ? x : y)
20
+
19
 #include <string.h>
21
 #include <string.h>
20
 
22
 
21
 #include "config.h"
23
 #include "config.h"
51
     }
53
     }
52
 }
54
 }
53
 
55
 
54
-void rb_dump(struct ring_buffer *rb, void (*write)(const void *, size_t)) {
55
-    if (rb_len(rb) == 0) {
56
+void rb_dump(struct ring_buffer *rb, void (*write)(const void *, size_t), size_t skip) {
57
+    if (rb_len(rb) <= skip) {
56
         return;
58
         return;
57
     }
59
     }
58
 
60
 
59
     if (rb->head > rb->tail) {
61
     if (rb->head > rb->tail) {
60
-        write(rb->buffer + rb->tail * rb->el_len, rb->head - rb->tail);
62
+        if ((rb->head - rb->tail) > skip) {
63
+            write(rb->buffer + ((rb->tail + skip) * rb->el_len), rb->head - rb->tail - skip);
64
+        }
61
     } else {
65
     } else {
62
-        write(rb->buffer + rb->tail * rb->el_len, rb->size - rb->tail);
63
-        write(rb->buffer, rb->head);
66
+        if ((rb->size - rb->tail) > skip) {
67
+            write(rb->buffer + ((rb->tail + skip) * rb->el_len), rb->size - rb->tail - skip);
68
+        }
69
+
70
+        skip -= MIN(skip, rb->size - rb->tail);
71
+        if (rb->head > skip) {
72
+            write(rb->buffer + (skip + rb->el_len), rb->head - skip);
73
+        }
64
     }
74
     }
65
 }
75
 }
66
 
76
 
67
 void rb_move(struct ring_buffer *rb, void (*write)(const void *, size_t)) {
77
 void rb_move(struct ring_buffer *rb, void (*write)(const void *, size_t)) {
68
-    rb_dump(rb, write);
78
+    rb_dump(rb, write, 0);
69
     rb->head = 0;
79
     rb->head = 0;
70
     rb->tail = 0;
80
     rb->tail = 0;
71
     rb->full = false;
81
     rb->full = false;

+ 4
- 0
src/wifi.c Ver fichero

112
     return (state != WS_IDLE);
112
     return (state != WS_IDLE);
113
 }
113
 }
114
 
114
 
115
+bool wifi_ready(void) {
116
+    return (state == WS_READY);
117
+}
118
+
115
 const char *wifi_state(void) {
119
 const char *wifi_state(void) {
116
     switch (state) {
120
     switch (state) {
117
     case WS_IDLE:
121
     case WS_IDLE:

Loading…
Cancelar
Guardar