コード例 #1
0
ファイル: jo.c プロジェクト: imjerrybao/jo
int json_copy_to_object(JsonNode * obj, JsonNode * object_or_array, int clobber)
{
	JsonNode *node;

	if (obj->tag != JSON_OBJECT && obj->tag != JSON_ARRAY)
		return (FALSE);

	json_foreach(node, object_or_array) {
		if (!clobber & (json_find_member(obj, node->key) != NULL))
			continue;	/* Don't clobber existing keys */
		if (obj->tag == JSON_OBJECT) {
			if (node->tag == JSON_STRING)
				json_append_member(obj, node->key, json_mkstring(node->string_));
			else if (node->tag == JSON_NUMBER)
				json_append_member(obj, node->key, json_mknumber(node->number_));
			else if (node->tag == JSON_BOOL)
				json_append_member(obj, node->key, json_mkbool(node->bool_));
			else if (node->tag == JSON_NULL)
				json_append_member(obj, node->key, json_mknull());
			else
				fprintf(stderr, "PANIC: unhandled JSON type %d\n", node->tag);
		} else if (obj->tag == JSON_ARRAY) {
			if (node->tag == JSON_STRING)
				json_append_element(obj, json_mkstring(node->string_));
			if (node->tag == JSON_NUMBER)
				json_append_element(obj, json_mknumber(node->number_));
			if (node->tag == JSON_BOOL)
				json_append_element(obj, json_mkbool(node->bool_));
			if (node->tag == JSON_NULL)
				json_append_element(obj, json_mknull());
		}
	}
	return (TRUE);
}
コード例 #2
0
ファイル: events.c プロジェクト: Johan-M/pilight
void *events_clientize(void *param) {
	logprintf(LOG_STACK, "%s(...)", __FUNCTION__);

	unsigned int failures = 0;
	while(loop && failures <= 5) {
		struct ssdp_list_t *ssdp_list = NULL;
		int standalone = 0;
		settings_find_number("standalone", &standalone);
		if(ssdp_seek(&ssdp_list) == -1 || standalone == 1) {
			logprintf(LOG_DEBUG, "no pilight ssdp connections found");
			char server[16] = "127.0.0.1";
			if((sockfd = socket_connect(server, (unsigned short)socket_get_port())) == -1) {
				logprintf(LOG_DEBUG, "could not connect to pilight-daemon");
				failures++;
				continue;
			}
		} else {
			if((sockfd = socket_connect(ssdp_list->ip, ssdp_list->port)) == -1) {
				logprintf(LOG_DEBUG, "could not connect to pilight-daemon");
				failures++;
				continue;
			}
		}
		if(ssdp_list) {
			ssdp_free(ssdp_list);
		}

		struct JsonNode *jclient = json_mkobject();
		struct JsonNode *joptions = json_mkobject();
		json_append_member(jclient, "action", json_mkstring("identify"));
		json_append_member(joptions, "config", json_mknumber(1, 0));
		json_append_member(jclient, "options", joptions);
		json_append_member(jclient, "media", json_mkstring("all"));
		char *out = json_stringify(jclient, NULL);
		socket_write(sockfd, out);
		json_free(out);
		json_delete(jclient);

		if(socket_read(sockfd, &recvBuff, 0) != 0
			 || strcmp(recvBuff, "{\"status\":\"success\"}") != 0) {
				failures++;
			continue;
		}
		failures = 0;
		while(loop) {
			if(socket_read(sockfd, &recvBuff, 0) != 0) {
				break;
			} else {
				events_queue(recvBuff);
			}
		}
	}

	if(recvBuff) {
		FREE(recvBuff);
		recvBuff = NULL;
	}
	socket_close(sockfd);
	return 0;
}
コード例 #3
0
ファイル: jo.c プロジェクト: imjerrybao/jo
int member_to_object(JsonNode *object, int flags, char *kv)
{
	/* we expect key=value or key:value (boolean on last) */
	char *p = strchr(kv, '=');
	char *q = strchr(kv, '@');

	if (!p && !q) {
		return (-1);
	}


	if (p) {
		*p = 0;

		if (nested(flags, kv, p+1) == TRUE)
			 return (0);
		json_append_member(object, kv, vnode(p+1, flags));
	} else {
		*q = 0;

		if (nested(flags | FLAG_BOOLEAN, kv, q+1) == TRUE)
			 return (0);
		json_append_member(object, kv, boolnode(q+1));
	}
	return (0);
}
コード例 #4
0
static void createMessage(int id, int unit, double temperature, double humidity) {
	ninjablocks_weather->message = json_mkobject();
	json_append_member(ninjablocks_weather->message, "id", json_mknumber(id, 0));
	json_append_member(ninjablocks_weather->message, "unit", json_mknumber(unit, 0));
	json_append_member(ninjablocks_weather->message, "temperature", json_mknumber(temperature/100, 2));
	json_append_member(ninjablocks_weather->message, "humidity", json_mknumber(humidity, 0));
}
コード例 #5
0
ファイル: storage.c プロジェクト: hoalex/recorder
static JsonNode *line_to_location(char *line)
{
	JsonNode *json, *o, *j;
	char *ghash;
	char tstamp[64], *bp;
	double lat, lon;
	long tst;

	snprintf(tstamp, 21, "%s", line);

	if ((bp = strchr(line, '{')) == NULL)
		return (NULL);

	if ((json = json_decode(bp)) == NULL) {
		return (NULL);
	}

	if ((j = json_find_member(json, "_type")) == NULL) {
		json_delete(json);
		return (NULL);
	}
	if (j->tag != JSON_STRING || strcmp(j->string_, "location") != 0) {
		json_delete(json);
		return (NULL);
	}

	o = json_mkobject();

	if (json_copy_to_object(o, json, FALSE) == FALSE) {
		json_delete(o);
		json_delete(json);
		return (NULL);
	}
	json_delete(json);	/* Done with this -- we've copied it. */

	lat = lon = 0.0;
	if ((j = json_find_member(o, "lat")) != NULL) {
		lat = j->number_;
	}
	if ((j = json_find_member(o, "lon")) != NULL) {
		lon = j->number_;
	}

	if ((ghash = geohash_encode(lat, lon, geohash_prec())) != NULL) {
		json_append_member(o, "ghash", json_mkstring(ghash));
		get_geo(o, ghash);
		free(ghash);
	}

	json_append_member(o, "isorcv", json_mkstring(tstamp));

	tst = 0L;
	if ((j = json_find_member(o, "tst")) != NULL) {
		tst = j->number_;
	}
	json_append_member(o, "isotst", json_mkstring(isotime(tst)));

	return (o);
}
コード例 #6
0
ファイル: relay.c プロジェクト: 1000io/pilight
void relayCreateMessage(int gpio, int state) {
	relay->message = json_mkobject();
	json_append_member(relay->message, "gpio", json_mknumber(gpio));
	if(state == 1)
		json_append_member(relay->message, "state", json_mkstring("on"));
	else
		json_append_member(relay->message, "state", json_mkstring("off"));
}
コード例 #7
0
ファイル: arctech_screen_old.c プロジェクト: Lyve1981/pilight
static void createMessage(int id, int unit, int state) {
	arctech_screen_old->message = json_mkobject();
	json_append_member(arctech_screen_old->message, "id", json_mknumber(id, 0));
	json_append_member(arctech_screen_old->message, "unit", json_mknumber(unit, 0));
	if(state == 1)
		json_append_member(arctech_screen_old->message, "state", json_mkstring("up"));
	else
		json_append_member(arctech_screen_old->message, "state", json_mkstring("down"));
}
コード例 #8
0
ファイル: generic_switch.c プロジェクト: 1000io/pilight
void genSwitchCreateMessage(int id, int state) {
	generic_switch->message = json_mkobject();
	json_append_member(generic_switch->message, "id", json_mknumber(id));
	if(state == 1) {
		json_append_member(generic_switch->message, "state", json_mkstring("on"));
	} else {
		json_append_member(generic_switch->message, "state", json_mkstring("off"));
	}
}
コード例 #9
0
ファイル: sartano.c プロジェクト: danygutmann/pilight
void sartanoCreateMessage(int id, int unit, int state) {
	sartano.message = json_mkobject();
	json_append_member(sartano.message, "id", json_mknumber(id));
	json_append_member(sartano.message, "unit", json_mknumber(unit));
	if(state == 1)
		json_append_member(sartano.message, "state", json_mkstring("on"));
	else
		json_append_member(sartano.message, "state", json_mkstring("off"));
}
コード例 #10
0
ファイル: x10.c プロジェクト: Johan-M/pilight
static void x10CreateMessage(char *id, int state) {
	x10->message = json_mkobject();
	json_append_member(x10->message, "id", json_mkstring(id));
	if(state == 0) {
		json_append_member(x10->message, "state", json_mkstring("on"));
	} else {
		json_append_member(x10->message, "state", json_mkstring("off"));
	}
}
コード例 #11
0
ファイル: clarus.c プロジェクト: knudje/pilight
void clarusSwCreateMessage(char *id, int unit, int state) {
	clarus_switch->message = json_mkobject();
	json_append_member(clarus_switch->message, "id", json_mkstring(id));
	json_append_member(clarus_switch->message, "unit", json_mknumber(unit));
	if(state == 2)
		json_append_member(clarus_switch->message, "state", json_mkstring("on"));
	else
		json_append_member(clarus_switch->message, "state", json_mkstring("off"));
}
コード例 #12
0
ファイル: arctech_switch_old.c プロジェクト: Johan-M/pilight
static void arctechSwOldCreateMessage(int id, int unit, int state) {
	arctech_switch_old->message = json_mkobject();
	json_append_member(arctech_switch_old->message, "id", json_mknumber(id, 0));
	json_append_member(arctech_switch_old->message, "unit", json_mknumber(unit, 0));
	if(state == 1)
		json_append_member(arctech_switch_old->message, "state", json_mkstring("on"));
	else
		json_append_member(arctech_switch_old->message, "state", json_mkstring("off"));
}
コード例 #13
0
ファイル: conrad_rsl_contact.c プロジェクト: 1000io/pilight
void conradRSLCnCreateMessage(int id, int state) {
	conrad_rsl_contact->message = json_mkobject();
	json_append_member(conrad_rsl_contact->message, "id", json_mknumber(id));
	if(state == 1) {
		json_append_member(conrad_rsl_contact->message, "state", json_mkstring("opened"));
	} else {
		json_append_member(conrad_rsl_contact->message, "state", json_mkstring("closed"));
	}
}
コード例 #14
0
ファイル: tfa.c プロジェクト: Lyve1981/pilight
static void parseCode(void) {
	int binary[RAW_LENGTH/2];
	int temp1 = 0, temp2 = 0, temp3 = 0;
	int humi1 = 0, humi2 = 0;
	int id = 0, battery = 0;
	int channel = 0;
	int i = 0, x = 0;
	double humi_offset = 0.0, temp_offset = 0.0;
	double temperature = 0.0, humidity = 0.0;

	for(x=1;x<tfa->rawlen-2;x+=2) {
		if(tfa->raw[x] > AVG_PULSE_LENGTH*PULSE_MULTIPLIER) {
			binary[i++] = 1;
		} else {
			binary[i++] = 0;
		}
	}

	id = binToDecRev(binary, 2, 9);
	channel = binToDecRev(binary, 12, 13) + 1;

	temp1 = binToDecRev(binary, 14, 17);
	temp2 = binToDecRev(binary, 18, 21);
	temp3 = binToDecRev(binary, 22, 25);
	                                                     /* Convert F to C */
	temperature = (int)((float)(((((temp3*256) + (temp2*16) + (temp1))*10) - 9000) - 3200) * ((float)5/(float)9));

	humi1 = binToDecRev(binary, 26, 29);
	humi2 = binToDecRev(binary, 30, 33);
	humidity = ((humi1)+(humi2*16));

	if(binToDecRev(binary, 34, 35) > 1) {
		battery = 0;
	} else {
		battery = 1;
	}

	struct settings_t *tmp = settings;
	while(tmp) {
		if(fabs(tmp->id-id) < EPSILON && fabs(tmp->channel-channel) < EPSILON) {
			humi_offset = tmp->humi;
			temp_offset = tmp->temp;
			break;
		}
		tmp = tmp->next;
	}

	temperature += temp_offset;
	humidity += humi_offset;

	tfa->message = json_mkobject();
	json_append_member(tfa->message, "id", json_mknumber(id, 0));
	json_append_member(tfa->message, "temperature", json_mknumber(temperature/100, 2));
	json_append_member(tfa->message, "humidity", json_mknumber(humidity, 2));
	json_append_member(tfa->message, "battery", json_mknumber(battery, 0));
	json_append_member(tfa->message, "channel", json_mknumber(channel, 0));
}
コード例 #15
0
ファイル: selectremote.c プロジェクト: Johan-M/pilight
static void selectremoteCreateMessage(int id, int state) {
	selectremote->message = json_mkobject();
	json_append_member(selectremote->message, "id", json_mknumber(id, 0));
	if(state == 1) {
		json_append_member(selectremote->message, "state", json_mkstring("on"));
	} else {
		json_append_member(selectremote->message, "state", json_mkstring("off"));
	}
}
コード例 #16
0
ファイル: generic_screen.c プロジェクト: Keeward/pilight
static void genScreenCreateMessage(int id, int state) {
	generic_screen->message = json_mkobject();
	json_append_member(generic_screen->message, "id", json_mknumber(id));
	if(state == 1) {
		json_append_member(generic_screen->message, "state", json_mkstring("up"));
	} else {
		json_append_member(generic_screen->message, "state", json_mkstring("down"));
	}
}
コード例 #17
0
ファイル: rev_v3.c プロジェクト: Keeward/pilight
static void rev3CreateMessage(int id, int unit, int state) {
    rev3_switch->message = json_mkobject();
    json_append_member(rev3_switch->message, "id", json_mknumber(id));
    json_append_member(rev3_switch->message, "unit", json_mknumber(unit));
    if(state == 1) {
        json_append_member(rev3_switch->message, "state", json_mkstring("on"));
    } else {
        json_append_member(rev3_switch->message, "state", json_mkstring("off"));
	}
}
コード例 #18
0
ファイル: elro_he.c プロジェクト: Keeward/pilight
static void elroHECreateMessage(int systemcode, int unitcode, int state) {
	elro_he->message = json_mkobject();
	json_append_member(elro_he->message, "systemcode", json_mknumber(systemcode));
	json_append_member(elro_he->message, "unitcode", json_mknumber(unitcode));
	if(state == 0) {
		json_append_member(elro_he->message, "state", json_mkstring("on"));
	} else {
		json_append_member(elro_he->message, "state", json_mkstring("off"));
	}
}
コード例 #19
0
ファイル: pollin.c プロジェクト: Lyve1981/pilight
static void createMessage(int systemcode, int unitcode, int state) {
	pollin->message = json_mkobject();
	json_append_member(pollin->message, "systemcode", json_mknumber(systemcode, 0));
	json_append_member(pollin->message, "unitcode", json_mknumber(unitcode, 0));
	if(state == 0) {
		json_append_member(pollin->message, "state", json_mkstring("on"));
	} else {
		json_append_member(pollin->message, "state", json_mkstring("off"));
	}
}
コード例 #20
0
void genWeatherCreateMessage(int id, int temperature, int humidity) {
	generic_weather->message = json_mkobject();
	json_append_member(generic_weather->message, "id", json_mknumber(id));
	if(temperature > -999) {
		json_append_member(generic_weather->message, "temperature", json_mknumber(temperature));
	}
	if(humidity > -999) {
		json_append_member(generic_weather->message, "humidity", json_mknumber(humidity));
	}
}
コード例 #21
0
ファイル: rsl366.c プロジェクト: Lyve1981/pilight
static void createMessage(int systemcode, int programcode, int state) {
	rsl366->message = json_mkobject();
	json_append_member(rsl366->message, "systemcode", json_mknumber(systemcode, 0));
	json_append_member(rsl366->message, "programcode", json_mknumber(programcode, 0));
	if(state == 1) {
		json_append_member(rsl366->message, "state", json_mkstring("on"));
	} else {
		json_append_member(rsl366->message, "state", json_mkstring("off"));
	}
}
コード例 #22
0
ファイル: impuls.c プロジェクト: lucianmanzat/pilight
void impulsCreateMessage(int systemcode, int programcode, int state) {
	impuls->message = json_mkobject();
	json_append_member(impuls->message, "systemcode", json_mknumber(systemcode));
	json_append_member(impuls->message, "programcode", json_mknumber(programcode));
	if(state == 1) {
		json_append_member(impuls->message, "state", json_mkstring("on"));
	} else {
		json_append_member(impuls->message, "state", json_mkstring("off"));
	}
}
コード例 #23
0
void arctechSwCreateMessage(int id, int unit, int state, int all) {
	arctech_switch.message = json_mkobject();
	json_append_member(arctech_switch.message, "id", json_mknumber(id));
	json_append_member(arctech_switch.message, "unit", json_mknumber(unit));
	if(all == 1)
		json_append_member(arctech_switch.message, "all", json_mknumber(all));
	if(state == 1)
		json_append_member(arctech_switch.message, "state", json_mkstring("on"));
	else
		json_append_member(arctech_switch.message, "state", json_mkstring("off"));
}
コード例 #24
0
ファイル: daycom.c プロジェクト: Lyve1981/pilight
static void createMessage(int id, int systemcode, int unit, int state) {
	daycom->message = json_mkobject();
	json_append_member(daycom->message, "id", json_mknumber(id, 0));
	json_append_member(daycom->message, "systemcode", json_mknumber(systemcode, 0));
	json_append_member(daycom->message, "unit", json_mknumber(unit, 0));
	if(state == 0) {
		json_append_member(daycom->message, "state", json_mkstring("on"));
	} else {
		json_append_member(daycom->message, "state", json_mkstring("off"));
	}
}
コード例 #25
0
ファイル: jo.c プロジェクト: imjerrybao/jo
int nested(int flags, char *key, char *value)
{
	char *member = NULL, *bo, *bc;		/* bracket open, close */
	JsonNode *op;
	int found = FALSE;

	/* Check for geo[] or geo[lat] */
	if ((bo = strchr(key, '[')) != NULL) {
		if (*(bo+1) == ']') {
			*bo = 0;
		} else if ((bc = strchr(bo + 1, ']')) == NULL) {
			fprintf(stderr, "missing closing bracket on %s\n", key);
			return (-1);
		} else {
			*bo = *bc = 0;
			member = bo + 1;
		}

		/*
		 * key is now `geo' for both `geo[]` and `geo[lat]`
		 * member is null for the former and "lat" for the latter.
		 * Find an existing object in the pile for this member name
		 * or create a new one if we don't have it.
		 */

		if ((op = json_find_member(pile, key)) != NULL) {
			found = TRUE;
		} else {
			op = (member == NULL) ? json_mkarray() : json_mkobject();
		}

		if (member == NULL) {		/* we're doing an array */
			if (flags & FLAG_BOOLEAN) {
				json_append_element(op, boolnode(value));
			} else {
				json_append_element(op, vnode(value, flags));
			}
		} else {			/* we're doing an object */
			if (flags & FLAG_BOOLEAN) {
				json_append_member(op, member, boolnode(value));
			} else {
				json_append_member(op, member, vnode(value, flags));
			}
		}

		if (!found) {
			json_append_member(pile, key, op);
		}

		return (TRUE);
	}
	return (FALSE);
}
コード例 #26
0
ファイル: cleverwatts.c プロジェクト: Keeward/pilight
static void cleverwattsCreateMessage(int id, int unit, int state, int all) {
	cleverwatts->message = json_mkobject();
	json_append_member(cleverwatts->message, "id", json_mknumber(id));
	if(all == 0) {
		json_append_member(cleverwatts->message, "all", json_mknumber(1));
	} else {
		json_append_member(cleverwatts->message, "unit", json_mknumber(unit));
	}
	if(state == 0)
		json_append_member(cleverwatts->message, "state", json_mkstring("on"));
	else
		json_append_member(cleverwatts->message, "state", json_mkstring("off"));
}
コード例 #27
0
ファイル: registry.c プロジェクト: Lyve1981/pilight
static int registry_set_value_recursive(struct JsonNode *root, const char *key, void *value, int decimals, int type) {
	logprintf(LOG_STACK, "%s(...)", __FUNCTION__);

	char *sub = strstr(key, ".");
	char *buff = MALLOC(strlen(key)+1);
	strcpy(buff, key);
	if(sub != NULL) {
		int pos = sub-key;
		buff[pos] = '\0';
	}
	struct JsonNode *member = json_find_member(root, buff);
	if(member != NULL) {
		if(member->tag == type) {
			if(type == JSON_NUMBER) {
				member->number_ = *(double *)value;
				member->decimals_ = decimals;
			} else if(type == JSON_STRING) {
				member->string_ = REALLOC(member->string_, strlen(value)+1);
				strcpy(member->string_, (char *)value);
			}
			FREE(buff);
			return 0;
		} else if(member->tag == JSON_OBJECT) {
			if(sub != NULL) {
				int pos = sub-key;
				strcpy(buff, &key[pos+1]);
			}
			int ret = registry_set_value_recursive(member, buff, value, decimals, type);
			FREE(buff);
			return ret;
		}
	} else if(sub != NULL) {
		member = json_mkobject();
		json_append_member(root, buff, member);
		int pos = sub-key;
		strcpy(buff, &key[pos+1]);
		int ret = registry_set_value_recursive(member, buff, value, decimals, type);
		FREE(buff);
		return ret;
	} else {
		if(type == JSON_NUMBER) {
			json_append_member(root, buff, json_mknumber(*(double *)value, decimals));
		} else if(type == JSON_STRING) {
			json_append_member(root, buff, json_mkstring(value));
		}
		FREE(buff);
		return 0;
	}
	FREE(buff);
	return -1;
}
コード例 #28
0
ファイル: home_easy_old.c プロジェクト: 1000io/pilight
void homeEasyOldCreateMessage(int systemcode, int unitcode, int state, int all) {
	home_easy_old->message = json_mkobject();
	json_append_member(home_easy_old->message, "systemcode", json_mknumber(systemcode));
	if(all == 1) {
		json_append_member(home_easy_old->message, "all", json_mknumber(all));
	} else {
		json_append_member(home_easy_old->message, "unitcode", json_mknumber(unitcode));
	}
	if(state == 0) {
		json_append_member(home_easy_old->message, "state", json_mkstring("on"));
	} else {
		json_append_member(home_easy_old->message, "state", json_mkstring("off"));
	}
}
コード例 #29
0
ファイル: rc101.c プロジェクト: Johan-M/pilight
static void rc101CreateMessage(int id, int state, int unit, int all) {
	rc101->message = json_mkobject();
	json_append_member(rc101->message, "id", json_mknumber(id, 0));
	if(all == 1) {
		json_append_member(rc101->message, "all", json_mknumber(1, 0));
	} else {
		json_append_member(rc101->message, "unit", json_mknumber(unit, 0));
	}
	if(state == 1) {
		json_append_member(rc101->message, "state", json_mkstring("on"));
	} else {
		json_append_member(rc101->message, "state", json_mkstring("off"));
	}
}
コード例 #30
0
ファイル: arctech_contact.c プロジェクト: knudje/pilight
void arctechContactCreateMessage(int id, int unit, int state, int all) {
  arctech_contact->message = json_mkobject();
  json_append_member(arctech_contact->message, "id", json_mknumber(id));
  if(all == 1) {
          json_append_member(arctech_contact->message, "all", json_mknumber(all));
  } else {
          json_append_member(arctech_contact->message, "unit", json_mknumber(unit));
  }

  if(state == 1) {
          json_append_member(arctech_contact->message, "state", json_mkstring("opened"));
  } else {
          json_append_member(arctech_contact->message, "state", json_mkstring("closed"));
  }
}