@@ -23,6 +23,9 @@ void CAtHandler::add_cmds_preferences() {
23
23
bool readOnly = strtol (parser.args [1 ].c_str (), NULL , 10 ) != 0 ;
24
24
auto &partition = parser.args [2 ];
25
25
26
+ // calling end before begin, because the renesas mcu may have been restarted
27
+ pref.end ();
28
+
26
29
String error = String ();
27
30
if (partition.empty ()) {
28
31
error = String (pref.begin (name.c_str (), readOnly)) + " \r\n " ;
@@ -165,8 +168,20 @@ void CAtHandler::add_cmds_preferences() {
165
168
}
166
169
break ;
167
170
case PreferenceType::PT_STR: {
168
- auto value = parser.args [2 ];
169
- error = String (pref.putString (key.c_str (), value.c_str ())) + " \r\n " ;
171
+ int value = atoi (parser.args [2 ].c_str ());
172
+ pref_buf = srv.inhibit_read (value);
173
+ size_t offset = pref_buf.size ();
174
+ if (offset < value) {
175
+ pref_buf.resize (value);
176
+ do {
177
+ offset += serial->read (pref_buf.data () + offset, value - offset);
178
+ } while (offset < value);
179
+ }
180
+
181
+ pref_buf.push_back (' \0 ' );
182
+
183
+ srv.continue_read ();
184
+ error = String (pref.putString (key.c_str (), (char *)pref_buf.data ())) + " \r\n " ;
170
185
}
171
186
break ;
172
187
case PreferenceType::PT_BLOB: {
@@ -200,6 +215,33 @@ void CAtHandler::add_cmds_preferences() {
200
215
}
201
216
};
202
217
218
+ /* ....................................................................... */
219
+ command_table[_PREF_TYPE] = [this ](auto & srv, auto & parser) {
220
+ /* ....................................................................... */
221
+ switch (parser.cmd_mode ) {
222
+ case chAT::CommandMode::Write: {
223
+ if (parser.args .size () != 1 ) {
224
+ return chAT::CommandStatus::ERROR;
225
+ }
226
+
227
+ auto &key = parser.args [0 ];
228
+ if (key.empty ()) {
229
+ return chAT::CommandStatus::ERROR;
230
+ }
231
+
232
+ String error = String (pref.getType (key.c_str ())) + " \r\n " ;
233
+
234
+ srv.write_response_prompt ();
235
+ srv.write_str ((const char *)(error.c_str ()));
236
+ srv.write_line_end ();
237
+ return chAT::CommandStatus::OK;
238
+
239
+ }
240
+ default :
241
+ return chAT::CommandStatus::ERROR;
242
+ }
243
+ };
244
+
203
245
/* ....................................................................... */
204
246
command_table[_PREF_GET] = [this ](auto & srv, auto & parser) {
205
247
/* ....................................................................... */
@@ -267,7 +309,13 @@ void CAtHandler::add_cmds_preferences() {
267
309
break ;
268
310
case PreferenceType::PT_STR: {
269
311
auto value = parser.args [2 ];
270
- error = String (pref.getString (key.c_str (), value.c_str ())) + " \r\n " ;
312
+ auto res = pref.getString (key.c_str (), value.c_str ());
313
+
314
+ srv.write_response_prompt ();
315
+ srv.write_str (String (res.length ()).c_str ());
316
+ srv.write_str (" |" );
317
+ srv.write_str (res.c_str ());
318
+ srv.write_line_end ();
271
319
}
272
320
break ;
273
321
case PreferenceType::PT_BLOB: {
@@ -290,7 +338,7 @@ void CAtHandler::add_cmds_preferences() {
290
338
}
291
339
292
340
293
- if (type != PreferenceType::PT_BLOB) {
341
+ if (type != PreferenceType::PT_BLOB && type != PreferenceType::PT_STR ) {
294
342
srv.write_response_prompt ();
295
343
srv.write_str ((const char *)(error.c_str ()));
296
344
srv.write_line_end ();
0 commit comments