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

Antwort per Email an