mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-25 17:25:18 +03:00
Merge pull request #2274 from fiam/mspv2_settings
Add support for getting and setting arbitrary settings via MSPv2
This commit is contained in:
commit
773636ad2d
7 changed files with 237 additions and 11 deletions
|
@ -54,6 +54,7 @@
|
|||
#include "fc/rc_controls.h"
|
||||
#include "fc/rc_modes.h"
|
||||
#include "fc/runtime_config.h"
|
||||
#include "fc/settings.h"
|
||||
|
||||
#include "flight/failsafe.h"
|
||||
#include "flight/imu.h"
|
||||
|
@ -1976,6 +1977,130 @@ static mspResult_e mspFcProcessInCommand(uint16_t cmdMSP, sbuf_t *src)
|
|||
return MSP_RESULT_ACK;
|
||||
}
|
||||
|
||||
static const setting_t *mspReadSettingName(sbuf_t *src)
|
||||
{
|
||||
char name[SETTING_MAX_NAME_LENGTH];
|
||||
uint8_t c;
|
||||
size_t s = 0;
|
||||
while (1) {
|
||||
if (!sbufReadU8Safe(&c, src)) {
|
||||
return NULL;
|
||||
}
|
||||
name[s++] = c;
|
||||
if (c == '\0') {
|
||||
break;
|
||||
}
|
||||
if (s == SETTING_MAX_NAME_LENGTH) {
|
||||
// Name is too long
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return setting_find(name);
|
||||
}
|
||||
|
||||
static bool mspSettingCommand(sbuf_t *dst, sbuf_t *src)
|
||||
{
|
||||
const setting_t *setting = mspReadSettingName(src);
|
||||
if (!setting) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const void *ptr = setting_get_value_pointer(setting);
|
||||
size_t size = setting_get_value_size(setting);
|
||||
sbufWriteDataSafe(dst, ptr, size);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool mspSetSettingCommand(sbuf_t *dst, sbuf_t *src)
|
||||
{
|
||||
UNUSED(dst);
|
||||
|
||||
const setting_t *setting = mspReadSettingName(src);
|
||||
if (!setting) {
|
||||
return false;
|
||||
}
|
||||
|
||||
setting_min_t min = setting_get_min(setting);
|
||||
setting_max_t max = setting_get_max(setting);
|
||||
|
||||
void *ptr = setting_get_value_pointer(setting);
|
||||
switch (SETTING_TYPE(setting)) {
|
||||
case VAR_UINT8:
|
||||
{
|
||||
uint8_t val;
|
||||
if (!sbufReadU8Safe(&val, src)) {
|
||||
return false;
|
||||
}
|
||||
if (val > max) {
|
||||
return false;
|
||||
}
|
||||
*((uint8_t*)ptr) = val;
|
||||
}
|
||||
break;
|
||||
case VAR_INT8:
|
||||
{
|
||||
int8_t val;
|
||||
if (!sbufReadI8Safe(&val, src)) {
|
||||
return false;
|
||||
}
|
||||
if (val < min || val > (int8_t)max) {
|
||||
return false;
|
||||
}
|
||||
*((int8_t*)ptr) = val;
|
||||
}
|
||||
break;
|
||||
case VAR_UINT16:
|
||||
{
|
||||
uint16_t val;
|
||||
if (!sbufReadU16Safe(&val, src)) {
|
||||
return false;
|
||||
}
|
||||
if (val > max) {
|
||||
return false;
|
||||
}
|
||||
*((uint16_t*)ptr) = val;
|
||||
}
|
||||
break;
|
||||
case VAR_INT16:
|
||||
{
|
||||
int16_t val;
|
||||
if (!sbufReadI16Safe(&val, src)) {
|
||||
return false;
|
||||
}
|
||||
if (val < min || val > (int16_t)max) {
|
||||
return false;
|
||||
}
|
||||
*((int16_t*)ptr) = val;
|
||||
}
|
||||
break;
|
||||
case VAR_UINT32:
|
||||
{
|
||||
uint32_t val;
|
||||
if (!sbufReadU32Safe(&val, src)) {
|
||||
return false;
|
||||
}
|
||||
if (val > max) {
|
||||
return false;
|
||||
}
|
||||
*((uint32_t*)ptr) = val;
|
||||
}
|
||||
break;
|
||||
case VAR_FLOAT:
|
||||
{
|
||||
float val;
|
||||
if (!sbufReadDataSafe(src, &val, sizeof(float))) {
|
||||
return false;
|
||||
}
|
||||
if (val < (float)min || val > (float)max) {
|
||||
return false;
|
||||
}
|
||||
*((float*)ptr) = val;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
* Returns MSP_RESULT_ACK, MSP_RESULT_ERROR or MSP_RESULT_NO_REPLY
|
||||
*/
|
||||
|
@ -2005,6 +2130,10 @@ mspResult_e mspFcProcessCommand(mspPacket_t *cmd, mspPacket_t *reply, mspPostPro
|
|||
mspFcDataFlashReadCommand(dst, src);
|
||||
ret = MSP_RESULT_ACK;
|
||||
#endif
|
||||
} else if (cmdMSP == MSP2_COMMON_SETTING) {
|
||||
ret = mspSettingCommand(dst, src) ? MSP_RESULT_ACK : MSP_RESULT_ERROR;
|
||||
} else if (cmdMSP == MSP2_COMMON_SET_SETTING) {
|
||||
ret = mspSetSettingCommand(dst, src) ? MSP_RESULT_ACK : MSP_RESULT_ERROR;
|
||||
} else {
|
||||
ret = mspFcProcessInCommand(cmdMSP, src);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue