Hallo Jan,
ich hatte das gleich Problem mit int32 Werte im ethersex.
Die Antwort von eku-users hat gewaltig weitergeholfen.
Allerdings war, zumindest für mich, das Anpassen der ecmd.c mühsam.
Vielleicht ja auch für Sie, deshalb
Hier meine ecmd.c:
#include "protocols/ecmd/ecmd-base.h"
parse_cmd_c6_get(char *cmd, char *output, uint16_t len)
{
struct c6_vario_type varvalue;
if (control6_get(cmd, &varvalue)) {
char *ptr;
ptr = output + snprintf_P (output, len, PSTR("%s "), cmd);
len -= (ptr - output);
switch (varvalue.type) {
case C6_TYPE_uint8_t:
ptr += snprintf_P (ptr, len, PSTR("%u"), varvalue.data.d_uint8_t);
break;
case C6_TYPE_int8_t:
ptr += snprintf_P (ptr, len, PSTR("%i"), varvalue.data.d_int8_t);
break;
case C6_TYPE_uint16_t:
ptr += snprintf_P (ptr, len, PSTR("%u"), varvalue.data.d_uint16_t);
break;
case C6_TYPE_int16_t:
ptr += snprintf_P (ptr, len, PSTR("%i"), varvalue.data.d_int16_t);
break;
case C6_TYPE_uint32_t:
ptr += snprintf_P (ptr, len, PSTR("%lu"),
varvalue.data.d_uint32_t);
break;
case C6_TYPE_int32_t:
ptr += snprintf_P (ptr, len, PSTR("%i"), varvalue.data.d_int32_t);
break;
}
return ECMD_FINAL(ptr - output);
}
else
return ECMD_ERR_PARSE_ERROR;
}
parse_cmd_c6_set(char *cmd, char *output, uint16_t len)
{
char *buf;
buf = strrchr (cmd, ' ');
if (!buf)
return ECMD_ERR_PARSE_ERROR;
*(buf ++) = 0;
struct c6_vario_type varvalue;
if (!control6_get(cmd, &varvalue))
return ECMD_ERR_PARSE_ERROR;
if (varvalue.type == C6_TYPE_int8_t || varvalue.type ==
C6_TYPE_int16_t || varvalue.type == C6_TYPE_int32_t) {
/* signed */
int32_t nv = strtol (buf, NULL, 0);
if (varvalue.type == C6_TYPE_int8_t) {
if (nv < INT8_MIN || nv > INT8_MAX)
range_error:
return ECMD_FINAL(snprintf_P(output, len, PSTR("range error.")));
else
varvalue.data.d_int8_t = nv;
}
else
varvalue.data.d_int32_t = nv;
}
else {
/* unsigned */
if (*buf == '-') goto range_error;
/* uint16_t nv = strtoul (buf, NULL, 0);*/
uint32_t nv = strtoul (buf, NULL, 0);
if (varvalue.type == C6_TYPE_uint8_t) {
if (nv > UINT8_MAX)
goto range_error;
else
varvalue.data.d_uint8_t = nv;
}
else
varvalue.data.d_uint32_t = nv;
}
control6_set (cmd, varvalue);
return ECMD_FINAL_OK;
}
zumindest für uint32_t habe ich das ausgetestet, die Schwierigkeit lag
in folgender Zeile:
ptr += snprintf_P (ptr, len, PSTR("%lu"), varvalue.data.d_uint32_t);
hier ist es wichtig, daß nicht %u sonder %lu angegeben wird.
nur dann funktioniert c6+get+... bzw. c6+set... für uint_32 mit Werten
größer 2 hoch 16.
Gruß
--
/Ingolf Schartel/
/E-Mail: ingolf.schar...@t-online.de <mailto:ingolf.schar...@t-online.de>/
//
_______________________________________________
Ethersex-devel mailing list
Ethersex-devel@list.zerties.org
https://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel