Skip to content

Commit b00e106

Browse files
implementing kvstore for unor4
1 parent 633122c commit b00e106

File tree

2 files changed

+252
-0
lines changed

2 files changed

+252
-0
lines changed

src/kvstore/implementation/UnoR4.cpp

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
/*
2+
* This file is part of Arduino_KVStore.
3+
*
4+
* Copyright (c) 2024 Arduino SA
5+
*
6+
* This Source Code Form is subject to the terms of the Mozilla Public
7+
* License, v. 2.0. If a copy of the MPL was not distributed with this
8+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
9+
*/
10+
11+
#if defined(ARDUINO_UNOR4_WIFI)
12+
#include "UnoR4.h"
13+
14+
bool Unor4KVStore::begin(const char* name, bool readOnly, const char* partitionLabel) {
15+
this->name = name;
16+
string res = "";
17+
18+
modem.begin();
19+
if (this->name != nullptr && strlen(this->name) > 0) {
20+
if (modem.write(string(PROMPT(_PREF_BEGIN)), res, "%s%s,%d,%s\r\n", CMD_WRITE(_PREF_BEGIN), name, readOnly, partitionLabel != NULL ? partitionLabel : "")) {
21+
return (atoi(res.c_str()) != 0) ? true : false;
22+
}
23+
}
24+
return false;
25+
}
26+
27+
bool Unor4KVStore::begin() {
28+
return begin(DEFAULT_KVSTORE_NAME);
29+
}
30+
31+
bool Unor4KVStore::end() {
32+
string res = "";
33+
modem.write(string(PROMPT(_PREF_END)), res, "%s", CMD(_PREF_END));
34+
}
35+
36+
bool Unor4KVStore::clear() {
37+
string res = "";
38+
if (modem.write(string(PROMPT(_PREF_CLEAR)), res, "%s", CMD(_PREF_CLEAR))) {
39+
return (atoi(res.c_str()) != 0) ? true : false;
40+
}
41+
return false;
42+
}
43+
44+
typename KVStoreInterface::res_t Unor4KVStore::remove(const key_t& key) {
45+
string res = "";
46+
if (key != nullptr && strlen(key) > 0) {
47+
if (modem.write(string(PROMPT(_PREF_REMOVE)), res, "%s%s\r\n", CMD_WRITE(_PREF_REMOVE), key)) {
48+
return (atoi(res.c_str()) != 0) ? true : false;
49+
}
50+
}
51+
return false;
52+
}
53+
54+
typename KVStoreInterface::res_t Unor4KVStore::putBytes(const key_t& key, const uint8_t value[], size_t len) {
55+
string res = "";
56+
if ( key != nullptr && strlen(key) > 0 && value != nullptr && len > 0) {
57+
modem.write_nowait(string(PROMPT(_PREF_PUT)), res, "%s%s,%d,%d\r\n", CMD_WRITE(_PREF_PUT), key, PT_BLOB, len);
58+
if(modem.passthrough((uint8_t *)value, len)) {
59+
return len;
60+
}
61+
}
62+
return 0;
63+
}
64+
65+
typename KVStoreInterface::res_t Unor4KVStore::getBytes(const key_t& key, uint8_t buf[], size_t maxLen) const {
66+
size_t len = getBytesLength(key);
67+
string res = "";
68+
if (key != nullptr && strlen(key) > 0 && buf != nullptr && len > 0) {
69+
modem.read_using_size();
70+
if (modem.write(string(PROMPT(_PREF_GET)), res, "%s%s,%d\r\n", CMD_WRITE(_PREF_GET), key, PT_BLOB)) {
71+
if (res.size() >= len && len <= maxLen) {
72+
memcpy(buf, (uint8_t*)&res[0], len);
73+
return len;
74+
}
75+
}
76+
}
77+
return 0;
78+
}
79+
80+
size_t Unor4KVStore::getBytesLength(const key_t& key) const {
81+
string res = "";
82+
if (key != nullptr && strlen(key) > 0) {
83+
if (modem.write(string(PROMPT(_PREF_LEN)), res, "%s%s\r\n", CMD_WRITE(_PREF_LEN), key)) {
84+
return atoi(res.c_str());
85+
}
86+
}
87+
return 0;
88+
}
89+
90+
91+
bool Unor4KVStore::exists(const key_t& key) const {
92+
string res = "";
93+
if (key != nullptr && strlen(key) > 0) {
94+
if (modem.write(string(PROMPT(_PREF_TYPE)), res, "%s%s\r\n", CMD_WRITE(_PREF_TYPE), key)) {
95+
return static_cast<Type>(atoi(res.c_str())) != PT_INVALID;
96+
}
97+
}
98+
return false;
99+
}
100+
101+
typename KVStoreInterface::res_t Unor4KVStore::_put(
102+
const key_t& key, const uint8_t value[], size_t len, KVStoreInterface::Type t) {
103+
104+
if (key == nullptr || strlen(key) == 0) {
105+
return 0;
106+
}
107+
string res = "";
108+
string format = "%s%s,%d,%hu\r\n";
109+
110+
switch(t) {
111+
case PT_I8: format = "%s%s,%d,%hd\r\n"; break;
112+
case PT_U8: format = "%s%s,%d,%hu\r\n"; break;
113+
case PT_I16: format = "%s%s,%d,%hd\r\n"; break;
114+
case PT_U16: format = "%s%s,%d,%hu\r\n"; break;
115+
case PT_I32: format = "%s%s,%d,%d\r\n"; break;
116+
case PT_U32: format = "%s%s,%d,%u\r\n"; break;
117+
}
118+
119+
uint32_t tmp = 0;
120+
if( t == PT_I8 || t == PT_U8 || t == PT_I16 || t == PT_U16 ||
121+
t == PT_I32 || t == PT_U32) {
122+
memcpy(&tmp, value, len);
123+
}
124+
125+
switch(t) {
126+
case PT_I8:
127+
case PT_U8:
128+
case PT_I16:
129+
case PT_U16:
130+
case PT_I32:
131+
case PT_U32:
132+
// sprintf doesn't support 64 bits on unor4
133+
if (modem.write(string(PROMPT(_PREF_PUT)), res, format.c_str(), CMD_WRITE(_PREF_PUT), key, t, tmp)) {
134+
return atoi(res.c_str());
135+
}
136+
break;
137+
case PT_I64:
138+
case PT_U64:
139+
case PT_FLOAT:
140+
case PT_DOUBLE:
141+
return putBytes(key, value, len);
142+
case PT_STR:
143+
modem.write_nowait(string(PROMPT(_PREF_PUT)), res, "%s%s,%d,%d\r\n", CMD_WRITE(_PREF_PUT), key, t, len);
144+
if(modem.passthrough(value, len)) {
145+
return len;
146+
}
147+
break;
148+
case PT_BLOB:
149+
return putBytes(key, value, len);
150+
break;
151+
case PT_INVALID:
152+
default:
153+
break;
154+
}
155+
156+
return 0;
157+
}
158+
159+
typename KVStoreInterface::res_t Unor4KVStore::_get(const key_t& key, uint8_t value[], size_t len, Type t) {
160+
161+
if (key == nullptr || strlen(key) == 0) {
162+
return 0;
163+
}
164+
string res = "";
165+
string format = "%s%s,%d,%u\r\n";
166+
167+
switch(t) {
168+
case PT_I8: format = "%hd"; break;
169+
case PT_U8: format = "%hu"; break;
170+
case PT_I16: format = "%hd"; break;
171+
case PT_U16: format = "%hu"; break;
172+
case PT_I32: format = "%d"; break;
173+
case PT_U32: format = "%u"; break;
174+
}
175+
176+
switch(t) {
177+
case PT_I8:
178+
case PT_U8:
179+
case PT_I16:
180+
case PT_U16:
181+
case PT_I32:
182+
case PT_U32:
183+
if (modem.write(string(PROMPT(_PREF_GET)), res, "%s%s,%d,%u\r\n", CMD_WRITE(_PREF_GET), key, t)) {
184+
sscanf(res.c_str(), format.c_str(), value);
185+
186+
return len;
187+
}
188+
break;
189+
case PT_I64:
190+
case PT_U64:
191+
case PT_FLOAT:
192+
case PT_DOUBLE:
193+
return getBytes(key, value, len);
194+
case PT_STR:
195+
return getString(key, (char*)value, len);
196+
break;
197+
case PT_BLOB:
198+
return getBytes(key, value, len);
199+
break;
200+
case PT_INVALID:
201+
default:
202+
break;
203+
}
204+
return 0;
205+
}
206+
207+
size_t Unor4KVStore::getString(const key_t& key, char value[], size_t maxLen) {
208+
string res;
209+
if (key != nullptr && strlen(key) > 0) {
210+
modem.read_using_size();
211+
if (modem.write(string(PROMPT(_PREF_GET)), res, "%s%s,%d,%s\r\n", CMD_WRITE(_PREF_GET), key, PT_STR, res)) {
212+
res.push_back('\0');
213+
214+
if(res.length() > maxLen-1) {
215+
return 0;
216+
}
217+
218+
strcpy(value, res.c_str());
219+
return res.length();
220+
}
221+
}
222+
return 0;
223+
}
224+
225+
String Unor4KVStore::getString(const key_t& key, const String defaultValue) {
226+
string res = defaultValue.c_str();;
227+
if (key != nullptr && strlen(key) > 0) {
228+
modem.read_using_size();
229+
if (modem.write(string(PROMPT(_PREF_GET)), res, "%s%s,%d,%s\r\n", CMD_WRITE(_PREF_GET), key, PT_STR, defaultValue.c_str())) {
230+
231+
return String(res.c_str());
232+
}
233+
}
234+
return String(res.c_str());
235+
}
236+
237+
#endif // defined(ARDUINO_UNOR4_WIFI)

src/kvstore/implementation/UnoR4.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "../kvstore.h"
2+
3+
class Unor4KVStore: public KVStoreInterface {
4+
public:
5+
void begin();
6+
void end();
7+
void clear();
8+
9+
typename KVStoreInterface<Key>::res_t remove(const Key& key) override;
10+
bool exists(const Key& key) const override;
11+
typename KVStoreInterface<Key>::res_t putBytes(const Key& key, uint8_t b[], size_t s) override;
12+
typename KVStoreInterface<Key>::res_t getBytes(const Key& key, uint8_t b[], size_t s) const override;
13+
size_t getBytesLength(Key key) const override;
14+
15+
}

0 commit comments

Comments
 (0)