Преглед на файлове

Проходной коммит

TelenkovDmitry преди 1 година
родител
ревизия
fbad7a6dc4

+ 107 - 0
iap/modules/iap/iap.c

@@ -0,0 +1,107 @@
+#include "at32f403a_407.h"
+#include "iap.h"
+#include "common_config.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include "semphr.h"
+#include "fr_timers.h"
+#include "mb.h"
+#include "mbport.h"
+#include "mbrtu.h"
+#include <stdio.h>
+
+
+SemaphoreHandle_t flash_sem;
+TimerHandle_t led_timer_handle;
+
+void led_timer(TimerHandle_t timer);
+void iap_task(void *params);
+
+
+//
+void iap_init(void)
+{
+    flash_sem = xSemaphoreCreateBinary();
+    
+    led_timer_handle = xTimerCreate("led_timer", 500, pdTRUE, (void *)0, led_timer);
+    xTimerStart(led_timer_handle, 0);
+    
+    xTaskCreate(iap_task, "iap_task", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+}
+
+//
+void iap_task(void *params)
+{
+    for (;;)
+    {
+        vTaskDelay(1000);
+    }
+}
+
+
+
+
+void led_timer(TimerHandle_t timer)
+{
+    
+}
+
+//
+// 65 (0x41) Read Input Registers	 
+eMBErrorCode
+eMBUpdateCB( UCHAR * pucFrame, USHORT * usLen)
+{
+	int res;
+				
+	switch (pucFrame[1]) 
+	{
+		case 1:
+
+			//pucFrame[1] = iap_start(&pucFrame[2], *usLen);
+			*usLen = 2;
+			return MB_ENOERR;
+
+        break;
+
+		case 2:
+#if 0			
+            res = iap_block(&pucFrame[2], *usLen);
+            
+            osSemaphoreWait(flash_sem, 500);
+            
+            if (flash_err_flag) {
+                pucFrame[1] = MB_BOOT_FLASH_ERR;
+                xEventGroupSetBits(event, IAP_FLASH_ERROR);
+            }
+            else if (res == MB_BOOT_ERR_NO)
+                pucFrame[1] = WRITE_BLOCK_COM;
+            else if (res == MB_BOOT_ERR_WRONG_KEY)
+                pucFrame[1] = MB_BOOT_ERR_WRONG_KEY;
+            else if (res == MB_BOOT_WRONG_PACK_INDEX)
+                pucFrame[1] = MB_BOOT_WRONG_PACK_INDEX;
+            
+			*usLen = 2;
+#endif
+			return MB_ENOERR;
+
+        break;
+
+		case 3:
+#if 0
+            res = check_crc();
+          
+            if (res == MB_BOOT_ERR_WRONG_FW_CRC)
+                pucFrame[1] = WRITE_BLOCK_COM;
+            else 
+                iap_finish();
+            
+			*usLen = 2;
+#endif            
+			return MB_ENOERR;
+			
+		break;
+
+		default:
+			return MB_EPORTERR;
+	}
+}

+ 12 - 0
iap/modules/iap/iap.h

@@ -0,0 +1,12 @@
+#ifndef __IAP_H
+#define __IAP_H
+
+
+
+//
+void iap_init(void);
+
+
+
+
+#endif // __IAP_H

+ 41 - 99
iap/modules/modbus/modbus.c

@@ -9,6 +9,7 @@
 #include "mbrtu.h"
 #include "tim_delay.h"
 #include "settings_api.h"
+#include "iap.h"
 #include <stdio.h>
 #include <string.h>
 #include <stdbool.h>
@@ -39,15 +40,20 @@ bool mb_package_flag = false;
 //
 void mb_init(void)
 {
-    uint32_t baud = 115200;
-    eMBParity par = MB_PAR_NONE;
+    uint32_t baud;
+    eMBParity par;
     UCHAR mb_addr = 1;
     unsigned int stop_bits = 1;
 	const UCHAR ucSlaveID[] = {0xAA, 0xBB, 0xCC};
+
+    iap_init();
     
 	mb_init_params();
 
     settings_set_modbus_params(settings.com_settings.mb_port);
+
+    baud = settings_get_mb_baud(&mb_port_settings);
+    par = settings_get_mb_par(&mb_port_settings);
     
     mb_helper_tim_init(baud);
     eMBInit(MB_RTU, mb_addr, 4, baud, par, stop_bits);
@@ -220,24 +226,48 @@ void modbus_port_timer(void const * params)
 //						Modbus callback's
 // ------------------------------------------------------------------- //
 
-//
-// 65 (0x41) Read Input Registers	 
+
+// 04 (0x04) Read Input Registers	 
 eMBErrorCode
-eMBUpdateCB( UCHAR * pucFrame, USHORT * usLen)
+eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
 {
-	eMBErrorCode    eStatus = MB_ENOERR;
+    return MB_ENOREG;
+}
 
-    mb_package_flag = true;
-    
-    return eStatus;
+
+// 03 (0x03) Read Holding Registers
+// 16 (0x10) Write Multiple registers
+#if 0
+eMBErrorCode
+eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
+{
+    return MB_ENOREG;
+}
+#endif
+
+// 17 (0x11) Report Slave ID (Serial Line only) 
+eMBException
+eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen )
+{
+    return MB_EX_ILLEGAL_FUNCTION;
 }
 
+
+// чтение/запись значений из нескольких регистров флагов (Coil Status).
+// чтения N регистров параметров
 eMBErrorCode
-eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
+eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
 {
-	return MB_ENOREG;
+    return MB_ENOREG;
 }
 
+eMBErrorCode
+eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
+{
+    return MB_ENOREG;
+}
+
+
 
 // 03 (0x03) Read Holding Registers
 // чтение N регистров управления и уставок
@@ -323,93 +353,5 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 	return eStatus;
 }
 
-// 17 (0x11) Report Slave ID (Serial Line only) 
-// чтение информации об устройстве (0x11)
-eMBException
-eMBFuncReportSlaveID( UCHAR * pucFrame, USHORT * usLen )
-{
-#if 0
-    mb_package_flag = true;
-    
-	*usLen = mb_get_info(&pucFrame[1]) + 3;
-#endif
-	return MB_EX_NONE;
-}
-
-
-// чтение/запись значений из нескольких регистров флагов (Coil Status).
-// чтения N регистров параметров
-eMBErrorCode
-eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
-{
-    return MB_ENOREG;
-}
-
-eMBErrorCode
-eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
-{
-    return MB_ENOREG;
-}
-
-
-// 0x42
-// Запрос на изменение адреса
-// Если запрос широковещательный, то нужно проверить присланный ID.
-eMBException    
-eMBSetAddrIdCB( UCHAR * pucFrame, USHORT * usLen )
-{
-#if 0  
-    mb_package_flag = true;
-    
-    if (rcvAddress == MB_ADDRESS_BROADCAST)
-    {
-        if (mb_set_addr_id(&pucFrame[1], &new_slave_addr))
-            mb_action = MB_CHANGE_ADDR;
-    }
-    // Адресный запрос. ID не проверяем
-    else
-    {
-        if (mb_set_addr(&pucFrame[1], &new_slave_addr))
-        {
-            pucFrame[1] = new_slave_addr;
-            mb_action = MB_CHANGE_ADDR;
-        }
-        else 
-            pucFrame[1] = MB_BOOT_ERR_WRONG_CONTENT;
-    }
-    
-    *usLen = 2;
-#endif    
-    return MB_EX_NONE;
-}
-
 
-// 0x43
-eMBException
-eMBSetAddrSerialCB( UCHAR * pucFrame, USHORT * usLen )
-{
-#if 0  
-    mb_package_flag = true;
-      
-    if (rcvAddress == MB_ADDRESS_BROADCAST)
-    {
-        if (mb_set_addr_serial(&pucFrame[1], &new_slave_addr))
-            mb_action = MB_CHANGE_ADDR;
-    }
-    // Адресный запрос. ID не проверяем
-    else
-    {
-        if (mb_set_addr(&pucFrame[1], &new_slave_addr))
-        {
-            pucFrame[1] = new_slave_addr;
-            mb_action = MB_CHANGE_ADDR;
-        }
-        else 
-            pucFrame[1] = MB_BOOT_ERR_WRONG_CONTENT;
-    }
-    
-    *usLen = 2;
-#endif    
-    return MB_EX_NONE;
-}
 

+ 76 - 0
iap/modules/settings/settings_api.c

@@ -289,3 +289,79 @@ void settings_erase_flash_sector(void)
         DBG printf("SETTINGS_EraseFlashSector error: status = %d/r/n", status);
     }
 }
+
+//
+uint32_t settings_get_mb_baud(modbus_t *mb_settings)
+{
+    switch (mb_settings->baud)
+    {
+        case BRD_1200 :
+          return 1200;
+        break;
+        
+        case BRD_2400 :
+          return 2400;
+        break;
+        
+        case BRD_4800 :
+            return 4800;
+        break;
+        
+        case BRD_9600 :
+            return 9600;
+        break;
+        
+        case BRD_19200 :
+            return 19200;
+        break;
+        
+        case BRD_38400 :
+            return 38400;
+        break;
+        
+        case BRD_57600 :
+            return 57600;
+        break;
+        
+        case BRD_115200 :
+            return 115200;
+        break;
+        
+        case BRD_230400 :
+            return 230400;
+        break;
+        
+        case BRD_460800 :
+            return 460800;
+        break;
+        
+        default :
+            return 115200; 
+        break;
+    }
+}
+
+
+//
+eMBParity settings_get_mb_par(modbus_t *mb_settings)
+{
+    switch (mb_settings->parity)
+    {
+        case NO_PAR :
+            return MB_PAR_NONE;
+        break;
+        
+        case ODD_PAR :
+            return MB_PAR_ODD;
+        break;
+        
+        case EVEN_PAR :
+            return MB_PAR_EVEN;
+        break;
+        
+        default :
+            return MB_PAR_NONE;
+        break;
+    }
+}
+

+ 6 - 2
iap/modules/settings/settings_api.h

@@ -5,7 +5,8 @@
 #include <stdbool.h>
 #include "usart.h"
 #include "sys_api.h"
-
+#include "mb.h"
+#include "mbport.h"
 
 
 
@@ -85,8 +86,11 @@ void settings_write_to_flash(uint8_t *data, uint32_t size);
 // Очистка сектора настроек
 void settings_erase_flash_sector(void);
 
+//
+uint32_t settings_get_mb_baud(modbus_t *mb_settings);
 
-
+//
+eMBParity settings_get_mb_par(modbus_t *mb_settings);
 
 // Системные настройки
 extern sys_settings_t sys_settings;

Файловите разлики са ограничени, защото са твърде много
+ 129 - 123
project/ewarm/iap/iap.dep


+ 7 - 0
project/ewarm/iap/iap.ewp

@@ -372,6 +372,7 @@
                     <state>$PROJ_DIR$\..\..\..\shared\freemodbus\rtu</state>
                     <state>$PROJ_DIR$\..\..\..\iap\modules\modbus</state>
                     <state>$PROJ_DIR$\..\..\..\iap\modules\settings</state>
+                    <state>$PROJ_DIR$\..\..\..\iap\modules\iap</state>
                     <state>$PROJ_DIR$\..\..\..\iap\user</state>
                     <state>$PROJ_DIR$\..\..\..\libs\thirdparty\freertos\include</state>
                     <state>$PROJ_DIR$\..\..\..\libs\thirdparty\freertos\portable\IAR\ARM_CM4F</state>
@@ -2132,6 +2133,12 @@
         <name>iap</name>
         <group>
             <name>modules</name>
+            <group>
+                <name>iap</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\..\iap\modules\iap\iap.c</name>
+                </file>
+            </group>
             <group>
                 <name>modbus</name>
                 <file>

+ 6 - 0
project/ewarm/iap/iap.ewt

@@ -2373,6 +2373,12 @@
         <name>iap</name>
         <group>
             <name>modules</name>
+            <group>
+                <name>iap</name>
+                <file>
+                    <name>$PROJ_DIR$\..\..\..\iap\modules\iap\iap.c</name>
+                </file>
+            </group>
             <group>
                 <name>modbus</name>
                 <file>

+ 1 - 0
project/ewarm/module_universal_io.dep

@@ -616,6 +616,7 @@
             <file>$PROJ_DIR$\..\..\iap\modules\settings\settings_api.h</file>
             <file>$PROJ_DIR$\..\..\shared\peripherals\src\common_gpio.c</file>
             <file>$PROJ_DIR$\..\..\shared\peripherals\inc\common_gpio.h</file>
+            <file>$PROJ_DIR$\..\..\iap\modules\iap\iap.c</file>
             <file>$PROJ_DIR$\..\..\iap\modules\modbus\modbus.c</file>
         </outputs>
         <file>

Някои файлове не бяха показани, защото твърде много файлове са промени