Пример #1
0
int ont_videocmd_parse(void *dev, const char*str)
{
	cJSON *json = NULL;
	cJSON *cmd = NULL;
	int cmdid = 0;
	json = cJSON_Parse(str);
	do
	{
		if (cJSON_HasObjectItem(json, "type"))
		{
			if (strcmp(cJSON_GetObjectItem(json, "type")->valuestring, "video"))
			{
				break;
			}
		}
		else
		{
			break;
		}
		if (!cJSON_HasObjectItem(json, "cmdId"))
		{
			break;
		}
		cmdid = cJSON_GetObjectItem(json, "cmdID")->valueint;
		if (!cJSON_HasObjectItem(json, "cmd"))
		{
			break;
		}
		cmd = cJSON_GetObjectItem(json, "cmd");
		switch (cmdid)
		{
		    case 1:
				/*--实时流推送指令--*/
				_ont_videcmd_stream_live_start(dev, cmd);
			    break;
			case 2:
				/*--历史流推送指令--*/
				_ont_videcmd_stream_vodstart(dev, cmd);
				break;
			case 5:
				/*--通知指定的通道生成关键帧指令--*/
				_ont_videcmd_stream_make_keyframe(dev, cmd);
				break;
			case 6:
				/*--码流设置指令--*/
				_ont_videocmd_stream_ctrl(dev, cmd);
				break;
			case 7:
				/*--云台控制指令--*/
				_ont_videcmd_ptz_ctrl(dev, cmd);
				break;
			default:
				break;
		}
		
	} while (0);
	cJSON_Delete(json);
	return 0;
}
Пример #2
0
VOID
KbProfiler_ParseProfileJSON
(
	IN cJSON *json,
	IN PROFILE *profile
)
{
	printf("JSON Parse\n");
	cJSON * keymaps = cJSON_GetObjectItem(json, "keymaps");
	INT keymapCount = cJSON_GetArraySize(keymaps);

	cJSON * bindings = cJSON_GetObjectItem(json, "bindings");
	for (INT a = 0; a < keymapCount; a++) {
		cJSON * keymapBindings = cJSON_GetArrayItem(bindings, a);
		INT bindingsLen = cJSON_GetArraySize(keymapBindings);
		// Parse individual bindings
		for (INT b = 0; b < bindingsLen; b++) {
			cJSON * bind = cJSON_GetArrayItem(keymapBindings, b);
			cJSON * bindCode = cJSON_GetObjectItem(bind, "key");
			char *keyStr = bindCode->valuestring;
			cJSON * originCode = cJSON_GetObjectItem(bind, "origin");
			char *originStr = originCode->valuestring;

			INT bindIndex = KbProfiler_GetBindIndex(KbProfiler_TranslateKeyString(keyStr));
			INT originIndex = KbProfiler_GetBindIndex(KbProfiler_TranslateKeyString(originStr));
			// Parse E0
			if (KbProfiler_IsE0Key(keyStr)) {
				(*profile).keymaps[a].bindings[originIndex].codeE0 = TRUE;
			}
			if (KbProfiler_IsE0Key(originStr)) {
				(*profile).keymaps[a].bindings[originIndex].originE0 = TRUE;
			}

			// Determine whether keymap action
			char keymapTest[7];
			strncpy(keymapTest, keyStr, 6);
			keymapTest[6] = '\0';
			// Parse keymap usage
			if (strcmp(keymapTest, "keymap") == 0 || strcmp(keymapTest, "Keymap") == 0) {
				char keymapTemp[4];
				strncpy(keymapTemp, &keyStr[6], sizeof(keyStr)-6);
				keymapTemp[3] = '\0';
				INT keymapIndex = StringToInt(keymapTemp)-1;
				(*profile).keymaps[a].bindings[originIndex].keymap = keymapIndex;
			}
			else {
				// Parse key code
				(*profile).keymaps[a].bindings[originIndex].code = ScanCodes[bindIndex];
				// Parse shift usage
				cJSON * shift = cJSON_GetObjectItem(bind, "shift");
				if (shift->type == cJSON_String) {
					if (strcmp(shift->valuestring, "1") == 0) {
						(*profile).keymaps[a].bindings[originIndex].shift = TRUE;
					}
				}
				else if (shift->type == cJSON_True) {
					(*profile).keymaps[a].bindings[originIndex].shift = TRUE;
				}
				// Parse ctrl usage
				cJSON * ctrl = cJSON_GetObjectItem(bind, "ctrl");
				if (ctrl->type == cJSON_String) {
					if (strcmp(ctrl->valuestring, "1") == 0) {
						(*profile).keymaps[a].bindings[originIndex].ctrl = TRUE;
					}
				}
				else if (ctrl->type == cJSON_True) {
					(*profile).keymaps[a].bindings[originIndex].ctrl = TRUE;
				}
				// Parse alt usage
				cJSON * alt= cJSON_GetObjectItem(bind, "alt");
				if (alt->type == cJSON_String) {
					if (strcmp(alt->valuestring, "1") == 0) {
						(*profile).keymaps[a].bindings[originIndex].alt = TRUE;
					}
				}
				else if (alt->type == cJSON_True) {
					(*profile).keymaps[a].bindings[originIndex].alt = TRUE;
				}
				// Parse rapid fire
				if (cJSON_HasObjectItem(bind, "rapidfire")) {
					cJSON * rapidfire = cJSON_GetObjectItem(bind, "rapidfire");
					if (rapidfire->type == cJSON_String && strcmp(rapidfire->valuestring, "0") != 0) {
						INT rapidfireValue = StringToInt(rapidfire->valuestring);
						(*profile).keymaps[a].bindings[originIndex].rapidfire = rapidfireValue;
					}
					else if (rapidfire->type == cJSON_Number && rapidfire->valueint != 0) {
						(*profile).keymaps[a].bindings[originIndex].rapidfire = rapidfire->valueint;
					}
				}
				// Parse toggle
				if (cJSON_HasObjectItem(bind, "toggle")) {
					cJSON * toggleJSON = cJSON_GetObjectItem(bind, "toggle");
					if (toggleJSON->type == cJSON_String && strcmp(toggleJSON->valuestring, "0") != 0) {
						(*profile).keymaps[a].bindings[originIndex].toggle = TRUE;
						printf("TOGGLE!\n");
					}
					else if (toggleJSON->type == cJSON_Number && toggleJSON->valueint != 0) {
						(*profile).keymaps[a].bindings[originIndex].toggle = TRUE;
					}
					else if (toggleJSON->type == cJSON_True) {
						(*profile).keymaps[a].bindings[originIndex].toggle = TRUE;
					}
				}
			}
		}
	}
}
Пример #3
0
int http_console_api(http_connection *c)
{
	CGI_CONS_DBG("http_console_api\n");

	//wait for whole body
	if(c->state <HTTPD_STATE_BODY_END)
		return HTTPD_CGI_MORE;

	http_SET_HEADER(c,HTTP_CONTENT_TYPE,JSON_CONTENT_TYPE);
	// http_response_OK(c);

	//parse json and validate
   cJSON * root = cJSON_Parse(c->body.data);
   if(root==NULL) goto badrequest;

	cJSON * first = NULL;
	unsigned i;
	for (i=0; i < CONS_CMDS_CT; i++)
	{
		if (cJSON_HasObjectItem(root, console_json[i]))
		{
			first = cJSON_GetObjectItem(root,console_json[i]);
			break;
		}
	}

	if ((first==NULL) || i == CONS_CMDS_CT) { goto badrequest; }
	if ((first->type != cJSON_String) && (i != cons_start_t) && (i != cons_to_node_t)) { goto badrequest; }

	int tx = 0;
	int btn_val = 99;

	cJSON * cmd_ct = NULL;
	if (i > 0)
	{
		cmd_ct = cJSON_GetObjectItem(root,"ctcnt");
		if (cmd_ct==NULL) { goto badrequest; }
		if (cmd_ct->type != cJSON_Number) { goto badrequest; }
		btn_val = cmd_ct->valueint;
	}

	CGI_CONS_DBG("BTN Value: %d index: %d\n", btn_val, i);

	switch (i)
	{
		case cons_start_t:
		{
			char buff[256];
			if (first->type != cJSON_Number)
				{ goto badrequest; }

			int start = first->valueint;
			int len = 0; // length of text in buff
			int console_len = (console_wr+BUF_MAX-console_rd) % BUF_MAX; // num chars in console_buf

			if (start < console_pos) 							{ start = 0; }
			else if (start >= console_pos+console_len) 	{ start = console_len; }
			else { start = start - console_pos; }
			int rd = (console_rd+start) % BUF_MAX;
			while (len < BUF_MAX && rd != console_wr)
			{
				uint8_t c = console_buf[rd];
				buff[len++] = c;
				rd = (rd + 1) % BUF_MAX;
			}
			buff[len] = '\0'; //null terminate

			cJSON_AddNumberToObject(root,"len",console_len-start);
			cJSON *newSt = cJSON_CreateNumber(console_pos+start);
			cJSON_ReplaceItemInObject(root, "start", newSt);
			cJSON_AddStringToObject(root,"text", (const char *)buff);

			http_write_json(c,root);
			cJSON_Delete(root);
			return HTTPD_CGI_DONE;
		} break;

		case cons_pwr_t:
		{
			sendTxBuff[0] = (uint8_t) (49-btn_val);
         tx = 1;
			NODE_DBG("sendtxbuff[0]==%02x\n", sendTxBuff[0]);
			NODE_DBG("Sending %d bytes to node %d\n",tx, 99);
			generateRfmTxMsg(99, sendTxBuff, tx, false, false);
      } break;

		case cons_to_node_t:
		{
			/* Get requested payload */
			cJSON * dataJson = cJSON_GetObjectItem(root,"data");
		   if(dataJson==NULL) { goto badrequest; }
		   else if (dataJson->type != cJSON_String) { goto badrequest; }
			bool reqAck = false;

			/* Get ack checkbox value */
			cJSON * ackJson = cJSON_GetObjectItem(root,"ack");
			if ((ackJson!=NULL) && (ackJson->type == cJSON_Number))
				{ reqAck = (bool) ackJson->valueint; }

			int len, nodeid;
			len = strlen(dataJson->valuestring);
			NODE_DBG("send len = %d\n", len);
			nodeid = first->valueint;

			if ((len > 0) && (nodeid>0) && (nodeid < 255))
			{
				CGI_CONS_DBG("Sending %s to node %d\n", dataJson->valuestring, nodeid);
				generateRfmTxMsg((uint8_t)nodeid, dataJson->valuestring, len, reqAck, false);
			}

		} break;

		case cons_disp_t:
		{
			rfm_toggle_all_output();
		} break;

	} /* End cons_method_t Switch() */
	http_response_OK(c);
	cJSON_Delete(root);
	return HTTPD_CGI_DONE;

badrequest:
	http_response_BAD_REQUEST(c);
	cJSON_Delete(root);
	return HTTPD_CGI_DONE;

	//shut up compiler
	return HTTPD_CGI_DONE;
}