int arctechDimCreateCode(JsonNode *code) { int id = -1; int unit = -1; int state = -1; int all = 0; int dimlevel = -1; char *tmp; if(json_find_string(code, "id", &tmp) == 0) id=atoi(tmp); if(json_find_string(code, "off", &tmp) == 0) state=0; else if(json_find_string(code, "on", &tmp) == 0) state=1; if(json_find_string(code, "unit", &tmp) == 0) unit = atoi(tmp); if(json_find_string(code, "dimlevel", &tmp) == 0) dimlevel = atoi(tmp); if(json_find_string(code, "all", &tmp) == 0) all = 1; if(id == -1 || (unit == -1 && all == 0) || (dimlevel == -1 && state == -1)) { logprintf(LOG_ERR, "arctech_dimmer: insufficient number of arguments"); return EXIT_FAILURE; } else if(id > 67108863 || id < 1) { logprintf(LOG_ERR, "arctech_dimmer: invalid id range"); return EXIT_FAILURE; } else if((unit > 15 || unit < 0) && all == 0) { logprintf(LOG_ERR, "arctech_dimmer: invalid unit range"); return EXIT_FAILURE; } else if(state == -1 && (dimlevel > 16 || dimlevel < 0)) { logprintf(LOG_ERR, "arctech_dimmer: invalid dimlevel range"); return EXIT_FAILURE; } else if(dimlevel >= 0 && state == 0) { logprintf(LOG_ERR, "arctech_dimmer: dimlevel and state cannot be combined"); return EXIT_FAILURE; } else { if(unit == -1 && all == 1) { unit = 0; } if(dimlevel >= 0) { state = -1; } arctechDimCreateMessage(id, unit, state, all, dimlevel); arctechDimCreateStart(); arctechDimClearCode(); arctechDimCreateId(id); arctechDimCreateAll(all); arctechDimCreateState(state); arctechDimCreateUnit(unit); if(dimlevel > -1) { arctechDimCreateDimlevel(dimlevel); } arctechDimCreateFooter(); } return EXIT_SUCCESS; }
void arctechDimParseBinary(void) { int dimlevel = binToDecRev(arctech_dimmer->binary, 32, 35); int unit = binToDecRev(arctech_dimmer->binary, 28, 31); int state = arctech_dimmer->binary[27]; int all = arctech_dimmer->binary[26]; int id = binToDecRev(arctech_dimmer->binary, 0, 25); arctechDimCreateMessage(id, unit, state, all, dimlevel); }