Пример #1
0
/**
 * [CompCoroutine_s_Task_InitStack description]
 * @param pTask  [description]
 * @param pStack [description]
 * @param iSize  [description]
 * @param pMain  [description]
 * @param pParam [description]
 */
void CompCoroutine_s_Task_InitStack(struct CompCoroutine_s_Task* pTask, void* pStack, unsigned iSize, CompCoroutine_p_Task pMain, void* pParam)
{
	DEBUG_ASSERT_PARAM(NULL != pTask, "null pointer");
	DEBUG_ASSERT_PARAM(iSize > 0, "null pointer");
	DEBUG_ASSERT_PARAM(NULL != pMain, "null pointer");
	DEBUG_CODE(memset(pStack, 0, iSize));
	pTask->_iStack = Context_Init(pStack, iSize, pMain, pParam);
#if (DEBUG)
	pTask->iSetStack = (uintptr_t)pStack;
	pTask->iSetSize  = iSize;
#endif
}
Пример #2
0
//***********************************************************************************
// Funktion:	Der Aufruf erfolgt automatisch, wenn der json-Parameter='{\"...\"}'
//				mit einem String aufgerufen wird. Als Format wird JSON-Syntax erwartet.
//				Folgende JSON-Elemente werden gesucht  und in die Werte in den 
//				entsprechenden Driver-Übergabeparametern abgelegt. 
// 				<JSON>
//				oControl.Command (e_Start,e_Stop Driver)	==> command
//				{
//				oDevices[0-3].oValue.Name 					==> out_name_queue[0-3]
//				oDevices[0-3].oValue.Value					==> output_[0-3]
//				}
//				Anschließend wird ao4_objects_generic() aufgerufen - und die Eingabe-
//				parameter zum Teil kontrolliert. Je nach Wichtigkeit erfolgt eine
//				genaue Überprüfung oder z.B. nur der Längencheck.
//  
//************************************************************************************ 
ssize_t ao4_objects_json(const char  * json) {
	JsonDecode_State D;
	elivator  		ctx;
	ssize_t 		len = strlen(json);
	int 			_ch = 0;
	char  			_buf[JSON_LIMIT_SIZE+1];
	char 			_name[PROPERTY_SIZE+1];
	u16				_out_val;
	DEBUG(MCT_DEBUG_LEVEL2, "%s %s()\n",__FILE__, __FUNCTION__);
	
	if(len == 0 || len > JSON_LIMIT_SIZE+1)	{
		DEBUG(MCT_DEBUG_LEVEL3, "%s %s(): %s\n", __FILE__,__FUNCTION__, "Parameter json with corrupt limit size!");
		return -1;
	}
	
	///------------------
	/// DRIVER
	///------------------
	DEBUG(MCT_DEBUG_LEVEL3, "JSON: Start\n");
	/// COMMAND 
	memcpy(_buf,json,len);
	// Context-Part
	Context_Init(&ctx, &D);
	Context_Build(&ctx, &jsonkey_command[0], sizeof(jsonkey_command));
	// Decoder-Part
	JsonDecode_Init(&D,&ctx);
	JsonDecode(&D, _buf, len);
	// Fehlerüberwachung: 1.Parserdurchlauf i.O,  2.Returnwert: Integer 
	if(!ctx.err.number && ctx.val.v.type == vType_int && ctx.val.vI.value)
		command = ctx.val.vI.value;					/// ARGUMENT: command
	DEBUG(MCT_DEBUG_LEVEL3, "JSON-DRV: command %d\n", command);
	
	///------------------
	/// OUTPUT DEVICES 
	///------------------
	for (_ch= 0; _ch < DEV_MCT_PAA_AO4_OUT_MAX; _ch++)	{
		memset(_name,0, sizeof(_name)); 
		_out_val = 0;
		/// VALUE
		memcpy(_buf,json,len);
		// Context-Part
		Context_Init(&ctx, &D);
		jsonkey_output[1].nA.node = _ch;	// Offset beachten!
		Context_Build(&ctx, &jsonkey_output[0], sizeof(jsonkey_output));
		// Decoder-Part
		JsonDecode_Init(&D,&ctx);
		JsonDecode(&D, _buf, len);
		// Fehlerüberwachung: 1.Parserdurchlauf i.O,  2.Returnwert: Integer , 3.Integer > 0 
		if(!ctx.err.number && ctx.val.v.type == vType_int && ctx.val.vI.value)
		_out_val = ctx.val.vI.value;
		DEBUG(MCT_DEBUG_LEVEL3, "JSON-DEV-OUT-%d: value %d\n",_ch, _out_val);
		/// NAME
		memcpy(_buf,json,len);
		// Context-Part
		Context_Init(&ctx, &D);
		jsonkey_o_name[1].nA.node = _ch;
		Context_Build(&ctx, &jsonkey_o_name[0], sizeof(jsonkey_o_name));
		// Decoder-Part
		JsonDecode_Init(&D,&ctx);
		JsonDecode(&D, _buf, len);
		// Fehlerüberwachung: 1.Parserdurchlauf i.O,  2.Returnwert: String,  3.Längenkontrolle 
		if(!ctx.err.number && ctx.val.v.type == vType_str && (strlen(ctx.val.vS.value)<= PROPERTY_SIZE))	{
			memcpy(&_name,&ctx.val.vS.value,strlen(ctx.val.vS.value));
		}
		DEBUG(MCT_DEBUG_LEVEL3, "JSON-DEV-OUT-%d: name %s\n",_ch, _name);
		
		/// Mappe alle Werte auf die Argument-Variablen, diese werden dann ausgewertet
		/// out_name_queue_[0...3]
		/// output_[0..3]
		switch (_ch) {
			case DEV_MCT_PAA_AO4_OUT_0:
				memcpy(out_name_queue[_ch],&_name,strlen(_name)+1);	
				output_0 = _out_val;
				break;
			case DEV_MCT_PAA_AO4_OUT_1:
				memcpy(out_name_queue[_ch],&_name,strlen(_name)+1);	
				output_1 = _out_val;
				break;
			case DEV_MCT_PAA_AO4_OUT_2:
				memcpy(out_name_queue[_ch],&_name,strlen(_name)+1);	
				output_2 = _out_val;
				break;
			case DEV_MCT_PAA_AO4_OUT_3:
				memcpy(out_name_queue[_ch],&_name,strlen(_name)+1);	
				output_3 = _out_val;
				break;
			default:
				DEBUG(MCT_DEBUG_LEVEL3, "%s %s(): %s %d\n", __FILE__, __FUNCTION__, "Attention unsupported Device_OUT number!", _ch);
				break;
			}
	}
	DEBUG(MCT_DEBUG_LEVEL3, "JSON: End\n");
	return len;
}
Пример #3
0
//***********************************************************************************
// Funktion:	Der Aufruf erfolgt automatisch, wenn der json-Parameter='{\"...\"}'
//				mit einem String aufgerufen wird. Als Format wird JSON-Syntax erwartet.
//				Folgende JSON-Elemente werden gesucht  und in die Werte in den 
//				entsprechenden Driver-Übergabeparametern abgelegt. 
// 				<JSON>
//				oControl.Command (e_Start,e_Stop Driver)	==> command
//				{
//				oDevices[0].oValues[x].Name 				==> out_name_x
//				oDevices[0].oValues[x].Value				==> output 
//				}
//				{
//				oDevices[1].oValues[x].Name 				==> in_name_x
//				}
//				Anschließend wird dio_objects_generic() aufgerufen - und die Eingabe-
//				parameter zum Teil kontrolliert. Je nach Wichtigkeit erfolgt eine
//				genaue Überprüfung oder z.B. nur der Längencheck.
//  
//************************************************************************************ 
ssize_t dio_objects_json(const char  * json) {
	JsonDecode_State D;
	elivator  		ctx;
	ssize_t 		len = strlen(json);
	int 			_ch = 0;
	int				_bits = 0;
	unsigned long	_output = 0;
	char  			_buf[JSON_LIMIT_SIZE+1]; 
	char 			_name[PROPERTY_SIZE+1];
	DEBUG(MCT_DEBUG_LEVEL2, "%s %s()\n",__FILE__, __FUNCTION__);

	if(len == 0 || len > JSON_LIMIT_SIZE+1)	{
		DEBUG(MCT_DEBUG_LEVEL3, "%s %s(): %s\n", __FILE__,__FUNCTION__, "Parameter json with corrupt limit size!");
		return -1;
	}

	///------------------
	/// DRIVER
	///------------------
	DEBUG(MCT_DEBUG_LEVEL3, "JSON: Start\n");

	/// COMMAND 
	memcpy(_buf,json,len);
	// Context-Part
	Context_Init(&ctx, &D);
	Context_Build(&ctx, &jsonkey_command[0], sizeof(jsonkey_command));
	// Decoder-Part
	JsonDecode_Init(&D,&ctx);
	JsonDecode(&D, _buf, len);
	// Fehlerüberwachung: 1.Parserdurchlauf i.O,  2.Returnwert: Integer
	if(!ctx.err.number && ctx.val.v.type == vType_int && ctx.val.vI.value)
		command = ctx.val.vI.value;					/// ARGUMENT: command
	DEBUG(MCT_DEBUG_LEVEL3, "JSON-DRV: command %d\n", command);

	///------------------
	/// DEVICE OUTPUT 
	///------------------
	/// BIT-VALUES 
	for (_ch= 0; _ch < OUTPUT_ELEMENTS; _ch++)	{
		memcpy(_buf,json,len);
		// Context-Part
		Context_Init(&ctx, &D);
		jsonkey_bits[3].nA.node = _ch;		// Outputs++
		Context_Build(&ctx, &jsonkey_bits[0], sizeof(jsonkey_bits));
		// Decoder-Part
		JsonDecode_Init(&D,&ctx);
		JsonDecode(&D, _buf, len);
		// Fehlerüberwachung: 1.Parserdurchlauf i.O,  2.Returnwert: Integer, 3. Integer > 0
		if(!ctx.err.number && ctx.val.v.type == vType_int && ctx.val.vI.value){	
			_bits = ctx.val.vI.value;
			_output = _output | (_bits << _ch);
		}
	}
	output = _output;							/// ARGUMENT: output (packed)	
	DEBUG(MCT_DEBUG_LEVEL3, "JSON-DEV-OUT-0: output %ld\n", _output);
	
	/// NAME
	for (_ch= 0; _ch < OUTPUT_ELEMENTS; _ch++)	{
		 memset(_name,0, sizeof(_name)); // immer löschen
		// NAME
		memcpy(_buf,json,len);
		// Context-Part
		Context_Init(&ctx, &D);
		jsonkey_name[1].nA.node = 0;		// Output-Device
		jsonkey_name[3].nA.node = _ch;		// Outputs++
		Context_Build(&ctx, &jsonkey_name[0], sizeof(jsonkey_name));
		// Decoder-Part
		JsonDecode_Init(&D,&ctx);
		JsonDecode(&D, _buf, len);
		// Fehlerüberwachung: 1.Parserdurchlauf i.O,  2.Returnwert: String,  3.Längenkontrolle 
		if(!ctx.err.number && ctx.val.v.type == vType_str && (strlen(ctx.val.vS.value)<= PROPERTY_SIZE))	{
			memcpy(&_name,&ctx.val.vS.value,strlen(ctx.val.vS.value));
			strcpy(out_name_queue[_ch] ,_name);	 /// ARGUMENT: out_name_queue[x] points to out_name[x]
		DEBUG(MCT_DEBUG_LEVEL3, "JSON-DEV-OUT-0: name-%d %s\n",_ch, _name);
		}
	}
	///-------------
	/// DEVICE INPUT
	///-------------
	/// NAME
	for (_ch= 0; _ch < INPUT_ELEMENTS; _ch++)	{
		 memset(_name,0, sizeof(_name)); // immer löschen
		// NAME
		memcpy(_buf,json,len);
		// Context-Part
		Context_Init(&ctx, &D);
		jsonkey_name[1].nA.node = 1;		// Input-Device
		jsonkey_name[3].nA.node = _ch;		// Inputs++
		Context_Build(&ctx, &jsonkey_name[0], sizeof(jsonkey_name));
		// Decoder-Part
		JsonDecode_Init(&D,&ctx);
		JsonDecode(&D, _buf, len);
		// Fehlerüberwachung: 1.Parserdurchlauf i.O,  2.Returnwert: String,  3.Längenkontrolle 
		if(!ctx.err.number && ctx.val.v.type == vType_str && (strlen(ctx.val.vS.value)<= PROPERTY_SIZE))	{
			memcpy(&_name,&ctx.val.vS.value,strlen(ctx.val.vS.value));
			strcpy(in_name_queue[_ch] ,_name);	/// ARGUMENT: in_name_queue[x] points to in_name[x]
			DEBUG(MCT_DEBUG_LEVEL3, "JSON-DEV-IN-0: name-%d %s\n",_ch, _name);
		}
	}
	DEBUG(MCT_DEBUG_LEVEL3, "JSON: End\n");
	return len;
}