28
28
* THE SOFTWARE.
29
29
*/
30
30
31
+ #include <string.h>
32
+
31
33
#include "modbadge.h"
32
34
33
35
#include "py/mperrno.h"
@@ -42,13 +44,28 @@ STATIC mp_obj_t badge_init_() {
42
44
}
43
45
STATIC MP_DEFINE_CONST_FUN_OBJ_0 (badge_init_obj , badge_init_ );
44
46
45
- // NVS
47
+ /*** nvs access ***/
48
+
49
+ /* nvs: strings */
50
+ static void _nvs_check_namespace_key (const char * namespace , const char * key ) {
51
+ if (strlen (namespace ) == 0 || strlen (namespace ) > 15 ) {
52
+ mp_raise_msg (& mp_type_AttributeError , "Invalid namespace" );
53
+ }
54
+ if (strlen (key ) == 0 || strlen (key ) > 15 ) {
55
+ mp_raise_msg (& mp_type_AttributeError , "Invalid key" );
56
+ }
57
+ }
46
58
47
59
STATIC mp_obj_t badge_nvs_get_str_ (mp_uint_t n_args , const mp_obj_t * args ) {
48
- mp_uint_t len ;
49
- const char * namespace = mp_obj_str_get_data (args [0 ], & len );
50
- const char * key = mp_obj_str_get_data (args [1 ], & len );
51
- char value [256 ]; // TODO wut?
60
+ const char * namespace = mp_obj_str_get_str (args [0 ]);
61
+ const char * key = mp_obj_str_get_str (args [1 ]);
62
+ _nvs_check_namespace_key (namespace , key );
63
+
64
+ // current max string length in esp-idf is 1984 bytes, but that
65
+ // would abuse our stack too much. we only allow strings with a
66
+ // max length of 255 chars.
67
+ char value [256 ];
68
+
52
69
size_t length = sizeof (value );
53
70
esp_err_t err = badge_nvs_get_str (namespace , key , value , & length );
54
71
if (err != ESP_OK ) {
@@ -57,71 +74,103 @@ STATIC mp_obj_t badge_nvs_get_str_(mp_uint_t n_args, const mp_obj_t *args) {
57
74
}
58
75
return mp_const_none ;
59
76
}
77
+
60
78
return mp_obj_new_str (value , length - 1 , false);
61
79
}
62
80
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (badge_nvs_get_str_obj , 2 , 3 , badge_nvs_get_str_ );
63
81
64
- STATIC mp_obj_t badge_nvs_set_str_ (mp_obj_t namespace , mp_obj_t key , mp_obj_t value ) {
65
- esp_err_t err = badge_nvs_set_str (mp_obj_str_get_str (namespace ), mp_obj_str_get_str (key ), mp_obj_str_get_str (value ));
66
- if (err != ESP_OK ) {
67
- mp_raise_msg (& mp_type_ValueError , "TODO error things" );
82
+ STATIC mp_obj_t badge_nvs_set_str_ (mp_obj_t _namespace , mp_obj_t _key , mp_obj_t _value ) {
83
+ const char * namespace = mp_obj_str_get_str (_namespace );
84
+ const char * key = mp_obj_str_get_str (_key );
85
+ const char * value = mp_obj_str_get_str (_value );
86
+ _nvs_check_namespace_key (namespace , key );
87
+ if (strlen (value ) > 255 ) {
88
+ mp_raise_msg (& mp_type_AttributeError , "Value string too long" );
68
89
}
69
- return mp_const_none ;
70
- }
71
- STATIC MP_DEFINE_CONST_FUN_OBJ_3 (badge_nvs_set_str_obj , badge_nvs_set_str_ );
72
90
73
- STATIC mp_obj_t badge_nvs_set_u8_ (mp_obj_t namespace , mp_obj_t key , mp_obj_t value ) {
74
- uint8_t u8value = mp_obj_get_int (value );
75
- esp_err_t err = badge_nvs_set_u8 (mp_obj_str_get_str (namespace ), mp_obj_str_get_str (key ), u8value );
91
+ esp_err_t err = badge_nvs_set_str (namespace , key , value );
76
92
if (err != ESP_OK ) {
77
- mp_raise_msg (& mp_type_ValueError , "TODO error things " );
93
+ mp_raise_msg (& mp_type_ValueError , "Failed to store data in nvs " );
78
94
}
95
+
79
96
return mp_const_none ;
80
97
}
81
- STATIC MP_DEFINE_CONST_FUN_OBJ_3 (badge_nvs_set_u8_obj , badge_nvs_set_u8_ );
98
+ STATIC MP_DEFINE_CONST_FUN_OBJ_3 (badge_nvs_set_str_obj , badge_nvs_set_str_ );
82
99
100
+ /* nvs: u8 */
83
101
STATIC mp_obj_t badge_nvs_get_u8_ (mp_uint_t n_args , const mp_obj_t * args ) {
84
- mp_uint_t len ;
85
- const char * namespace = mp_obj_str_get_data (args [0 ], & len );
86
- const char * key = mp_obj_str_get_data (args [1 ], & len );
87
- uint8_t u8value = mp_obj_get_int (args [2 ]);
88
- esp_err_t err = badge_nvs_get_u8 (namespace , key , & u8value );
102
+ const char * namespace = mp_obj_str_get_str (args [0 ]);
103
+ const char * key = mp_obj_str_get_str (args [1 ]);
104
+ _nvs_check_namespace_key (namespace , key );
105
+
106
+ uint8_t value = 0 ;
107
+ esp_err_t err = badge_nvs_get_u8 (namespace , key , & value );
89
108
if (err != ESP_OK ) {
90
109
if (n_args > 2 ) {
91
110
return args [2 ];
92
111
}
93
112
return mp_const_none ;
94
113
}
95
- return mp_obj_new_int (u8value );
114
+
115
+ return mp_obj_new_int (value );
96
116
}
97
117
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (badge_nvs_get_u8_obj , 2 , 3 , badge_nvs_get_u8_ );
98
118
99
- STATIC mp_obj_t badge_nvs_set_u16_ (mp_obj_t namespace , mp_obj_t key , mp_obj_t value ) {
100
- uint16_t u16value = mp_obj_get_int (value );
101
- esp_err_t err = badge_nvs_set_u16 (mp_obj_str_get_str (namespace ), mp_obj_str_get_str (key ), u16value );
119
+ STATIC mp_obj_t badge_nvs_set_u8_ (mp_obj_t _namespace , mp_obj_t _key , mp_obj_t _value ) {
120
+ const char * namespace = mp_obj_str_get_str (_namespace );
121
+ const char * key = mp_obj_str_get_str (_key );
122
+ int value = mp_obj_get_int (_value );
123
+ _nvs_check_namespace_key (namespace , key );
124
+ if (value < 0 || value > 255 ) {
125
+ mp_raise_msg (& mp_type_AttributeError , "Value out of range" );
126
+ }
127
+
128
+ esp_err_t err = badge_nvs_set_u8 (namespace , key , value );
102
129
if (err != ESP_OK ) {
103
- mp_raise_msg (& mp_type_ValueError , "TODO error things " );
130
+ mp_raise_msg (& mp_type_ValueError , "Failed to store data in nvs " );
104
131
}
132
+
105
133
return mp_const_none ;
106
134
}
107
- STATIC MP_DEFINE_CONST_FUN_OBJ_3 (badge_nvs_set_u16_obj , badge_nvs_set_u16_ );
135
+ STATIC MP_DEFINE_CONST_FUN_OBJ_3 (badge_nvs_set_u8_obj , badge_nvs_set_u8_ );
108
136
137
+ /* nvs: u16 */
109
138
STATIC mp_obj_t badge_nvs_get_u16_ (mp_uint_t n_args , const mp_obj_t * args ) {
110
- mp_uint_t len ;
111
- const char * namespace = mp_obj_str_get_data (args [0 ], & len );
112
- const char * key = mp_obj_str_get_data (args [1 ], & len );
113
- uint16_t u16value = mp_obj_get_int (args [2 ]);
114
- esp_err_t err = badge_nvs_get_u16 (namespace , key , & u16value );
139
+ const char * namespace = mp_obj_str_get_str (args [0 ]);
140
+ const char * key = mp_obj_str_get_str (args [1 ]);
141
+ _nvs_check_namespace_key (namespace , key );
142
+
143
+ uint16_t value = 0 ;
144
+ esp_err_t err = badge_nvs_get_u16 (namespace , key , & value );
115
145
if (err != ESP_OK ) {
116
146
if (n_args > 2 ) {
117
147
return args [2 ];
118
148
}
119
149
return mp_const_none ;
120
150
}
121
- return mp_obj_new_int (u16value );
151
+
152
+ return mp_obj_new_int (value );
122
153
}
123
154
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (badge_nvs_get_u16_obj , 2 , 3 , badge_nvs_get_u16_ );
124
155
156
+ STATIC mp_obj_t badge_nvs_set_u16_ (mp_obj_t _namespace , mp_obj_t _key , mp_obj_t _value ) {
157
+ const char * namespace = mp_obj_str_get_str (_namespace );
158
+ const char * key = mp_obj_str_get_str (_key );
159
+ int value = mp_obj_get_int (_value );
160
+ _nvs_check_namespace_key (namespace , key );
161
+ if (value < 0 || value > 65535 ) {
162
+ mp_raise_msg (& mp_type_AttributeError , "Value out of range" );
163
+ }
164
+
165
+ esp_err_t err = badge_nvs_set_u16 (namespace , key , value );
166
+ if (err != ESP_OK ) {
167
+ mp_raise_msg (& mp_type_ValueError , "Failed to store data in nvs" );
168
+ }
169
+
170
+ return mp_const_none ;
171
+ }
172
+ STATIC MP_DEFINE_CONST_FUN_OBJ_3 (badge_nvs_set_u16_obj , badge_nvs_set_u16_ );
173
+
125
174
126
175
// EINK
127
176
0 commit comments