Kaynağa Gözat

MQTT messages parsing

Bartosz Jakubski 6 ay önce
ebeveyn
işleme
d7f02618a6

+ 2 - 2
OZE_Main/.clang-format

@@ -203,7 +203,7 @@ BreakConstructorInitializersBeforeComma: false
 # ColumnLimit (unsigned)
 # The column limit.
 # A column limit of 0 means that there is no column limit. In this case, clang-format will respect the input’s line breaking decisions within statements unless they contradict other rules.
-ColumnLimit: 80
+ColumnLimit: 200
 
 # CommentPragmas (std::string)
 # A regular expression that describes comments with special meaning, which should not be split into lines or otherwise changed.
@@ -397,4 +397,4 @@ SpacesInParentheses: false
 
 # SpacesInSquareBrackets (bool)
 # If true, spaces will be inserted after [ and before ].
-SpacesInSquareBrackets: false
+SpacesInSquareBrackets: false

+ 300 - 0
OZE_Main/Core/Inc/cJSON.h

@@ -0,0 +1,300 @@
+/*
+  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  THE SOFTWARE.
+*/
+
+#ifndef cJSON__h
+#define cJSON__h
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
+#define __WINDOWS__
+#endif
+
+#ifdef __WINDOWS__
+
+/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention.  For windows you have 3 define options:
+
+CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
+CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
+CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
+
+For *nix builds that support visibility attribute, you can define similar behavior by
+
+setting default visibility to hidden by adding
+-fvisibility=hidden (for gcc)
+or
+-xldscope=hidden (for sun cc)
+to CFLAGS
+
+then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
+
+*/
+
+#define CJSON_CDECL __cdecl
+#define CJSON_STDCALL __stdcall
+
+/* export symbols by default, this is necessary for copy pasting the C and header file */
+#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
+#define CJSON_EXPORT_SYMBOLS
+#endif
+
+#if defined(CJSON_HIDE_SYMBOLS)
+#define CJSON_PUBLIC(type)   type CJSON_STDCALL
+#elif defined(CJSON_EXPORT_SYMBOLS)
+#define CJSON_PUBLIC(type)   __declspec(dllexport) type CJSON_STDCALL
+#elif defined(CJSON_IMPORT_SYMBOLS)
+#define CJSON_PUBLIC(type)   __declspec(dllimport) type CJSON_STDCALL
+#endif
+#else /* !__WINDOWS__ */
+#define CJSON_CDECL
+#define CJSON_STDCALL
+
+#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
+#define CJSON_PUBLIC(type)   __attribute__((visibility("default"))) type
+#else
+#define CJSON_PUBLIC(type) type
+#endif
+#endif
+
+/* project version */
+#define CJSON_VERSION_MAJOR 1
+#define CJSON_VERSION_MINOR 7
+#define CJSON_VERSION_PATCH 18
+
+#include <stddef.h>
+
+/* cJSON Types: */
+#define cJSON_Invalid (0)
+#define cJSON_False  (1 << 0)
+#define cJSON_True   (1 << 1)
+#define cJSON_NULL   (1 << 2)
+#define cJSON_Number (1 << 3)
+#define cJSON_String (1 << 4)
+#define cJSON_Array  (1 << 5)
+#define cJSON_Object (1 << 6)
+#define cJSON_Raw    (1 << 7) /* raw json */
+
+#define cJSON_IsReference 256
+#define cJSON_StringIsConst 512
+
+/* The cJSON structure: */
+typedef struct cJSON
+{
+    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
+    struct cJSON *next;
+    struct cJSON *prev;
+    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
+    struct cJSON *child;
+
+    /* The type of the item, as above. */
+    int type;
+
+    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
+    char *valuestring;
+    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
+    int valueint;
+    /* The item's number, if type==cJSON_Number */
+    double valuedouble;
+
+    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
+    char *string;
+} cJSON;
+
+typedef struct cJSON_Hooks
+{
+      /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
+      void *(CJSON_CDECL *malloc_fn)(size_t sz);
+      void (CJSON_CDECL *free_fn)(void *ptr);
+} cJSON_Hooks;
+
+typedef int cJSON_bool;
+
+/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
+ * This is to prevent stack overflows. */
+#ifndef CJSON_NESTING_LIMIT
+#define CJSON_NESTING_LIMIT 1000
+#endif
+
+/* returns the version of cJSON as a string */
+CJSON_PUBLIC(const char*) cJSON_Version(void);
+
+/* Supply malloc, realloc and free functions to cJSON */
+CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
+
+/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
+/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
+CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
+/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
+/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
+CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
+
+/* Render a cJSON entity to text for transfer/storage. */
+CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
+/* Render a cJSON entity to text for transfer/storage without any formatting. */
+CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
+/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
+CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
+/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
+/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
+CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
+/* Delete a cJSON entity and all subentities. */
+CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
+
+/* Returns the number of items in an array (or object). */
+CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
+/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
+CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
+/* Get item "string" from object. Case insensitive. */
+CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
+CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
+CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
+/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
+CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
+
+/* Check item type and return its value */
+CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
+CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
+
+/* These functions check the type of an item */
+CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
+CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
+
+/* These calls create a cJSON item of the appropriate type. */
+CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
+CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
+CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
+CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
+CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
+CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
+/* raw json */
+CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
+CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
+CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
+
+/* Create a string where valuestring references a string so
+ * it will not be freed by cJSON_Delete */
+CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
+/* Create an object/array that only references it's elements so
+ * they will not be freed by cJSON_Delete */
+CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
+CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
+
+/* These utilities create an Array of count items.
+ * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
+CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
+CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
+CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
+CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
+
+/* Append item to the specified array/object. */
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
+/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
+ * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
+ * writing to `item->string` */
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
+/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
+
+/* Remove/Detach items from Arrays/Objects. */
+CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
+CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
+CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
+CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
+
+/* Update array items. */
+CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
+
+/* Duplicate a cJSON item */
+CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
+/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
+ * need to be released. With recurse!=0, it will duplicate any children connected to the item.
+ * The item->next and ->prev pointers are always zero on return from Duplicate. */
+/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
+ * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
+CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
+
+/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
+ * The input pointer json cannot point to a read-only address area, such as a string constant, 
+ * but should point to a readable and writable address area. */
+CJSON_PUBLIC(void) cJSON_Minify(char *json);
+
+/* Helper functions for creating and adding items to an object at the same time.
+ * They return the added item or NULL on failure. */
+CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
+CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
+CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
+CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
+CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
+CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
+
+/* When assigning an integer value, it needs to be propagated to valuedouble too. */
+#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
+/* helper for the cJSON_SetNumberValue macro */
+CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
+#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
+/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */
+CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
+
+/* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/
+#define cJSON_SetBoolValue(object, boolValue) ( \
+    (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \
+    (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \
+    cJSON_Invalid\
+)
+
+/* Macro for iterating over an array or object */
+#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
+
+/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
+CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
+CJSON_PUBLIC(void) cJSON_free(void *object);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 44 - 0
OZE_Main/Core/Inc/interprocess_data.h

@@ -0,0 +1,44 @@
+/*
+ * interprocess_data.h
+ *
+ *  Created on: Aug 27, 2024
+ *      Author: jakubski
+ */
+
+#ifndef INC_INTERPROCESS_DATA_H_
+#define INC_INTERPROCESS_DATA_H_
+
+#include "serial_protocol.h"
+#include "stdint.h"
+
+struct _IntegerValues {
+    int32_t value[2];
+};
+
+
+struct _FloatValues {
+    float value[2];
+};
+
+struct _MixedValues {
+    int32_t value1;
+    float value2;
+};
+
+typedef struct _FloatValues FloatValues;
+typedef struct _IntegerValues IntegerValues;
+typedef struct _MixedValues MixedValues;
+
+
+struct _InterProcessData {
+    SerialProtocolCommands spCommand;
+    union _values {
+        IntegerValues integerValues;
+        FloatValues flaotValues;
+        MixedValues mixedValues;
+    } values;
+};
+
+typedef struct _InterProcessData InterProcessData;
+
+#endif /* INC_INTERPROCESS_DATA_H_ */

+ 4 - 0
OZE_Main/Core/Inc/measurements.h

@@ -30,6 +30,10 @@ struct _SesnorsInfo {
     float motorYAveCurrent;
     float motorXPeakCurrent;
     float motorYPeakCurrent;
+    uint8_t limitSwitchUp;
+    uint8_t limitSwitchDown;
+    uint8_t limitSwitchCenter;
+    uint8_t powerSupplyFailMask;
 };
 
 typedef struct _RESMeasurements RESMeasurements;

+ 15 - 26
OZE_Main/Core/Inc/serial_protocol.h

@@ -28,24 +28,22 @@
 #define FRAME_CRC_LENGTH sizeof (uint16_t)
 #define FRAME_TIMEOUT_MS 2000
 
-enum SerialProtocolCommands {
-    spGetAllMeasurments,
-    spGetVoltageMeasurments,
-    spGetCurrentMeasurments,
-    spGetPowerMeasurments,
-    spGetPVTemperatureMeasurment,
-    spGetPVEncoderValue,
-    spGetMotorXStatus,
-    spGetMotorYStatus,
-    spGetMotorXAveCurrent,
-    spGetMotorYAveCurrent,
-    spGetMotorXPeakCurrent,
-    spGetMotorYPeakCurrent,
-    spGetFanVoltage,
+enum _SerialProtocolCommands {
+	spGetElectricalMeasurments,
+	spGetSensorMeasurments,
+	spSetFanSpeed,
+	spSetMotorXOn,
+	spSetMotorYOn,
+	spSetmotorXMaxCurrent,
+	spSetmotorYMaxCurrent,
+	spSetDiodeOn,
     spUnknown
 };
 
-enum SerialProtocolRespStatus { spCrcFail = -2, spTimeout, spOK };
+typedef enum _SerialProtocolCommands SerialProtocolCommands;
+
+enum _SerialProtocolRespStatus { spInternalError = -3, spCrcFail = -2, spTimeout, spOK };
+typedef enum _SerialProtocolRespStatus SerialProtocolRespStatus;
 
 #define GET_SHORT_WORD_FIRST_BYTE(cmd) ((uint8_t)(cmd & 0xFF))
 #define GET_SHORT_WORD_SECOND_BYTE(cmd) ((uint8_t)((cmd >> 8) & 0xFF))
@@ -60,16 +58,7 @@ enum SerialProtocolRespStatus { spCrcFail = -2, spTimeout, spOK };
 #define CONVERT_BYTES_TO_WORD(buffer) ((uint32_t)((*(buffer + 3) << 24) | *(buffer + 2) << 16) | *(buffer + 1) << 8) | *buffer))
 
 void WriteDataToBuffer (uint8_t* buff, uint16_t* buffPos, void* data, uint8_t dataSize);
-uint16_t PrepareReqFrame (uint8_t* txBuffer,
-uint16_t frameId,
-enum SerialProtocolCommands frameCommand,
-uint8_t* dataBuffer,
-uint16_t dataLength);
-uint16_t PrepareRespFrame (uint8_t* txBuffer,
-uint16_t frameId,
-enum SerialProtocolCommands frameCommand,
-enum SerialProtocolRespStatus respStatus,
-uint8_t* dataBuffer,
-uint16_t dataLength);
+uint16_t PrepareReqFrame (uint8_t* txBuffer, uint16_t frameId, SerialProtocolCommands frameCommand, uint8_t* dataBuffer,uint16_t dataLength);
+uint16_t PrepareRespFrame (uint8_t* txBuffer, uint16_t frameId, SerialProtocolCommands frameCommand, SerialProtocolRespStatus respStatus, uint8_t* dataBuffer, uint16_t dataLength);
 
 #endif /* INC_SERIAL_PROTOCOL_H_ */

+ 16 - 4
OZE_Main/Core/Inc/uart_tasks.h

@@ -11,6 +11,7 @@
 #include "FreeRTOS.h"
 #include "FreeRTOSConfig.h"
 #include "task.h"
+#include "message_buffer.h"
 
 #include "main.h"
 #include "serial_protocol.h"
@@ -20,12 +21,17 @@
 #define INPUT_DATA_BUFF_SIZE UART8_RX_BUFF_SIZE
 #define OUTPUT_DATA_BUFF_SIZE 128
 
-struct _SerialProtocolFrameData {
+struct _SerialProtocolFrameHeader {
     uint16_t frameId;
-    enum SerialProtocolCommands frameCommand;
-    enum SerialProtocolRespStatus respStatus;
+    SerialProtocolCommands frameCommand;
+    SerialProtocolRespStatus respStatus;
     uint16_t frameDataLength;
     portBASE_TYPE isResponseFrame;
+};
+typedef struct _SerialProtocolFrameHeader SerialProtocolFrameHeader;
+
+struct _SerialProtocolFrameData {
+	SerialProtocolFrameHeader frameHeader;
     uint8_t dataBuffer[INPUT_DATA_BUFF_SIZE];
 };
 
@@ -43,9 +49,14 @@ struct _UartTaskData {
     uint16_t frameDataLen;
     uint16_t frameBytesCount;
     osThreadId_t uartRecieveTaskHandle;
+    osThreadId_t uartTransmitTaskHandle;
     osMutexId_t rxDataBufferMutex;
+#if 0
     osMessageQueueId_t processDataQueue;
+#endif
+    MessageBufferHandle_t processRxDataMsgBuffer;
     ProcessDataCallbackFunc processDataCb;
+    osMessageQueueId_t *sendCmdToSlaveQueue;
     UART_HandleTypeDef* huart;
     uint8_t uartNumber;
 };
@@ -53,10 +64,11 @@ struct _UartTaskData {
 typedef struct _UartTaskData UartTaskData;
 
 
-void Uart8RxTaskInit (void);
+void Uart8TasksInit (void);
 void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFrameData);
 
 void UartRxTask (void* argument);
+void UartTxTask (void* argument);
 void HandleUartRxCallback (UartTaskData* uartTaskData, UART_HandleTypeDef* huart, uint16_t Size);
 
 

Dosya farkı çok büyük olduğundan ihmal edildi
+ 3143 - 0
OZE_Main/Core/Src/cJSON.c


+ 1 - 1
OZE_Main/Core/Src/main.c

@@ -161,7 +161,7 @@ int main(void)
   /* USER CODE BEGIN RTOS_THREADS */
   /* add threads, ... */
   mqtt_cli_init();
-  Uart8RxTaskInit();
+  Uart8TasksInit();
   MockMeasurmetsTaskInit();
   /* USER CODE END RTOS_THREADS */
 

+ 1 - 2
OZE_Main/Core/Src/mock_tasks.c

@@ -38,8 +38,7 @@ float rndflt (float rng)
 void MockMeasurmetsTaskInit(void) {
 	osThreadAttr_t osThreadAttrMockMeasTask = { 0 };
 	osThreadId_t osThreadMockMeasurmetsTaskId;
-//	osThreadAttrMockMeasTask.name       = "os_thread_mock_measurmets";
-	osThreadAttrMockMeasTask.name       = "os_thread_dupa";
+	osThreadAttrMockMeasTask.name       = "os_thread_mock_measurmets";
 	osThreadAttrMockMeasTask.stack_size = configMINIMAL_STACK_SIZE * 2;
 	osThreadAttrMockMeasTask.priority   = (osPriority_t)osPriorityNormal;
 	osThreadMockMeasurmetsTaskId = osThreadNew (MockMeasurmetsTask, NULL, &osThreadAttrMockMeasTask);

+ 253 - 149
OZE_Main/Core/Src/mqtt_client.c

@@ -18,19 +18,44 @@
 #include "MQTTInterface.h"
 #include "node-red-config.h"
 #include "measurements.h"
+#include "cJSON.h"
+#include "interprocess_data.h"
+#include "uart_tasks.h"
 
 #define MQTT_BUFSIZE	1024
 
 //extern RESMeasurements resMeasurements[SLAVES_COUNT];
 //extern SesnorsInfo sensorsInfo[SLAVES_COUNT];
 
+uint32_t lastSeen[SLAVES_COUNT] = { 0 };
 RESMeasurements resMeasurements[SLAVES_COUNT] = { 0 };
 SesnorsInfo sensorsInfo[SLAVES_COUNT]         = { 0 };
 osMutexId_t resMeasurementsMutex;
 osMutexId_t sensorsInfoMutex;
 
+char* const subscribeTopicNames[SLAVES_COUNT] = { "Set/1", "Set/2", "Set/3", "Set/4" };
+#define MAX_COMMANDS_IN_MQTT_PAYLOAD 6
+char* const topicCommands[MAX_COMMANDS_IN_MQTT_PAYLOAD] = {"fanSpeed", "motorXon", "motorYon", "diode", "motorXMaxCurrent", "motorYMaxCurrent"};
+
+enum _BoardNoOverTopic
+{
+	board_1 = 1,
+	board_2,
+	board_3,
+	board_4,
+	unknownBoard
+};
+
+typedef enum _BoardNoOverTopic BoardNoOverTopic;
+
 extern struct netif gnetif; //extern gnetif
 
+extern UartTaskData uart1TaskData;  // Board 1
+extern UartTaskData uart3TaskData;  // Board 2
+extern UartTaskData uart6TaskData;  // Board 3
+extern UartTaskData uart2TaskData;  // Board 4
+extern UartTaskData uart8TaskData;  // Debug
+
 const osThreadAttr_t mqttClientSubTaskAttr =
 { .name = "mqttClientSubTask", .stack_size = configMINIMAL_STACK_SIZE * 4,
 		.priority = (osPriority_t) osPriorityNormal, };
@@ -47,168 +72,246 @@ MQTTClient mqttClient; //mqtt client
 
 uint8_t sndBuffer[MQTT_BUFSIZE]; //mqtt send buffer
 uint8_t rcvBuffer[MQTT_BUFSIZE]; //mqtt receive buffer
-uint8_t msgBuffer[MQTT_BUFSIZE]; //mqtt message buffer
 
 void MqttClientSubTask(void *argument); //mqtt client subscribe task function
 void MqttClientPubTask(void *argument); //mqtt client publish task function
 int MqttConnectBroker(void); 				//mqtt broker connect function
 void MqttMessageArrived(MessageData *msg); //mqtt message callback function
 
-void MqttClientSubTask(void *argument)
-{
-	while (1)
-	{
-		//waiting for valid ip address
-		if (gnetif.ip_addr.addr == 0 || gnetif.netmask.addr == 0
-				|| gnetif.gw.addr == 0) //system has no valid ip address
-		{
-			osDelay(pdMS_TO_TICKS(1000));
-			continue;
-		}
-		else
-		{
-			printf("DHCP/Static IP O.K.\n");
-			break;
-		}
-	}
-
-	while (1)
-	{
-		if (!mqttClient.isconnected)
-		{
-			//try to connect to the broker
-			if (MqttConnectBroker() != MQTT_SUCCESS)
-			{
-				osDelay(pdMS_TO_TICKS(1000));
-			}
-		}
-		else
-		{
-			MQTTYield(&mqttClient, 500); //handle timer
-			osDelay(pdMS_TO_TICKS(100));
-		}
-	}
+void MqttClientSubTask (void* argument) {
+    while (1) {
+        // waiting for valid ip address
+        if (gnetif.ip_addr.addr == 0 || gnetif.netmask.addr == 0 || gnetif.gw.addr == 0) // system has no valid ip address
+        {
+            osDelay (pdMS_TO_TICKS (1000));
+            continue;
+        } else {
+            printf ("DHCP/Static IP O.K.\n");
+            break;
+        }
+    }
+
+    while (1) {
+        if (!mqttClient.isconnected) {
+            // try to connect to the broker
+            if (MqttConnectBroker () != MQTT_SUCCESS) {
+                osDelay (pdMS_TO_TICKS (1000));
+            }
+        } else {
+            MQTTYield (&mqttClient, 500); // handle timer
+            osDelay (pdMS_TO_TICKS (100));
+        }
+    }
 }
 
-void MqttClientPubTask(void *argument)
-{
-//	const char *str = "MQTT message from STM32";
-	char messageBuffer[256] = {0x00};
-	char topicTextBuffer[32]  = {0x00};
-	uint32_t bytesInBuffer = 0;
-	uint8_t boardNumber = 0;
-	MQTTMessage message;
-
-	resMeasurementsMutex = osMutexNew (NULL);
-	sensorsInfoMutex = osMutexNew (NULL);
-
-	while (1)
-	{
-		if (mqttClient.isconnected)
-		{
-			if (is_link_up())
-			{
-				for( boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
-				{
-					osMutexAcquire (resMeasurementsMutex, osWaitForever);
-					RESMeasurements *resMeas = &resMeasurements[boardNumber];
-					sprintf(topicTextBuffer, "RESmeasurments/%d", boardNumber + 1);
-					bytesInBuffer = sprintf(messageBuffer,"\"voltageRMS\":{%.2f, %.2f, %.2f}, ", resMeas->voltageRMS[0], resMeas->voltageRMS[1], resMeas->voltageRMS[2]);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"voltagePeak\":{%.2f, %.2f, %.2f}, ", resMeas->voltagePeak[0], resMeas->voltagePeak[1], resMeas->voltagePeak[2]);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"currentRMS\":{%.3f, %.3f, %.3f}, ", resMeas->currentRMS[0], resMeas->currentRMS[1], resMeas->currentRMS[2]);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"currentPeak\":{%.3f, %.3f, %.3f}, ", resMeas->currentPeak[0], resMeas->currentPeak[1], resMeas->currentPeak[2]);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"power\":{%.2f, %.2f, %.2f}", resMeas->power[0], resMeas->power[1], resMeas->power[2]);
-					osMutexRelease(resMeasurementsMutex);
-					message.payload = (void*) messageBuffer;
-					message.payloadlen = strlen(messageBuffer);
-					MQTTPublish(&mqttClient, topicTextBuffer, &message); //publish a message
-				}
-
-				for( boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++)
-				{
-					osMutexAcquire (sensorsInfoMutex, osWaitForever);
-					SesnorsInfo *sensors = &sensorsInfo[boardNumber];
-					sprintf(topicTextBuffer, "Sensors/%d", boardNumber + 1);
-					bytesInBuffer = sprintf(messageBuffer,"\"pvTemperature\":{%.1f, %.1f}, ", sensors->pvTemperature[0], sensors->pvTemperature[1]);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"fanVoltage\":%.2f, ", sensors->fanVoltage);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"pvEncoder\":%.2f, ", sensors->pvEncoder);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"motorXStatus\":%d, ", sensors->motorXStatus);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"motorYStatus\":%d, ", sensors->motorYStatus);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"motorXAveCurrent\":%.3f, ", sensors->motorXAveCurrent);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"motorYAveCurrent\":%.3f, ", sensors->motorYAveCurrent);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"motorXPeakCurrent\":%.3f, ", sensors->motorXPeakCurrent);
-					bytesInBuffer += sprintf(&messageBuffer[bytesInBuffer],"\"motorYPeakCurrent\":%.3f", sensors->motorYPeakCurrent);
-					osMutexRelease(sensorsInfoMutex);
-					message.payload = (void*) messageBuffer;
-					message.payloadlen = strlen(messageBuffer);
-					MQTTPublish(&mqttClient, topicTextBuffer, &message); //publish a message
-				}
-			}
-		}
-
-		osDelay(pdMS_TO_TICKS(1000));
-	}
+void MqttClientPubTask (void* argument) {
+    char messageBuffer[512]  = { 0x00 };
+    char topicTextBuffer[32] = { 0x00 };
+    uint32_t bytesInBuffer   = 0;
+    uint8_t boardNumber      = 0;
+    MQTTMessage message;
+
+    resMeasurementsMutex = osMutexNew (NULL);
+    sensorsInfoMutex     = osMutexNew (NULL);
+
+    while (1) {
+        if (mqttClient.isconnected) {
+            if (is_link_up ()) {
+                for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
+                    osMutexAcquire (resMeasurementsMutex, osWaitForever);
+                    RESMeasurements* resMeas = &resMeasurements[boardNumber];
+                    sprintf (topicTextBuffer, "RESmeasurments/%d", boardNumber + 1);
+                    bytesInBuffer = sprintf (messageBuffer, "{\"voltageRMS\":[%.2f, %.2f, %.2f], ", resMeas->voltageRMS[0], resMeas->voltageRMS[1], resMeas->voltageRMS[2]);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"voltagePeak\":[%.2f, %.2f, %.2f], ", resMeas->voltagePeak[0], resMeas->voltagePeak[1], resMeas->voltagePeak[2]);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"currentRMS\":[%.3f, %.3f, %.3f], ", resMeas->currentRMS[0], resMeas->currentRMS[1], resMeas->currentRMS[2]);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"currentPeak\":[%.3f, %.3f, %.3f], ", resMeas->currentPeak[0], resMeas->currentPeak[1], resMeas->currentPeak[2]);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"power\":[%.2f, %.2f, %.2f], ", resMeas->power[0], resMeas->power[1], resMeas->power[2]);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"lastSeen\": %ld}", lastSeen[boardNumber]);
+                    osMutexRelease (resMeasurementsMutex);
+                    message.payload    = (void*)messageBuffer;
+                    message.payloadlen = strlen (messageBuffer);
+                    MQTTPublish (&mqttClient, topicTextBuffer, &message); // publish a message
+                }
+
+                for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
+                    osMutexAcquire (sensorsInfoMutex, osWaitForever);
+                    SesnorsInfo* sensors = &sensorsInfo[boardNumber];
+                    sprintf (topicTextBuffer, "Sensors/%d", boardNumber + 1);
+                    bytesInBuffer = sprintf (messageBuffer, "\"{pvTemperature\":[%.1f, %.1f], ", sensors->pvTemperature[0], sensors->pvTemperature[1]);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"fanVoltage\":%.2f, ", sensors->fanVoltage);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"pvEncoder\":%.2f, ", sensors->pvEncoder);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorXStatus\":%d, ", sensors->motorXStatus);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYStatus\":%d, ", sensors->motorYStatus);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorXAveCurrent\":%.3f, ", sensors->motorXAveCurrent);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYAveCurrent\":%.3f, ", sensors->motorYAveCurrent);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorXPeakCurrent\":%.3f, ", sensors->motorXPeakCurrent);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYPeakCurrent\":%.3f, ", sensors->motorYPeakCurrent);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchUp\":%d, ", sensors->limitSwitchUp);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchDown\":%d, ", sensors->limitSwitchDown);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchCenter\":%d, ", sensors->limitSwitchCenter);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"powerSupplyFailMask\":%d}", sensors->powerSupplyFailMask);
+
+                    osMutexRelease (sensorsInfoMutex);
+                    message.payload    = (void*)messageBuffer;
+                    message.payloadlen = strlen (messageBuffer);
+                    MQTTPublish (&mqttClient, topicTextBuffer, &message); // publish a message
+                }
+            }
+        }
+
+        osDelay (pdMS_TO_TICKS (1000));
+    }
 }
 
-int MqttConnectBroker()
-{
-	int ret;
-
-	NewNetwork(&net);
-	ret = ConnectNetwork(&net, BROKER_IP, MQTT_PORT);
-	if (ret != MQTT_SUCCESS)
-	{
-		printf("ConnectNetwork failed.\n");
-		return -1;
-	}
-
-	MQTTClientInit(&mqttClient, &net, 1000, sndBuffer, sizeof(sndBuffer),
-			rcvBuffer, sizeof(rcvBuffer));
-
-	MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
-	data.willFlag = 0;
-	data.MQTTVersion = 3;
-	data.clientID.cstring = "test_user1";
-	data.username.cstring = "test_user1";
-	data.password.cstring = "1234";
-	data.keepAliveInterval = 100;
-	data.cleansession = 1;
-
-	ret = MQTTConnect(&mqttClient, &data);
-	if (ret != MQTT_SUCCESS)
-	{
-		net_disconnect(&net);
-		printf("MQTTConnect failed. Code %d\n", ret);
-		return ret;
-	}
-
-	ret = MQTTSubscribe(&mqttClient, "test_second", QOS0, MqttMessageArrived);
-	if (ret != MQTT_SUCCESS)
-	{
-		net_disconnect(&net);
-		printf("MQTTSubscribe failed.\n");
-		return ret;
-	}
-	printf("MQTT_ConnectBroker O.K.\n");
-
-	return MQTT_SUCCESS;
+int MqttConnectBroker () {
+    uint8_t boardNumber = 0;
+    int ret;
+
+    NewNetwork (&net);
+    ret = ConnectNetwork (&net, BROKER_IP, MQTT_PORT);
+    if (ret != MQTT_SUCCESS) {
+        printf ("ConnectNetwork failed.\n");
+        return -1;
+    }
+
+    MQTTClientInit (&mqttClient, &net, 1000, sndBuffer, sizeof (sndBuffer), rcvBuffer, sizeof (rcvBuffer));
+
+    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
+    data.willFlag               = 0;
+    data.MQTTVersion            = 3;
+    data.clientID.cstring       = "test_user1";
+    data.username.cstring       = "test_user1";
+    data.password.cstring       = "1234";
+    data.keepAliveInterval      = 100;
+    data.cleansession           = 1;
+
+    ret = MQTTConnect (&mqttClient, &data);
+    if (ret != MQTT_SUCCESS) {
+        net_disconnect (&net);
+        printf ("MQTTConnect failed. Code %d\n", ret);
+        return ret;
+    }
+
+    for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
+        ret = MQTTSubscribe (&mqttClient, subscribeTopicNames[boardNumber], QOS0, MqttMessageArrived);
+        if (ret != MQTT_SUCCESS) {
+            net_disconnect (&net);
+            printf ("MQTTSubscribe failed.\n");
+            return ret;
+        }
+    }
+    printf ("MQTT_ConnectBroker O.K.\n");
+
+    return MQTT_SUCCESS;
 }
 
-void MqttMessageArrived(MessageData *msg)
-{
-	MQTTMessage *message = msg->message;
-	memset(msgBuffer, 0, sizeof(msgBuffer));
-	memcpy(msgBuffer, message->payload, message->payloadlen);
-
-	printf("MQTT MSG[%d]:%s\n", (int) message->payloadlen, msgBuffer);
+void MqttMessageArrived (MessageData* msg) {
+    SerialProtocolCommands spCommand = spUnknown;
+    BoardNoOverTopic topicForBoard   = unknownBoard;
+    uint8_t boardNumber              = 0;
+    MQTTMessage* message             = msg->message;
+    char topicName[32]               = { 0 };
+    memcpy (topicName, msg->topicName->lenstring.data, msg->topicName->lenstring.len);
+
+    for (boardNumber = 0; boardNumber < SLAVES_COUNT; boardNumber++) {
+        if (strcmp (topicName, subscribeTopicNames[boardNumber]) == 0) {
+            topicForBoard = (BoardNoOverTopic)(boardNumber + 1);
+        }
+    }
+
+    cJSON* json             = cJSON_Parse (message->payload);
+    const cJSON* objectItem = NULL;
+    InterProcessData data   = { 0 };
+    for (int topicCmdNumber = 0; topicCmdNumber < 6; topicCmdNumber++) {
+        spCommand  = spUnknown;
+        objectItem = cJSON_GetObjectItemCaseSensitive (json, topicCommands[topicCmdNumber]);
+        if (objectItem != NULL) {
+            switch (topicCmdNumber) {
+            case 0: spCommand = spSetFanSpeed;
+            case 1:
+                if (spCommand == spUnknown) {
+                    spCommand = spSetMotorXOn;
+                }
+            case 2:
+                if (spCommand == spUnknown) {
+                    spCommand = spSetMotorYOn;
+                }
+                if (cJSON_IsArray (objectItem)) {
+                    data.spCommand = spCommand;
+                    int arraySize  = cJSON_GetArraySize (objectItem);
+                    if (arraySize == 2) {
+                        for (int i = 0; i < arraySize; i++) {
+                            cJSON* item = cJSON_GetArrayItem (objectItem, i);
+                            if (cJSON_IsNumber (item)) {
+                                data.values.integerValues.value[i] = item->valueint;
+                            }
+                        }
+                    }
+                }
+                break;
+            case 3:
+                data.spCommand                     = spSetDiodeOn;
+                data.values.integerValues.value[0] = objectItem->valueint;
+                data.values.integerValues.value[1] = 0;
+                break;
+            case 4: spCommand = spSetmotorXMaxCurrent;
+            case 5:
+                if (spCommand == spUnknown) {
+                    spCommand = spSetmotorYMaxCurrent;
+                }
+                data.spCommand                   = spCommand;
+                data.values.flaotValues.value[0] = objectItem->valuedouble;
+                data.values.flaotValues.value[1] = 0.0;
+                break;
+            default: break;
+            }
+
+            switch (topicForBoard) {
+            case board_1:
+#if 0
+                if (uart1TaskData.sendCmdToSlaveQueue != NULL) {
+                    osMessageQueuePut (
+                    uart1TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
+                }
+#else
+                if (uart8TaskData.sendCmdToSlaveQueue != NULL) {
+                    osMessageQueuePut (uart8TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
+                }
+#endif
+                printf ("Send cmd to board 1\n");
+                break;
+            case board_2:
+                if (uart3TaskData.sendCmdToSlaveQueue != NULL) {
+                    osMessageQueuePut (uart3TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
+                }
+                printf ("Send cmd to board 2\n");
+                break;
+            case board_3:
+                if (uart6TaskData.sendCmdToSlaveQueue != NULL) {
+                    osMessageQueuePut (uart6TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
+                }
+                printf ("Send cmd to board 3\n");
+                break;
+            case board_4:
+                if (uart2TaskData.sendCmdToSlaveQueue != NULL) {
+                    osMessageQueuePut (uart2TaskData.sendCmdToSlaveQueue, &data, 0, (TickType_t)100);
+                }
+                printf ("Send cmd to board 4\n");
+                break;
+            default: break;
+            }
+        }
+    }
+    cJSON_Delete (json);
+
+    //    printf ("MQTT MSG[%d]:%s\n", (int)message->payloadlen, (char*)message->payload);
+
+    printf ("MQTT Topic:%s, MSG[%d]:%s\n", topicName, (int)message->payloadlen, (char*)message->payload);
 }
 
-void mqtt_cli_init(void)
-{
-	mqttClientSubTaskHandle = osThreadNew(MqttClientSubTask, NULL,
-			&mqttClientSubTaskAttr); //subscribe task
-	mqttClientPubTaskHandle = osThreadNew(MqttClientPubTask, NULL,
-			&mqttClientPubTaskAttr); //publish task
+void mqtt_cli_init (void) {
+    mqttClientSubTaskHandle = osThreadNew (MqttClientSubTask, NULL, &mqttClientSubTaskAttr); // subscribe task
+    mqttClientPubTaskHandle = osThreadNew (MqttClientPubTask, NULL, &mqttClientPubTaskAttr); // publish task
 }
 
 #else
@@ -267,7 +370,8 @@ static void mqtt_request_cb(void *arg, err_t err)
 	const struct mqtt_connect_client_info_t* client_info = (const struct mqtt_connect_client_info_t*)arg;
 
 	LWIP_PLATFORM_DIAG(("MQTT client \"%s\" request cb: err %d\n", client_info->client_id, (int)err));
-}
+}VES_COUNT; boardNumber++)
+			{
 
 static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
 {

+ 2 - 11
OZE_Main/Core/Src/serial_protocol.c

@@ -52,11 +52,7 @@ void WriteDataToBuffer (uint8_t* buff, uint16_t* buffPos, void* data, uint8_t da
     *buffPos = newBuffPos;
 }
 
-uint16_t PrepareReqFrame (uint8_t* txBuffer,
-uint16_t frameId,
-enum SerialProtocolCommands frameCommand,
-uint8_t* dataBuffer,
-uint16_t dataLength) {
+uint16_t PrepareReqFrame (uint8_t* txBuffer, uint16_t frameId, SerialProtocolCommands frameCommand, uint8_t* dataBuffer, uint16_t dataLength) {
     uint16_t crc         = 0;
     uint16_t txBufferPos = 0;
     uint16_t frameCmd    = ((uint16_t)frameCommand);
@@ -81,12 +77,7 @@ uint16_t dataLength) {
     return txBufferPos;
 }
 
-uint16_t PrepareRespFrame (uint8_t* txBuffer,
-uint16_t frameId,
-enum SerialProtocolCommands frameCommand,
-enum SerialProtocolRespStatus respStatus,
-uint8_t* dataBuffer,
-uint16_t dataLength) {
+uint16_t PrepareRespFrame (uint8_t* txBuffer, uint16_t frameId, SerialProtocolCommands frameCommand, SerialProtocolRespStatus respStatus, uint8_t* dataBuffer, uint16_t dataLength) {
     uint16_t crc         = 0;
     uint16_t txBufferPos = 0;
     uint16_t frameCmd = ((uint16_t)frameCommand) | 0x8000; // MSB set means response

+ 152 - 103
OZE_Main/Core/Src/uart_tasks.c

@@ -11,25 +11,21 @@
 #include <stdio.h>
 #include <string.h>
 
+#include "interprocess_data.h"
 #include "measurements.h"
 #include "mock_tasks.h"
 #include "uart_tasks.h"
 
-enum SerialReceiverStates {
-    srWaitForHeader,
-    srCheckCrc,
-    srRecieveData,
-    srExecuteCmd,
-    srFail,
-    srFinish,
-    srLast
-};
-
-osThreadId_t uart8RecieveTaskHandle;
-// osSemaphoreDef_t uart8RxSemaphoreDef;
-// osSemaphoreId_t uart8RxSemaphore = NULL;
-
-osMessageQueueId_t uart8DecodedFrameDataTaskQueue;
+enum SerialReceiverStates { srWaitForHeader, srCheckCrc, srRecieveData, srExecuteCmd, srFail, srFinish, srLast };
+
+// osThreadId_t uart8RecieveTaskHandle;
+// osThreadId_t uart8TransmitTaskHandle;
+//  osSemaphoreDef_t uart8RxSemaphoreDef;
+//  osSemaphoreId_t uart8RxSemaphore = NULL;
+
+// osMessageQueueId_t uart8DecodedFrameDataTaskQueue;
+// osMessageQueueId_t uart8SendCmdToSlaveQueue;
+
 extern UART_HandleTypeDef huart8;
 extern DMA_HandleTypeDef hdma_uart8_rx;
 extern CRC_HandleTypeDef hcrc;
@@ -38,7 +34,11 @@ uint8_t uart8RxBuffer[UART8_RX_BUFF_SIZE]        = { 0 };
 uint8_t uart8TxBuffer[UART8_TX_BUFF_SIZE]        = { 0 };
 uint8_t uart8TaskFrameData[INPUT_DATA_BUFF_SIZE] = { 0 };
 
-UartTaskData uart8TaskData = { 0 };
+UartTaskData uart1TaskData = { 0 }; // Board 1
+UartTaskData uart3TaskData = { 0 }; // Board 2
+UartTaskData uart6TaskData = { 0 }; // Board 3
+UartTaskData uart2TaskData = { 0 }; // Board 4
+UartTaskData uart8TaskData = { 0 }; // Debug
 
 uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
 uint16_t outputDataBufferPos = 0;
@@ -48,37 +48,51 @@ extern SesnorsInfo sensorsInfo[SLAVES_COUNT];
 extern osMutexId_t resMeasurementsMutex;
 extern osMutexId_t sensorsInfoMutex;
 
+extern RNG_HandleTypeDef hrng;
+
 
-void Uart8RxTaskInit (void) {
-    osThreadAttr_t osThreadAttrUart8 = { 0 };
+void Uart8TasksInit (void) {
+    osThreadAttr_t osThreadAttrRxUart = { 0 };
+    osThreadAttr_t osThreadAttrTxUart = { 0 };
 #if 0
-	osMessageQueueAttr_t uartRxMsgQueueAttr;
+	osMessageQueueAttr_t uartRxMsgQueueAttr = { 0 };
 	uartRxMsgQueueAttr.name = "uart8RxMsgQueue";
 	uart8DecodedFrameDataTaskQueue = osMessageQueueNew(4, sizeof(SerialProtocolFrameData), &uartRxMsgQueueAttr);
 	uart8TaskData.processDataQueue = uart8DecodedFrameDataTaskQueue;
 #else
-    uart8TaskData.processDataQueue = NULL;
+//    uart8TaskData.processDataQueue = NULL;
 #endif
 
-    uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
+	uart8TaskData.processRxDataMsgBuffer = xMessageBufferCreate( INPUT_DATA_BUFF_SIZE );
+//    uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
+    uart8TaskData.processDataCb = NULL;
 
-    osThreadAttrUart8.name       = "os_thread_uart8_rx";
-    osThreadAttrUart8.stack_size = configMINIMAL_STACK_SIZE * 2;
-    osThreadAttrUart8.priority   = (osPriority_t)osPriorityHigh;
+    osThreadAttrRxUart.name       = "os_thread_uart8_rx";
+    osThreadAttrRxUart.stack_size = configMINIMAL_STACK_SIZE * 2;
+    osThreadAttrRxUart.priority   = (osPriority_t)osPriorityHigh;
 
     //	uart8RxSemaphoreDef.name = "uart8RxSemaphore";
     //	uart8RxSemaphore = osSemaphoreNew(1, 1, NULL);
 
-    uart8TaskData.uartRxBuffer    = uart8RxBuffer;
-    uart8TaskData.uartRxBufferLen = UART8_RX_BUFF_SIZE;
-    uart8TaskData.uartTxBuffer    = uart8TxBuffer;
-    uart8TaskData.uartRxBufferLen = UART8_TX_BUFF_SIZE;
-    uart8TaskData.frameData       = uart8TaskFrameData;
-    uart8TaskData.frameDataLen    = UART8_RX_BUFF_SIZE;
-    uart8TaskData.huart           = &huart8;
-    uart8TaskData.uartNumber      = 8;
-    uart8RecieveTaskHandle = osThreadNew (UartRxTask, &uart8TaskData, &osThreadAttrUart8);
-    uart8TaskData.uartRecieveTaskHandle = uart8RecieveTaskHandle;
+    uart8TaskData.uartRxBuffer          = uart8RxBuffer;
+    uart8TaskData.uartRxBufferLen       = UART8_RX_BUFF_SIZE;
+    uart8TaskData.uartTxBuffer          = uart8TxBuffer;
+    uart8TaskData.uartRxBufferLen       = UART8_TX_BUFF_SIZE;
+    uart8TaskData.frameData             = uart8TaskFrameData;
+    uart8TaskData.frameDataLen          = UART8_RX_BUFF_SIZE;
+    uart8TaskData.huart                 = &huart8;
+    uart8TaskData.uartNumber            = 8;
+    uart8TaskData.uartRecieveTaskHandle = osThreadNew (UartRxTask, &uart8TaskData, &osThreadAttrRxUart);
+
+
+    osMessageQueueAttr_t uartTxMsgQueueAttr = { 0 };
+    uartTxMsgQueueAttr.name                 = "uart8TxMsgQueue";
+    uart8TaskData.sendCmdToSlaveQueue       = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
+
+    osThreadAttrTxUart.name              = "os_thread_uart8_tx";
+    osThreadAttrTxUart.stack_size        = configMINIMAL_STACK_SIZE * 4;
+    osThreadAttrTxUart.priority          = (osPriority_t)osPriorityNormal;
+    uart8TaskData.uartTransmitTaskHandle = osThreadNew (UartTxTask, &uart8TaskData, &osThreadAttrTxUart);
 }
 
 void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
@@ -99,16 +113,13 @@ void HAL_UART_TxCpltCallback (UART_HandleTypeDef* huart) {
 void HandleUartRxCallback (UartTaskData* uartTaskData, UART_HandleTypeDef* huart, uint16_t Size) {
     BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
     osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
-    memcpy (&(uartTaskData->frameData[uartTaskData->frameBytesCount]),
-    uartTaskData->uartRxBuffer, Size);
+    memcpy (&(uartTaskData->frameData[uartTaskData->frameBytesCount]), uartTaskData->uartRxBuffer, Size);
     uartTaskData->frameBytesCount += Size;
     osMutexRelease (uartTaskData->rxDataBufferMutex);
-    xTaskNotifyFromISR (uartTaskData->uartRecieveTaskHandle, Size,
-    eSetValueWithOverwrite, &pxHigherPriorityTaskWoken);
+    xTaskNotifyFromISR (uartTaskData->uartRecieveTaskHandle, Size, eSetValueWithOverwrite, &pxHigherPriorityTaskWoken);
     //	HAL_UARTEx_ReceiveToIdle_DMA(huart, uart8RxBuffer, UART8_RX_BUFF_SIZE);
     //	__HAL_DMA_DISABLE_IT(&hdma_uart8_rx, DMA_IT_HT);
-    HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart,
-    uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
+    HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
     portEND_SWITCHING_ISR (pxHigherPriorityTaskWoken);
 }
 
@@ -128,15 +139,13 @@ void UartRxTask (void* argument) {
     enum SerialReceiverStates receverState = srWaitForHeader;
 
     uartTaskData->rxDataBufferMutex = osMutexNew (NULL);
-    HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart,
-    uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
+    HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
     //	HAL_UARTEx_ReceiveToIdle_DMA(&huart8, uart8RxBuffer, 32);
     while (pdTRUE) {
         //		HAL_UART_Receive_IT(&huart8, uart8RxBuffer, 1);
         //		if(osSemaphoreAcquire(uart8RxSemaphore, pdMS_TO_TICKS(1000)) !=
         // osOK) 		if(xTaskNotifyWait(0, 0, &bytesRec, portMAX_DELAY) == pdTrue)
-        frameTimeout =
-        !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
+        frameTimeout = !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
 
         osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
         frameBytesCount = uartTaskData->frameBytesCount;
@@ -152,8 +161,7 @@ void UartRxTask (void* argument) {
 #endif
             } else {
                 if (uartTaskData->huart->RxState == HAL_UART_STATE_READY) {
-                    HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart,
-                    uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
+                    HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
                 }
             }
         }
@@ -164,31 +172,21 @@ void UartRxTask (void* argument) {
                 osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
                 if (uartTaskData->frameData[0] == FRAME_INDICATOR) {
                     if (frameBytesCount > FRAME_ID_LENGTH) {
-                        spFrameData.frameId = CONVERT_BYTES_TO_SHORT_WORD (
-                        &(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH -
-                        FRAME_DATALEN_LENGTH - FRAME_ID_LENGTH - FRAME_COMMAND_LENGTH]));
+                        spFrameData.frameHeader.frameId =
+                        CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_ID_LENGTH - FRAME_COMMAND_LENGTH]));
                     }
                     if (frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH) {
-                        frameCommandRaw = CONVERT_BYTES_TO_SHORT_WORD (
-                        &(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH -
-                        FRAME_DATALEN_LENGTH - FRAME_COMMAND_LENGTH]));
-                        spFrameData.frameCommand =
-                        (enum SerialProtocolCommands) (frameCommandRaw & 0x7FFF);
-                        spFrameData.isResponseFrame =
-                        (frameCommandRaw & 0x8000) != 0 ? pdTRUE : pdFALSE;
+                        frameCommandRaw = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH - FRAME_COMMAND_LENGTH]));
+                        spFrameData.frameHeader.frameCommand    = (SerialProtocolCommands)(frameCommandRaw & 0x7FFF);
+                        spFrameData.frameHeader.isResponseFrame = (frameCommandRaw & 0x8000) != 0 ? pdTRUE : pdFALSE;
                     }
-                    if ((frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH) &&
-                    ((spFrameData.frameCommand & 0x8000) != 0)) {
-                        spFrameData.respStatus = (enum SerialProtocolRespStatus) (
-                        uartTaskData->frameData[FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH]);
+                    if ((frameBytesCount > FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH) && ((spFrameData.frameHeader.frameCommand & 0x8000) != 0)) {
+                        spFrameData.frameHeader.respStatus = (SerialProtocolRespStatus)(uartTaskData->frameData[FRAME_ID_LENGTH + FRAME_COMMAND_LENGTH + FRAME_RESP_STAT_LENGTH]);
                     }
-
                     if (frameBytesCount >= FRAME_HEADER_LENGTH) {
-                        spFrameData.frameDataLength = CONVERT_BYTES_TO_SHORT_WORD (
-                        &(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH]));
-                        frameTotalLength = FRAME_HEADER_LENGTH +
-                        spFrameData.frameDataLength + FRAME_CRC_LENGTH;
-                        receverState = srRecieveData;
+                        spFrameData.frameHeader.frameDataLength = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[FRAME_HEADER_LENGTH - FRAME_RESP_STAT_LENGTH - FRAME_DATALEN_LENGTH]));
+                        frameTotalLength                        = FRAME_HEADER_LENGTH + spFrameData.frameHeader.frameDataLength + FRAME_CRC_LENGTH;
+                        receverState                            = srRecieveData;
                     } else {
                         proceed = pdFALSE;
                     }
@@ -210,10 +208,8 @@ void UartRxTask (void* argument) {
                 break;
             case srCheckCrc:
                 osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
-                frameCrc = CONVERT_BYTES_TO_SHORT_WORD (
-                &(uartTaskData->frameData[frameTotalLength - FRAME_CRC_LENGTH]));
-                crc = HAL_CRC_Calculate (&hcrc, (uint32_t*)(uartTaskData->frameData),
-                frameTotalLength - FRAME_CRC_LENGTH);
+                frameCrc = CONVERT_BYTES_TO_SHORT_WORD (&(uartTaskData->frameData[frameTotalLength - FRAME_CRC_LENGTH]));
+                crc      = HAL_CRC_Calculate (&hcrc, (uint32_t*)(uartTaskData->frameData), frameTotalLength - FRAME_CRC_LENGTH);
                 osMutexRelease (uartTaskData->rxDataBufferMutex);
                 crcPass = frameCrc == crc;
                 if (crcPass) {
@@ -226,18 +222,21 @@ void UartRxTask (void* argument) {
                 }
                 break;
             case srExecuteCmd:
-                if ((uartTaskData->processDataQueue != NULL) ||
-                (uartTaskData->processDataCb != NULL)) {
+                if (/*(uartTaskData->processDataQueue != NULL) || */(uartTaskData->processDataCb != NULL) || (uartTaskData->processRxDataMsgBuffer != NULL)) {
                     osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
-                    memcpy (spFrameData.dataBuffer,
-                    &(uartTaskData->frameData[FRAME_HEADER_LENGTH]),
-                    spFrameData.frameDataLength);
+                    memcpy (spFrameData.dataBuffer, &(uartTaskData->frameData[FRAME_HEADER_LENGTH]), spFrameData.frameHeader.frameDataLength);
                     osMutexRelease (uartTaskData->rxDataBufferMutex);
                 }
 
-                if (uartTaskData->processDataQueue != NULL) {
-                    osMessageQueuePut (uartTaskData->processDataQueue,
-                    &spFrameData, 0, osWaitForever);
+//                if (uartTaskData->processDataQueue != NULL) {
+//                    osMessageQueuePut (uartTaskData->processDataQueue, &spFrameData, 0, osWaitForever);
+//                }
+                if (uartTaskData->processRxDataMsgBuffer != NULL) {
+                    if(xMessageBufferSend (uartTaskData->processRxDataMsgBuffer, &spFrameData, sizeof (SerialProtocolFrameHeader) + spFrameData.frameHeader.frameDataLength, pdMS_TO_TICKS (200)) == pdFALSE)
+                    {
+                    	receverState = srFail;
+                    	break;
+                    }
                 }
                 if (uartTaskData->processDataCb != NULL) {
                     uartTaskData->processDataCb (uartTaskData, &spFrameData);
@@ -247,18 +246,20 @@ void UartRxTask (void* argument) {
             case srFail:
                 dataToSend = 0;
                 if ((frameTimeout == pdTRUE) && (frameBytesCount > 2)) {
-                    dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameId,
-                    spFrameData.frameCommand, spTimeout, NULL, 0);
+                    dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spTimeout, NULL, 0);
 #if UART_TASK_LOGS
                     printf ("Uart%d: RX data receiver timeout!\n", uartTaskData->uartNumber);
 #endif
                 } else if (!crcPass) {
-                    dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameId,
-                    spFrameData.frameCommand, spCrcFail, NULL, 0);
+                    dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spCrcFail, NULL, 0);
 #if UART_TASK_LOGS
                     printf ("Uart%d: Frame CRC FAIL\n", uartTaskData->uartNumber);
 #endif
                 }
+                else
+                {
+                	dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData.frameHeader.frameId, spFrameData.frameHeader.frameCommand, spInternalError, NULL, 0);
+                }
                 if (dataToSend > 0) {
                     HAL_UART_Transmit_IT (&huart8, uart8TxBuffer, dataToSend);
                 }
@@ -272,11 +273,11 @@ void UartRxTask (void* argument) {
                 osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
                 uartTaskData->frameBytesCount = 0;
                 osMutexRelease (uartTaskData->rxDataBufferMutex);
-                spFrameData.frameCommand = spUnknown;
-                frameTotalLength         = 0;
-                outputDataBufferPos      = 0;
-                receverState             = srWaitForHeader;
-                proceed                  = pdFALSE;
+                spFrameData.frameHeader.frameCommand = spUnknown;
+                frameTotalLength                     = 0;
+                outputDataBufferPos                  = 0;
+                receverState                         = srWaitForHeader;
+                proceed                              = pdFALSE;
                 break;
             }
         }
@@ -286,30 +287,23 @@ void UartRxTask (void* argument) {
 void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFrameData) {
     UartTaskData* uartTaskData = (UartTaskData*)arg;
     uint16_t dataToSend        = 0;
-    switch (spFrameData->frameCommand) {
-    case spGetAllMeasurments:
+    switch (spFrameData->frameHeader.frameCommand) {
+    case spGetElectricalMeasurments:
         float slaveVoltage = 48.0 + rndflt (0.5);
-        WriteDataToBuffer (
-        outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
         slaveVoltage = 48.0 + rndflt (1);
-        WriteDataToBuffer (
-        outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
+        WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
+        WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
         slaveVoltage = 47.5 + rndflt (0.5);
-        WriteDataToBuffer (
-        outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
+        WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &slaveVoltage, sizeof (float));
         break;
-    case spGetVoltageMeasurments: break;
-    case spGetCurrentMeasurments: break;
-    case spGetPowerMeasurments: break;
-    case spGetPVTemperatureMeasurment: break;
+    case spGetSensorMeasurments: break;
     default: break;
     }
     if (outputDataBufferPos > 0) {
-        dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData->frameId,
-        spFrameData->frameCommand, spOK, outputDataBuffer, outputDataBufferPos);
+        dataToSend = PrepareRespFrame (uart8TxBuffer, spFrameData->frameHeader.frameId, spFrameData->frameHeader.frameCommand, spOK, outputDataBuffer, outputDataBufferPos);
     }
     if (dataToSend > 0) {
-        //		HAL_UART_Transmit_DMA(&huart8, uart8TxBuffer, dataToSend);
+        //        HAL_UART_Transmit_DMA(&huart8, uart8TxBuffer, dataToSend);
         HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, dataToSend);
     }
 #if UART_TASK_LOGS
@@ -318,7 +312,62 @@ void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFra
 }
 
 void UartTxTask (void* argument) {
+    UartTaskData* const uartTaskData  = (UartTaskData*)argument;
+    InterProcessData data             = { 0 };
+    SerialProtocolFrameData frameData = { 0 };
+    size_t bytesInMsg;
+    uint16_t frameId                    = 0;
+    uint32_t rndVal                     = 0;
+    uint16_t bytesToSend                = 0;
+    SerialProtocolCommands frameCommand = spUnknown;
+
     while (pdTRUE) {
-        osDelay (pdMS_TO_TICKS (1000));
+        if (uartTaskData->sendCmdToSlaveQueue != NULL) {
+            osMessageQueueGet (uartTaskData->sendCmdToSlaveQueue, &data, 0, osWaitForever);
+            HAL_RNG_GenerateRandomNumber (&hrng, &rndVal);
+            frameId      = (uint16_t)(rndVal & 0xFFFF);
+            frameCommand = data.spCommand;
+            outputDataBufferPos = 0;
+            memset(outputDataBuffer, 0x00, OUTPUT_DATA_BUFF_SIZE);
+            switch(frameCommand)
+            {
+            case spSetFanSpeed:
+            case spSetMotorXOn:
+            case spSetMotorYOn:
+            	WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float));
+            	WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[1], sizeof (float));
+            	break;
+            case spSetDiodeOn:
+            	WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float));
+            	break;
+            case spSetmotorXMaxCurrent:
+            case spSetmotorYMaxCurrent:
+            	WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.flaotValues.value[0], sizeof (float));
+            	break;
+            case spGetElectricalMeasurments:
+            case spGetSensorMeasurments:
+            	break;
+            default:
+            	continue;
+            	break;
+            }
+
+			bytesToSend  = PrepareReqFrame (uart8TxBuffer, frameId, frameCommand, outputDataBuffer, outputDataBufferPos);
+			HAL_UART_Transmit_IT (uartTaskData->huart, uart8TxBuffer, bytesToSend);
+			bytesInMsg = xMessageBufferReceive (uartTaskData->processRxDataMsgBuffer, &frameData, INPUT_DATA_BUFF_SIZE, pdMS_TO_TICKS (1000));
+			if(bytesInMsg == 0)
+			{
+				printf("Response timeout for frameId 0x%x\n", frameId);
+			}
+			else
+			{
+				if ( (frameId == frameData.frameHeader.frameId) && (frameData.frameHeader.respStatus == spOK))
+				{
+					printf("Response for frameId 0x%x OK\n", frameId);
+				}
+			}
+        } else {
+            osDelay (pdMS_TO_TICKS (1000));
+        }
     }
 }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 4 - 1
OZE_Main/Debug/Core/Src/subdir.mk


Dosya farkı çok büyük olduğundan ihmal edildi
+ 78056 - 70154
OZE_Main/Debug/OZE_Main.list


Dosya farkı çok büyük olduğundan ihmal edildi
+ 3805 - 3197
OZE_Main/Debug/OZE_Main.map


+ 1 - 0
OZE_Main/Debug/objects.list

@@ -1,3 +1,4 @@
+"./Core/Src/cJSON.o"
 "./Core/Src/freertos.o"
 "./Core/Src/main.o"
 "./Core/Src/mock_tasks.o"