/** * [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 }
//*********************************************************************************** // 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; }
//*********************************************************************************** // 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; }