mirror of
https://github.com/arduino/Arduino.git
synced 2025-03-01 23:29:28 +01:00
Improved Bridge memory usage. Fixed bug affecting buffers with more than 255 bytes
This commit is contained in:
parent
590ead58ad
commit
4c0f864f90
@ -55,10 +55,9 @@ void BridgeClass::begin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t BridgeClass::runCommand(String &command) {
|
uint8_t BridgeClass::runCommand(String &command) {
|
||||||
// TODO: do it in a more efficient way
|
uint8_t cmd[] = {'R'};
|
||||||
String cmd = "R" + command;
|
|
||||||
uint8_t res[1];
|
uint8_t res[1];
|
||||||
transfer((uint8_t*)cmd.c_str(), cmd.length(), res, 1);
|
transfer(cmd, 1, (uint8_t*)command.c_str(), command.length(), res, 1);
|
||||||
return res[0];
|
return res[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,13 +97,8 @@ unsigned int BridgeClass::readCommandOutput(uint8_t handle,
|
|||||||
|
|
||||||
void BridgeClass::writeCommandInput(uint8_t handle,
|
void BridgeClass::writeCommandInput(uint8_t handle,
|
||||||
const uint8_t *buff, unsigned int size) {
|
const uint8_t *buff, unsigned int size) {
|
||||||
// TODO: do it in a more efficient way
|
uint8_t cmd[] = {'I', handle};
|
||||||
uint8_t *tmp = new uint8_t[size+2];
|
transfer(cmd, 2, buff, size, NULL, 0);
|
||||||
tmp[0] = 'I';
|
|
||||||
tmp[1] = handle;
|
|
||||||
memcpy(tmp+2, buff, size);
|
|
||||||
transfer(tmp, size+2);
|
|
||||||
delete[] tmp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int BridgeClass::readMessage(uint8_t *buff, unsigned int size) {
|
unsigned int BridgeClass::readMessage(uint8_t *buff, unsigned int size) {
|
||||||
@ -113,16 +107,12 @@ unsigned int BridgeClass::readMessage(uint8_t *buff, unsigned int size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BridgeClass::writeMessage(const uint8_t *buff, unsigned int size) {
|
void BridgeClass::writeMessage(const uint8_t *buff, unsigned int size) {
|
||||||
// TODO: do it in a more efficient way
|
uint8_t cmd[] = {'M'};
|
||||||
uint8_t *tmp = new uint8_t[size+1];
|
transfer(cmd, 1, buff, size, NULL, 0);
|
||||||
tmp[0] = 'M';
|
|
||||||
memcpy(tmp+1, buff, size);
|
|
||||||
transfer(tmp, size+1);
|
|
||||||
delete[] tmp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int BridgeClass::messageAvailable() {
|
unsigned int BridgeClass::messageAvailable() {
|
||||||
uint8_t tmp[] = { 'n' };
|
uint8_t tmp[] = {'n'};
|
||||||
uint8_t res[2];
|
uint8_t res[2];
|
||||||
transfer(tmp, 1, res, 2);
|
transfer(tmp, 1, res, 2);
|
||||||
return (res[0] << 8) + res[1];
|
return (res[0] << 8) + res[1];
|
||||||
@ -138,15 +128,10 @@ void BridgeClass::put(const char *key, const char *value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int BridgeClass::get(const char *key, uint8_t *value, unsigned int maxlen) {
|
unsigned int BridgeClass::get(const char *key, uint8_t *value, unsigned int maxlen) {
|
||||||
// TODO: do it in a more efficient way
|
uint8_t cmd[] = {'d'};
|
||||||
unsigned int l = strlen(key);
|
unsigned int l = transfer(cmd, 1, (uint8_t *)key, strlen(key), value, maxlen);
|
||||||
uint8_t *tmp = new uint8_t[l+1];
|
if (l < maxlen)
|
||||||
tmp[0] = 'd';
|
|
||||||
memcpy(tmp+1, key, strlen(key));
|
|
||||||
l = transfer(tmp, l+1, value, maxlen);
|
|
||||||
if (l<maxlen)
|
|
||||||
value[l] = 0; // Zero-terminate string
|
value[l] = 0; // Zero-terminate string
|
||||||
delete[] tmp;
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,15 +170,15 @@ uint8_t BridgeClass::transfer(const uint8_t *buff1, uint16_t len1,
|
|||||||
crcUpdate((len >> 8) & 0xFF);
|
crcUpdate((len >> 8) & 0xFF);
|
||||||
write((char)(len & 0xFF)); // Message length (lo)
|
write((char)(len & 0xFF)); // Message length (lo)
|
||||||
crcUpdate(len & 0xFF);
|
crcUpdate(len & 0xFF);
|
||||||
for (uint8_t i=0; i<len1; i++) { // Payload
|
for (uint16_t i=0; i<len1; i++) { // Payload
|
||||||
write((char)buff1[i]);
|
write((char)buff1[i]);
|
||||||
crcUpdate(buff1[i]);
|
crcUpdate(buff1[i]);
|
||||||
}
|
}
|
||||||
for (uint8_t i=0; i<len2; i++) { // Payload
|
for (uint16_t i=0; i<len2; i++) { // Payload
|
||||||
write((char)buff2[i]);
|
write((char)buff2[i]);
|
||||||
crcUpdate(buff2[i]);
|
crcUpdate(buff2[i]);
|
||||||
}
|
}
|
||||||
for (uint8_t i=0; i<len3; i++) { // Payload
|
for (uint16_t i=0; i<len3; i++) { // Payload
|
||||||
write((char)buff3[i]);
|
write((char)buff3[i]);
|
||||||
crcUpdate(buff3[i]);
|
crcUpdate(buff3[i]);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user