Browse Source

Temp commit

Dmitry Telenkov 1 month ago
parent
commit
e5f9cd7291

+ 1 - 1
.gdbinit_bt6710_service

@@ -1,5 +1,5 @@
 target remote localhost:3333
 target remote localhost:3333
-file build/bt6702_service/stm32bt6710service/stm32bt6710service.elf
+file build/bt6702_service/stm32bt6721service/stm32bt6721service.elf
 load
 load
 break Reset_Handler
 break Reset_Handler
 
 

+ 4 - 0
.gdbinit_service

@@ -0,0 +1,4 @@
+target remote localhost:3333
+file build/bt6702_service/stm32bt6721service/stm32bt6721service.elf
+load
+break Reset_Handler

+ 2 - 1
.vscode/settings.json

@@ -55,7 +55,8 @@
         "string_view": "c",
         "string_view": "c",
         "initializer_list": "c",
         "initializer_list": "c",
         "board_bt6711_v1.h": "c",
         "board_bt6711_v1.h": "c",
-        "freertos.h": "c"
+        "freertos.h": "c",
+        "syslog.h": "c"
     },
     },
     "cmake.sourceDirectory": "/home/ebalbekova/my_project/bt-67xx_universal_hw/thirdparty/PolarSSL"
     "cmake.sourceDirectory": "/home/ebalbekova/my_project/bt-67xx_universal_hw/thirdparty/PolarSSL"
 }
 }

+ 4 - 0
Makefile

@@ -96,6 +96,10 @@ fullflash_6721:
 	sleep 1
 	sleep 1
 	st-flash --reset write output/stm32bt6721.bin 0x8020000
 	st-flash --reset write output/stm32bt6721.bin 0x8020000
 
 
+serviceflash:
+	st-flash --reset write output/iap.bin 0x8000000
+	sleep 1
+	st-flash --reset write output/stm32bt6721service.bin 0x8020000
 
 
 release_6703:
 release_6703:
 	$(MAKE) -C modules HARDWARE=bt6703 VERBOSE=1 DEBUG=0 PRINTF=custom MAC=EC-4C-4D-00-80-0A release
 	$(MAKE) -C modules HARDWARE=bt6703 VERBOSE=1 DEBUG=0 PRINTF=custom MAC=EC-4C-4D-00-80-0A release

+ 2 - 4
config/board_bt6721.h

@@ -279,8 +279,8 @@ typedef enum {
 #define BAT_CONNECT_MONITOR
 #define BAT_CONNECT_MONITOR
 #define UPS_CONNECT_MONITOR
 #define UPS_CONNECT_MONITOR
 #define TEST_ALARM_AKB_MONITOR
 #define TEST_ALARM_AKB_MONITOR
-#define PHASE_FAIL_MONITOR
-#define EPO_MONITOR
+//#define PHASE_FAIL_MONITOR
+//#define EPO_MONITOR
 #define OVERTEMPRATURE_MONITOR
 #define OVERTEMPRATURE_MONITOR
 #define INVERTERHIGHVOLTAGE_MONITOR
 #define INVERTERHIGHVOLTAGE_MONITOR
 
 
@@ -294,8 +294,6 @@ typedef enum {
   XMONITOR(UPS_TemperatureHighRangeMonitor,     (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_TemperatureHighRangeMonitor,     (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_TemperatureLowRangeMonitor,      (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_TemperatureLowRangeMonitor,      (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_BatteryConnectMonitor,           (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_BatteryConnectMonitor,           (UPS.Present == UPS_CONNECTED)) \
-  XMONITOR(UPS_PhaseFailMonitor,                (UPS.Present == UPS_CONNECTED)) \
-  XMONITOR(UPS_EPOMonitor,                      (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_OverTempratureMonitor,           (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_OverTempratureMonitor,           (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_InventerHighVoltageMonitor,      (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_InventerHighVoltageMonitor,      (UPS.Present == UPS_CONNECTED)) \
   XMONITOR(UPS_ConnectMonitor,                  1)
   XMONITOR(UPS_ConnectMonitor,                  1)

+ 1 - 1
iap/Makefile

@@ -46,7 +46,7 @@ CSRC += $(wildcard ../stm32/stm32f4x7_ethernet/*.c)
 CSRC += $(wildcard User/*.c)
 CSRC += $(wildcard User/*.c)
 CSRC += $(wildcard stm32sprog/*.c)
 CSRC += $(wildcard stm32sprog/*.c)
 CSRC += $(wildcard ../thirdparty/TinyStdio/*.c)
 CSRC += $(wildcard ../thirdparty/TinyStdio/*.c)
-CSRC += ../peripheral_modules/src/spi_flash.c
+#CSRC += ../peripheral_modules/src/spi_flash.c
 #---
 #---
 
 
 CSRC += $(wildcard syscalls/syscalls.c)
 CSRC += $(wildcard syscalls/syscalls.c)

+ 415 - 0
iap/Modules/spi_flash.c

@@ -0,0 +1,415 @@
+#include "stm32f4xx_conf.h"
+#include "stm32f4xx.h"
+#include <stddef.h>
+#include <unistd.h>
+
+#include "spi_flash.h"
+#include "gpio.h"
+
+/*
+struct {
+	uint8_t *tx;
+	uint8_t *rx;
+	uint16_t tx_len;
+	uint16_t rx_len;
+	uint8_t rx_skip;
+	TN_SEM ready;
+	TN_MUTEX busy;
+} xact;
+
+void SPI2_IRQHandler(void) {
+	uint32_t status = SPI2->SR;
+	uint8_t b;
+
+	if (!xact.tx_len && !xact.rx_len) {
+		SPI2->CR1 &= ~SPI_CR1_SPE;
+		SPI2->CR2 &= ~(SPI_CR2_TXEIE | SPI_CR2_RXNEIE);
+		tn_sem_isignal(&xact.ready);
+		return;
+	}
+
+	if (status & SPI_SR_RXNE) {
+		b = SPI2->DR;
+		if (!xact.tx_len) {
+			if (xact.rx_skip) {
+				xact.rx_skip--;
+			}
+			else if (xact.rx_len) {
+				*(xact.rx++) = b;
+				xact.rx_len--;
+			}
+		}
+	}
+
+	if (status & SPI_SR_TXE) {
+		if (xact.tx_len) {		// have smth for tx
+			SPI2->DR = *(xact.tx++);
+			xact.tx_len--;
+		}
+		else if (xact.rx_len) {
+			SPI2->DR = 0;
+		}
+	}
+}
+*/
+
+#define SPI_FLASH_CS_L() gpio_set(SPI2_NSS, 0)
+#define SPI_FLASH_CS_H() gpio_set(SPI2_NSS, 1)
+
+
+//static TN_MUTEX spi_mutex;
+
+#define RX_TX_DELLAY_MS		50
+
+static uint8_t spi_tx_rx(uint8_t byte) {
+	while (!(SPI2->SR & SPI_SR_TXE)) {}
+	SPI2->DR = byte;
+		
+	while (!(SPI2->SR & SPI_SR_RXNE)) {}
+	return SPI2->DR;
+}
+
+static void spi_cs_up(void) {
+	SPI2->CR1 &= ~SPI_CR1_SPE;
+//	GPIOB->BSRR = 1 << 12;
+}
+
+static void spi_cs_down(void) {
+//	GPIOB->BRR = 1 << 12;
+	SPI2->CR1 |= SPI_CR1_SPE;
+}
+
+static void spi_init_(void) {
+//	tn_mutex_create(&spi_mutex, TN_MUTEX_ATTR_INHERIT, 0);
+	//tn_sem_create(&xact.ready, 0, 1);
+
+	RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
+	RCC->APB1RSTR |= RCC_APB1RSTR_SPI2RST;
+	RCC->APB1RSTR &= ~RCC_APB1RSTR_SPI2RST;
+
+	SPI2->CR1 &= ~SPI_CR1_SPE;
+	//SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI;
+	SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI;
+	SPI2->CR2 = 0;//SPI_CR2_SSOE;
+	SPI2->CR1 |= SPI_CR1_SPE;
+}
+
+#define CMD_WREN	0x06
+#define CMD_WRDI	0x04
+#define CMD_WRSR	0x01
+#define CMD_RDSR	0x05
+#define CMD_READ	0x03
+#define CMD_SE		0x20
+#define CMD_BE		0x52
+#define CMD_CE		0x60
+#define CMD_PP		0x02
+#define CMD_RDSFDP	0x5A
+
+#define SR_WIP	(1 << 0)
+#define SR_WEL	(1 << 1)
+#define SR_SRWD	(1 << 7)
+
+spi_flash_desc_t spi_flash_desc;
+
+static inline void wait_write_enable(void) {
+	uint8_t status;
+//	spi_cs_down();
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_RDSR);
+	do {
+		status = spi_tx_rx(0);
+	} while (!(status & SR_WEL));
+//	spi_cs_up();
+	SPI_FLASH_CS_H();
+}
+
+static inline void wait_write_end(void) {
+	uint8_t status;
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_RDSR);
+	do {
+		status = spi_tx_rx(0);
+	} while (status & SR_WIP);
+	SPI_FLASH_CS_H();
+}
+
+static inline void send_addr(int addr) {
+	spi_tx_rx((addr >> 16) & 0xFF);
+	spi_tx_rx((addr >> 8) & 0xFF);
+	spi_tx_rx(addr & 0xFF);
+}
+
+static int spi_flash_read_sfdp(int addr, void *buf, size_t len) {
+    uint8_t* foo = (uint8_t *)buf;
+    SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_RDSFDP);
+	send_addr(addr);
+	spi_tx_rx(0);
+	while (len--)
+		//*((uint8_t *)buf++) = spi_tx_rx(0);
+      *(foo++) = spi_tx_rx(0);
+    SPI_FLASH_CS_H();
+	return 0;
+}
+
+ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout) {
+    uint8_t* foo = (uint8_t *)buf;
+	ssize_t ret = 0;
+//	ret = tn_mutex_lock(&spi_mutex, timeout);
+//	if (ret != TERR_NO_ERR)
+//		return ret;
+
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_READ);
+	send_addr(addr);
+	while (len--)
+		//*((uint8_t *)buf++) = spi_tx_rx(0);
+        *(foo++) = spi_tx_rx(0);
+	SPI_FLASH_CS_H();
+//	tn_mutex_unlock(&spi_mutex);
+	return len;
+}
+
+#define TIMEOUT 10000
+
+uint16_t spi_flash_pp(int addr, const void *buf, size_t len, uint32_t timeout) {
+    uint8_t* foo = (uint8_t *)buf;
+//	ret = tn_mutex_lock(&spi_mutex, timeout);
+//	if (ret != TERR_NO_ERR)
+//		return ret;
+	// don't allow page wrapping
+	ssize_t ret = 0;
+	if ((addr & 0xFF) + len > 0xFF)
+	    len = 0x100 - (addr & 0xFF);
+	ret = len;
+
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_WREN);
+	SPI_FLASH_CS_H();
+
+	wait_write_enable();
+
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_PP);
+	send_addr(addr);
+	while (len--)
+	    //spi_tx_rx(*((uint8_t *)buf++));
+        spi_tx_rx(*(foo++));
+	SPI_FLASH_CS_H();
+
+	wait_write_end();
+
+//	tn_mutex_unlock(&spi_mutex);
+	return ret;
+}
+
+ssize_t spi_flash_write(int addr, const void *buf, size_t len, uint32_t timeout) {
+    uint8_t* foo = (uint8_t *)buf;
+	int ret = 0, offset = 0;
+	do {
+	    //ret = spi_flash_pp(addr + offset, buf + offset, len - offset, 0);
+        ret = spi_flash_pp(addr + offset, foo + offset, len - offset, 0);
+	    offset += ret;
+	} while (len - offset);
+	return 0;
+}
+
+int spi_flash_chip_erase(uint32_t timeout) {
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_WREN);
+	SPI_FLASH_CS_H();
+	wait_write_enable();
+
+    	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_CE);
+	SPI_FLASH_CS_H();
+
+	wait_write_end();
+	return 0;
+}
+
+int spi_flash_erase_sector(int addr, uint32_t timeout) {
+	int ret = 0;
+//	ret = tn_mutex_lock(&spi_mutex, timeout);
+//	if (ret != TERR_NO_ERR)
+//		return ret;
+
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_WREN);
+	SPI_FLASH_CS_H();
+
+	wait_write_enable();
+
+	SPI_FLASH_CS_L();
+	spi_tx_rx(CMD_SE);
+	send_addr(addr);
+	SPI_FLASH_CS_H();
+
+	wait_write_end();
+
+//	tn_mutex_unlock(&spi_mutex);
+	return 0;
+}
+/*
+bool spi_flash_init(void) {
+	uint32_t i, ptable, bitsize = 0;
+	uint8_t tmp[4];
+
+	spi_flash_desc.present = false;
+
+	spi_init_();
+
+	// check SFDP magic
+	spi_flash_read_sfdp(0, tmp, 4);
+	if (!(tmp[0] == 0x53 && tmp[1] == 0x46 &&
+		tmp[2] == 0x44 && tmp[3] == 0x50))
+		return 0;
+
+	// get parameter headers count
+	spi_flash_read_sfdp(0x06, tmp, 1);
+
+	// find first jedec pheader (with ID == 0)
+	for (ptable = 0x08, i = 0; i <= tmp[0]; i++, ptable += 8) {
+		spi_flash_read_sfdp(ptable, tmp, 1);
+		if (tmp[0] == 0)
+			break;
+	}
+
+	// read ptable pointer from pheader
+	spi_flash_read_sfdp(ptable + 4, &ptable, 3);
+
+	// get flash density (size in bits)
+	if (spi_flash_read_sfdp(ptable + 4, &bitsize, 4) < 0 || !bitsize)
+		return 0;
+
+	// find smallest available sector
+	for (i = 0; i < 4; i++) {
+		tmp[0] = 0;
+		if (spi_flash_read_sfdp(ptable + 0x1C + i*2, &tmp, 2) >= 0 &&
+				tmp[0]) {
+			spi_flash_desc.sector_size = 1 << tmp[0];
+			spi_flash_desc.sector_erase_op = tmp[1];
+			spi_flash_desc.sector_count = (bitsize + 1) >> (3 + tmp[0]);
+			break;
+		}
+	}
+	if (!spi_flash_desc.sector_size)
+		return 0;
+
+	spi_flash_desc.present = true;
+    
+    return 1;
+
+}*/
+
+bool spi_flash_init(void){
+	spi_init_();
+	spi_flash_desc.sector_size = SPI_FLASH_SECTOR_SIZE;
+	spi_flash_desc.sector_erase_op = 32;
+	spi_flash_desc.sector_count = 512;
+	spi_flash_desc.present = true;
+
+	return 1;
+}
+
+uint8_t txbuf1[] = "This film came out on DVD yesterday and I rushed to buy it. \
+		    This version is the first to render all the detail and perfection \
+		    of Jack Cardiff's amazing compositions and brilliant, varied photography. \
+		    As a collection of memorable images, this film is better than any comparable \
+		    historical epic of the period and even gives GWTW a run for its money. \
+		    King Vidor's direction is a series of 'tableaux vivants' where the \
+		    characters are not posing but acting in a very natural, period-specific way. \
+		    I have never had a problem with this adaptation of Tolstoy's novel. \
+		    I think it is a wonderful introduction to the period and the novel and that \
+		    it is a very poetic, very original work in its own right. Henry Fonda's \
+		    characterization is especially moving, including great memorable interactions \
+		    with/reations to Mel Ferrer, Audrey Hepburn, Helmut Dantine and John Mills, but \
+		    all members of the cast are actually perfect. The harrowing last 45 minutes of \
+		    the film manage to convey a sense of history, a sense of grandeur as well as to \
+		    communicate very clearly Tolstoy's ideas about the meaning of life, by relying \
+		    mostly on the power of memorable images. The most conspicuous handicap of this movie, \
+		    in my opinion, is its soundtrack (in glorious mono). The barely hi-fi recording of \
+		    dialogues and music sounds pinched, hollow and tinny and it always has in very version \
+		    I have ever seen: in the theatres, on TV and on video. Even the soundtrack album is \
+		    an atrocity. In some scenes, before the necessary adjustments of bass and treble, \
+		    Audrey Hepburn's and Mel Ferrer's voices actually hurt your ear. Nino Rota's very \
+		    Russian-sounding score is serviceable and melodic, although rather sparse in its \
+		    orchestration and in the number of players. One can only wonder what 'War and Peace' \
+		    could have sounded like with a cohort of Hollywood arrangers, decent recording facilities \
+		    and lavish, varied orchestrations in true high fidelity and stereophonic sound. \
+		    According to Lukas Kendall of 'Film Score Monthly', the original recording elements \
+		    of the soundtrack have long ago disappeared, which is the common lot of international, \
+		    independent co-productions of the era. Someone somewhere is certainly guilty of \
+		    skimping on quality or embezzlement for this 1956 movie to sound so much worse \
+		    than a 1939, pre-hi-fi epic like GWTW. Like all VistaVision films, this one was \
+		    meant to be shown in Perspecta Stereophonic Sound where the mono dialog track was \
+		    meant to be channelled to three different directions, making it directional, while \
+		    the separate mono music + sound effects track was generally directed to all three \
+		    speakers at the same time. The results fooled the viewers into thinking everything \
+		    was in true stereo and the reproduction of the music was usually in very high fidelity. \
+		    Maybe the soundtrack used on the DVD is a mono reduction of those two separate tracks \
+		    that has squandered that fidelity and maybe the DVD can be issued again with better \
+		    results in some kind of 4.0 presentation. When they do, very little electronic \
+		    restoration work will be needed to make the image absolutely perfect. \
+		    But let's concentrate on the positive: This film is a summit of visual \
+		    splendour and its sets, costumes, colour photography, composition and lighting \
+            achieve, in every single scene, wonders of artistry, creativity and delicacy \
+		    But let's concentrate on the positive: This film is a summit of visual \
+		    splendour and its sets, costumes, colour photography, composition and lighting \
+		    achieve, in every single scene, wonders of artistry, creativity and delicacy \
+		    that will probably never be equalled. Suffice it to say that it has, \
+		    among many other treasures, a sunrise duel scene in the snow that still has viewers \
+		    wondering whether it was shot outdoors or in a studio and that will have them wondering foreverhsgkhgkshgu.\r\n";
+
+uint8_t txbuf2[] = "STM32F4xx SPI Firmware Library Example: communication with an M25P SPI FLASH\r\n";
+
+#define countof(a) (sizeof(a) / sizeof(*(a)))
+#define  bufsize1 (countof(txbuf1)-1)
+#define  bufsize2 (countof(txbuf2)-1)
+
+uint8_t  rxbuf1[bufsize1] = {0};
+uint8_t  rxbuf2[bufsize2] = {0};
+
+bool spi_flash_test(void) {
+
+	uint16_t i;
+    if (!spi_flash_init())
+	return false;
+    int ret = 0, addr = 0, offset = 0;
+    for(i = 0; i < 1; i ++){//spi_flash_desc.sector_count
+		//spi_flash_read(i*spi_flash_desc.sector_size, rxbuf1, bufsize1, 0);
+		spi_flash_erase_sector(i*spi_flash_desc.sector_size,0);
+		//spi_flash_read(0, rxbuf1, bufsize1, 0);
+
+		spi_flash_write(i*spi_flash_desc.sector_size, txbuf1, bufsize1, 0);
+
+		memset(rxbuf1, 0, bufsize1);
+		spi_flash_read(i*spi_flash_desc.sector_size, rxbuf1, bufsize1, 0);
+
+		if (memcmp(txbuf1, rxbuf1, bufsize1) != 0)
+		return false;
+
+    }
+    return true;
+    /*spi_flash_erase_sector(0,0);
+    spi_flash_read(0, rxbuf1, bufsize1, 0);
+
+    spi_flash_write(0, txbuf2, bufsize2, 0);
+
+    memset(rxbuf2, 0, bufsize2);
+    spi_flash_read(0, rxbuf2, bufsize2, 0);*/
+
+
+/*
+ * TODO restore spi_flash_init();
+	spi_flash_init();
+	if (!spi_flash_desc.present)
+		return -1;
+	printf("\tPresent: %d sectors, %d bytes per sector (%d bytes total)\n",
+		spi_flash_desc.sector_count,
+		spi_flash_desc.sector_size,
+		spi_flash_desc.sector_size * spi_flash_desc.sector_count);
+	return 0;
+*/
+    
+}

+ 54 - 0
iap/Modules/spi_flash.h

@@ -0,0 +1,54 @@
+#ifndef SPI_FLASH_H
+#define SPI_FLASH_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#ifdef PRINTF_STDLIB
+#include <stdio.h>
+#endif
+#ifdef PRINTF_CUSTOM
+#include "tinystdio.h"
+#endif
+
+#define SPI_FLASH_SECTOR_SIZE		        4096
+#define SPI_FLASH_SECTORS_IN_BLOCK_NUMBER   16
+#define SPI_FLASH_BLOCK_SIZE                16//4
+#define SPI_FLASH_BLOCK_NUMBER		        32
+
+// SPI flash partitioning layout
+#define LOG_FLASH_SECTOR_OFFSET	4
+#if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
+// assuming 512 sectors
+#define ALARM_LOG_FLASH_SECTOR_OFFSET	174
+#define SECTOR_COUNT 170
+#define FIRMWARE_UPDATE_SECTOR_OFFSET	344
+#define FIRMWARE_UPDATE_SECTOR_COUNT	(512 - FIRMWARE_UPDATE_SECTOR_OFFSET)
+#else // HARDWARE_BT6711
+#define ALARM_LOG_FLASH_SECTOR_OFFSET	258
+#define SECTOR_COUNT (spi_flash_desc.sector_count/2 - LOG_FLASH_SECTOR_OFFSET)
+#endif // HARDWARE_BT6711
+
+#if defined ( __ICCARM__ )
+typedef int ssize_t;
+#endif
+
+typedef struct {
+	bool present;
+//	uint16_t sector_size;
+	uint32_t sector_size;
+	uint8_t sector_erase_op;
+	uint16_t sector_count;
+} spi_flash_desc_t;
+
+extern spi_flash_desc_t spi_flash_desc;
+
+extern bool spi_flash_init(void);
+extern ssize_t spi_flash_read(int addr, void *buf, size_t len, uint32_t timeout);
+extern ssize_t spi_flash_write(int addr, const void *buf, size_t len, uint32_t timeout);
+extern int spi_flash_erase_sector(int addr, uint32_t timeout);
+extern int spi_flash_chip_erase(uint32_t timeout);
+extern bool spi_flash_test(void);
+#endif /* SPI_FLASH_H */

+ 17 - 12
modules/MegaTec/megatec.c

@@ -1017,6 +1017,7 @@ void ups_mode_response(char *data)
                 {
                 {
                     SNMP_SendUserTrap(UPS_MODE);
                     SNMP_SendUserTrap(UPS_MODE);
                     syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
                     syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
+                    printf("UPS mode to syslog file: %s\r\n", value);
                     log_event_data(LOG_UPS_MODE, value);
                     log_event_data(LOG_UPS_MODE, value);
                 }
                 }
                 memcmp(fault_status, value, sizeof(value));
                 memcmp(fault_status, value, sizeof(value));
@@ -1025,6 +1026,7 @@ void ups_mode_response(char *data)
         }
         }
         SNMP_SendUserTrap(UPS_MODE);
         SNMP_SendUserTrap(UPS_MODE);
         syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
         syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
+        printf("UPS mode to syslog file: %s\r\n", value);
         log_event_data(LOG_UPS_MODE, value);
         log_event_data(LOG_UPS_MODE, value);
 #endif        
 #endif        
     }
     }
@@ -1337,6 +1339,7 @@ int ups_metac_service_pdu(cmdMegaTecEnums_t command)
 void kstar_mode(void)
 void kstar_mode(void)
 {
 {
     uint8_t mode = UPS.Mode;
     uint8_t mode = UPS.Mode;
+    static uint32_t fault_mode_cnt = 0;
 #if 1    
 #if 1    
     if((UPS.Status >> 4) & 0x01) {
     if((UPS.Status >> 4) & 0x01) {
         UPS.Mode = 'F';
         UPS.Mode = 'F';
@@ -1352,19 +1355,20 @@ void kstar_mode(void)
         UPS.Mode = 'T';
         UPS.Mode = 'T';
     }
     }
 #endif
 #endif
-#if 0
-    if((UPS.Status >> 4) & 0x01) {
-        UPS.Mode = 'F';
-    } else if(!((UPS.Status >> 4) & 0x01) && UPS.VAC_out == 0) {
-        UPS.Mode = 'D';
-    } else if(((UPS.Status >> 5) & 0x01) && UPS.VAC_out > 120 && UPS.VAC_in != 0) {
-        UPS.Mode = 'Y';
-    } else if(((UPS.Status >> 7) & 0x01) && UPS.VAC_out > 190) {
-        UPS.Mode = 'B';
-    } else if((UPS.Status >> 2) & 0x01) {
-        UPS.Mode = 'T';
+
+    // Добавилл отправку команды "C", т.к. ИБП 
+    // самостоятельно не выходит из состояния Fault.
+    if (UPS.Mode == 'F') {
+        fault_mode_cnt++;
+    }
+    else {
+        fault_mode_cnt = 0;
+    }
+
+    if (fault_mode_cnt == UPA_CANSEL_DELAY) {
+        send_MegaTec_cmd(ups_cancel_shut_down);
+        fault_mode_cnt = 0;
     }
     }
-#endif
 
 
     if (UPS.Mode != mode) {
     if (UPS.Mode != mode) {
 #ifdef UPS_MODE_MONITOR
 #ifdef UPS_MODE_MONITOR
@@ -1375,6 +1379,7 @@ void kstar_mode(void)
         SNMP_SendUserTrap(UPS_MODE);
         SNMP_SendUserTrap(UPS_MODE);
         syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
         syslog(SYSLOG_INFORMATIONAL, "Режим ИБП: %s", value);
         log_event_data(LOG_UPS_MODE, value);
         log_event_data(LOG_UPS_MODE, value);
+        printf("UPS mode to log file: %s\r\n", value);
 #endif
 #endif
     }
     }
 }
 }

+ 1 - 0
modules/MegaTec/megatec.h

@@ -14,6 +14,7 @@
 
 
 
 
 #define PERIOD_AUTO_TEST	23.5*3600
 #define PERIOD_AUTO_TEST	23.5*3600
+#define UPA_CANSEL_DELAY	5
 
 
 #define K_EFFICIENCY		0.9
 #define K_EFFICIENCY		0.9
 #define AKB_VOLTAGE			12
 #define AKB_VOLTAGE			12

+ 1 - 1
modules/log/ringfs.c

@@ -382,7 +382,7 @@ int ringfs_append(struct ringfs *fs, const void *object)
         /* Free sector. Mark as used. */
         /* Free sector. Mark as used. */
         _sector_set_status(fs, fs->write.sector, SECTOR_IN_USE);
         _sector_set_status(fs, fs->write.sector, SECTOR_IN_USE);
     } else if (status != SECTOR_IN_USE) {
     } else if (status != SECTOR_IN_USE) {
-        printf("ringfs_append: corrupted filesystem\r\n");
+        DBG printf("ringfs_append: corrupted filesystem\r\n");
         return -1;
         return -1;
     }
     }
 
 

+ 6 - 3
modules/monitor/ups_monitor.c

@@ -430,6 +430,7 @@ void UPS_TestFinishMonitor(void)
        sprintf(&log_string[len1], "(%0.1f мин)", time_test_actual);
        sprintf(&log_string[len1], "(%0.1f мин)", time_test_actual);
        log_event_data(LOG_TEST_UPS, log_string);
        log_event_data(LOG_TEST_UPS, log_string);
        syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
        syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
+       printf("Value to syslog: %s\r\n", log_string);
        test_time = 0;
        test_time = 0;
 #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
 #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
           SNMP_SendUserTrap(TEST_BAT_STOP);
           SNMP_SendUserTrap(TEST_BAT_STOP);
@@ -437,6 +438,7 @@ void UPS_TestFinishMonitor(void)
 #else
 #else
       log_event_data(LOG_TEST_UPS, "Завершен");
       log_event_data(LOG_TEST_UPS, "Завершен");
       syslog_str(SYSLOG_INFORMATIONAL, "Тест батареи: Завершён");
       syslog_str(SYSLOG_INFORMATIONAL, "Тест батареи: Завершён");
+      printf("Value to syslog: %s\r\n", log_string);
 #endif
 #endif
       flUpdateLog = true;
       flUpdateLog = true;
     } else {
     } else {
@@ -477,6 +479,7 @@ void UPS_TestFinishMonitor(void)
       printf("Test start\r\n");
       printf("Test start\r\n");
       log_event_data(LOG_TEST_UPS, log_string);
       log_event_data(LOG_TEST_UPS, log_string);
       syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
       syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
+      printf("Value to syslog: %s\r\n", log_string);
 #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
 #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
           SNMP_SendUserTrap(TEST_BAT_RUN);
           SNMP_SendUserTrap(TEST_BAT_RUN);
 #endif
 #endif
@@ -623,7 +626,7 @@ void UPS_LineFailMonitor(void)
   // Значение параметра изменилось
   // Значение параметра изменилось
   if (lineFailCurrent != lineFailOldState)
   if (lineFailCurrent != lineFailOldState)
   {
   {
-    if (lineFailCurrent != 0){
+    if ((lineFailCurrent != 0) && (lineFailOldState == 0)) {
 #if	defined RELAY_AC_PRESENT
 #if	defined RELAY_AC_PRESENT
     	relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
     	relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
 #endif
 #endif
@@ -643,7 +646,7 @@ void UPS_LineFailMonitor(void)
 #endif
 #endif
     	flUpdateLog = true;
     	flUpdateLog = true;
     }
     }
-    else{
+    else if (lineFailCurrent == 0) {
       if (UPS.VAC_in == 0) {
       if (UPS.VAC_in == 0) {
         return;
         return;
       }
       }
@@ -784,7 +787,7 @@ void UPS_VACoutputHighRangeMonitor(void)
 #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
 #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
 	        // Отправка трапа о завышении
 	        // Отправка трапа о завышении
 	        SNMP_SendUserTrap(VAC_HIGH_OUTPUT_ALARM);
 	        SNMP_SendUserTrap(VAC_HIGH_OUTPUT_ALARM);
-		syslog(SYSLOG_ERROR, "Высокое входное напряжение (%0.1f В)", VACoutputCurrent);
+		syslog(SYSLOG_ERROR, "Высокое выходное напряжение (%0.1f В)", VACoutputCurrent);
 #endif
 #endif
 	        flUpdateLog = true;
 	        flUpdateLog = true;
 	    } else {
 	    } else {

+ 5 - 1
modules/parameters.c

@@ -98,7 +98,11 @@ bool GetRebootStatus(void)
   */
   */
 void GetInputFreqStr(char *str, uint8_t *len)
 void GetInputFreqStr(char *str, uint8_t *len)
 {
 {
-    sprintf(str, "%0.1f", UPS.Freq_in);
+    if (UPS.Mode == 'Y')
+      sprintf(str, "%0.1f", UPS.Freq_in);
+    else
+      sprintf(str, "%0.1f", 0.0);
+
     *len = strlen(str);
     *len = strlen(str);
 }
 }
 
 

+ 1 - 1
modules/settings_api_bt6721.c

@@ -128,7 +128,7 @@ void SETTINGS_SetUPSSettingsDef(void)
   sSettings.UPS_Setting.Ucellmax = 2.36;
   sSettings.UPS_Setting.Ucellmax = 2.36;
   sSettings.UPS_Setting.Uakb = 12;
   sSettings.UPS_Setting.Uakb = 12;
   sSettings.UPS_Setting.common_capacity = 15;
   sSettings.UPS_Setting.common_capacity = 15;
-  sSettings.UPS_Setting.ups_power = 500;
+  sSettings.UPS_Setting.ups_power = 400;
   sSettings.UPS_Setting.set_data = 0;
   sSettings.UPS_Setting.set_data = 0;
   sSettings.UPS_Setting.life_time = 5;
   sSettings.UPS_Setting.life_time = 5;
   sSettings.UPS_Setting.type_ups = ups_kestar;
   sSettings.UPS_Setting.type_ups = ups_kestar;

+ 53 - 3
peripheral_modules/src/spi_flash.c

@@ -5,6 +5,9 @@
 
 
 #include "spi_flash.h"
 #include "spi_flash.h"
 #include "gpio.h"
 #include "gpio.h"
+#include "FreeRTOS.h"
+#include "task.h"
+
 
 
 /*
 /*
 struct {
 struct {
@@ -59,11 +62,48 @@ void SPI2_IRQHandler(void) {
 
 
 //static TN_MUTEX spi_mutex;
 //static TN_MUTEX spi_mutex;
 
 
+#define RX_TX_DELLAY_MS		50
+
 static uint8_t spi_tx_rx(uint8_t byte) {
 static uint8_t spi_tx_rx(uint8_t byte) {
-	while (!(SPI2->SR & SPI_SR_TXE)) {}
+	uint32_t tick_start = xTaskGetTickCount();
+
+	while (!(SPI2->SR & SPI_SR_TXE)) {
+		if ((xTaskGetTickCount() - tick_start) >= RX_TX_DELLAY_MS) {
+			break;
+		}	
+	}
+
 	SPI2->DR = byte;
 	SPI2->DR = byte;
-		
-	while (!(SPI2->SR & SPI_SR_RXNE)) {}
+
+	tick_start = xTaskGetTickCount();
+
+	while (!(SPI2->SR & SPI_SR_RXNE)) {
+		if ((xTaskGetTickCount() - tick_start) >= RX_TX_DELLAY_MS) {
+			break;
+		}
+	}
+	return SPI2->DR;
+}
+
+static uint8_t spi_tx_rx_dellay(uint8_t byte)
+{
+	uint32_t tick_start = xTaskGetTickCount();
+
+	while (!(SPI2->SR & SPI_SR_TXE)) {
+		if ((xTaskGetTickCount() - tick_start) >= RX_TX_DELLAY_MS) {
+			break;
+		}	
+	}
+
+	SPI2->DR = byte;
+
+	tick_start = xTaskGetTickCount();
+
+	while (!(SPI2->SR & SPI_SR_RXNE)) {
+		if ((xTaskGetTickCount() - tick_start) >= RX_TX_DELLAY_MS) {
+			break;
+		}
+	}
 	return SPI2->DR;
 	return SPI2->DR;
 }
 }
 
 
@@ -111,11 +151,16 @@ spi_flash_desc_t spi_flash_desc;
 
 
 static inline void wait_write_enable(void) {
 static inline void wait_write_enable(void) {
 	uint8_t status;
 	uint8_t status;
+	uint32_t tick_start;
 //	spi_cs_down();
 //	spi_cs_down();
 	SPI_FLASH_CS_L();
 	SPI_FLASH_CS_L();
 	spi_tx_rx(CMD_RDSR);
 	spi_tx_rx(CMD_RDSR);
+	tick_start = xTaskGetTickCount();
 	do {
 	do {
 		status = spi_tx_rx(0);
 		status = spi_tx_rx(0);
+		if ((xTaskGetTickCount() - tick_start) >= RX_TX_DELLAY_MS) {
+			break;
+		} 
 	} while (!(status & SR_WEL));
 	} while (!(status & SR_WEL));
 //	spi_cs_up();
 //	spi_cs_up();
 	SPI_FLASH_CS_H();
 	SPI_FLASH_CS_H();
@@ -123,10 +168,15 @@ static inline void wait_write_enable(void) {
 
 
 static inline void wait_write_end(void) {
 static inline void wait_write_end(void) {
 	uint8_t status;
 	uint8_t status;
+	uint32_t tick_start;
 	SPI_FLASH_CS_L();
 	SPI_FLASH_CS_L();
 	spi_tx_rx(CMD_RDSR);
 	spi_tx_rx(CMD_RDSR);
+	tick_start = xTaskGetTickCount();
 	do {
 	do {
 		status = spi_tx_rx(0);
 		status = spi_tx_rx(0);
+		if ((xTaskGetTickCount() - tick_start) >= RX_TX_DELLAY_MS) {
+			break;
+		}
 	} while (status & SR_WIP);
 	} while (status & SR_WIP);
 	SPI_FLASH_CS_H();
 	SPI_FLASH_CS_H();
 }
 }

+ 274 - 0
service_hw/Commands/bt_6701_commands.c

@@ -56,6 +56,12 @@ extern BUTTON_NO_FIX_t setButton;
   */
   */
 extern unsigned char eth_ready_flag;
 extern unsigned char eth_ready_flag;
 
 
+
+static bool test_pair_pins(void);
+static void set_pin_as_output(GPIO_TypeDef *port, uint8_t pin);
+static void set_pin_as_input(GPIO_TypeDef *port, uint8_t pin);
+
+
 // -------------------------------------------------------------------------- //
 // -------------------------------------------------------------------------- //
 //                              __weak функции
 //                              __weak функции
 
 
@@ -462,5 +468,273 @@ void Test_Serno(void)
 
 
 // -------------------------------------------------------------------------- //
 // -------------------------------------------------------------------------- //
 
 
+typedef struct
+{
+  GPIO_TypeDef *first_port;
+  uint16_t       first_pin;
+
+  GPIO_TypeDef *second_port;
+  uint16_t       second_pin;  
+
+} pair_pin_t;
+
+typedef struct
+{
+  GPIO_TypeDef *first_port;
+  uint16_t       first_pin;
+
+} single_pin_t;
+
+/*
+1 - PE2 - не используется
+2 - PE3 - не проверяем, не используется 
+3 - PE4 - не проверяем, не используется 
+4 - PE5 - не проверяем, не используется 
+5 - PE6 - проверять с PE5 и проверяем с VBAT (КЗ с +)
+6 - VBAT - не проверяем
+7 - PC13 - не проверяем, не используется
+8 - OSC_IN - не проверяем
+9 - OSC_OUT - не проверяем
+10 - VSS - не проверяем
+11 - VDD - не проверяем
+12 - OSC_IN - не проверяем
+13 - OSC_OUT - не проверяем, не используется 
+14 - PE3 - NRST - не проверяем
+15 - PC0 - не проверяем, не используется
+16 - PC1 - не проверяем ethernet phy 
+17 - PC0 - не проверяем, не используется
+18 - PC0 - не проверяем, не используется
+19 - VDD - не проверяем 
+20 - VSSA - не проверяем
+21 - VREF - не проверяем
+22 - VDDA - не проверяем 
+23 - PA0 - проверяем с 22 (КЗ с +)
+24 - PA1 - не проверяем ethernet phy 
+25 - PA2 - не проверяем ethernet phy 
+26 - PA3 - проверяем с 27 (КЗ с -)
+27 - VSS - не проверяем 
+28 - VDD - не проверяем 
+29 - PA4 - проверяем с 28 (кз с +), проверяем с 30 
+30 - PA5 - проверяем с 29, проверяем с 31
+31 - PA6 - не проверяем, не используется
+32 - PA7 - не проверяем ethernet phy 
+33 - PС4 - не проверяем ethernet phy 
+34 - PС5 - не проверяем ethernet phy 
+35 - PB0 - не проверяем, не используется
+36 - PB1 - не проверяем, не используется
+37 - PB2 - BOOT1 - не проверяем
+38 - PE7 - не проверяем, там всегда +
+39 - PE8 - не проверяем, не используется
+40 - PE9 - не проверяем, не используется
+41 - PE10 - не проверяем, не используется
+42 - PE11 - не проверяем, не получится
+43 - PE12 - не проверяем, не получится
+44 - PE13 - не проверяем ethernet phy
+45 - PE14 - не проверяем, не используется
+46 - PE15 - проверяем с 47
+47 - PB10 - проверяем с 46
+48 - PB11 - не проверяем ethernet phy
+49 - Vcap1 - не проверяем 
+50 - VDD - не проверяем
+51 - PB12 - не проверяем ethernet phy
+52 - PB13 - не проверяем ethernet phy
+53 - PB14 - проверяем с 54 (но 53 должен быть только входом)
+54 - PB15 - проверяем с 53 (54 - как вход)
+55 - PD8 - не проверяем, не используется
+56 - PD9 - не проверяем, не используется
+57 - PD10 - не проверяем, не используется
+58 - PD11 - не проверяем, не используется
+59 - PD12 - не проверяем, не используется
+60 - PD13 - не проверяем, не используется
+61 - PD14 - не проверяем
+62 - PD15 - не проверяем
+63 - PС6 - не проверяем, не используется
+64 - PC7 - не проверяем, не используется
+65 - PC8 - не проверяем, не используется
+66 - PC9 - не проверяем, не используется
+67 - PA8 - не проверяем, не используется
+68 - PA9 - не проверяем, это DEBUG UART 
+69 - PA10 - не проверяем, это DEBUG UART 
+70 - PA11 - не проверяем, не используется
+71 - PA12 - не проверяем, не используется
+72 - PA13 - SWDIO - не проверяем
+73 - Vcap2 - не проверяем
+74 - VSS - не проверяем
+75 - VDD - не проверяем
+76 - PA14 - SWCLK - не вроверяем 
+77 - PA15 - не проверяем, не используется 
+78 - PC10 - не проверяем, не используется
+79 - PC11 - не проверяем, не используется 
+80 - PC12 - не проверяем, не используется
+81 - PD0 - не проверяем, не используется
+82 - PD1 - не проверяем, не используется
+83 - PD2 - не проверяем, не используется
+84 - PD3 - не проверяем, не используется
+85 - PD4 - не проверяем, не используется 
+86 - PD5 - проверяем с 87
+87 - PD6 - проверяем с 86
+88 - PD7 - не проверяем, не используется 
+89 - PB3 - проверяем с 90
+90 - PB4 - проверяем с 89, проверяем с 91
+91 - PB5 - проверяем c 90, проверяем с 92
+92 - PB6 - проверяем с 91
+93 - PB7 - не проверяем, не используется
+94 - BOOT0 - не проверяем 
+95 - PB8 - не проверяем, не используется
+96 - PB9 - не проверям, т.к. соседние пины не используются
+97 - PE0 - не проверяем, не используется
+98 - PE1 - не проверяем, не используется
+99 - VSS - не проверяем
+100 - VDD - не проверяем
+*/
+
+
+#define PAIR_PINS_SIZE    14
+
+pair_pin_t pins_with_pair[PAIR_PINS_SIZE] = {
+  {GPIOE, GPIO_Pin_6, GPIOE, GPIO_Pin_5}, // проверить уровень на PE5
+
+
+  {GPIOE, GPIO_Pin_2, GPIOE, GPIO_Pin_3},   /* 1 */ // 2, 3 - не тестировать, они не используются
+  {GPIOE, GPIO_Pin_4, GPIOE, GPIO_Pin_5},   /* 2 */ // 4, 5 - не тестировать, они не используются
+  {GPIOA, GPIO_Pin_4, GPIOA, GPIO_Pin_5},   /* 3 */ // 29, 30 - ОК
+  {GPIOB, GPIO_Pin_2, GPIOE, GPIO_Pin_7},   /* 4 */ // 37, 38 - не будет работать
+  {GPIOE, GPIO_Pin_11, GPIOE, GPIO_Pin_12}, /* 5 */ // 42, 43 - не получилось, это LED не будет работать, это LED не будем тестировать
+  {GPIOE, GPIO_Pin_15, GPIOB, GPIO_Pin_10}, /* 6 */ // 46, 47 - OK
+  {GPIOB, GPIO_Pin_13, GPIOB, GPIO_Pin_14}, /* 7 */ // 52, 53 - не получилось
+  {GPIOB, GPIO_Pin_14, GPIOB, GPIO_Pin_15}, /* 8 */ // 53, 54 - не получилось
+  {GPIOD, GPIO_Pin_14, GPIOD, GPIO_Pin_15}, /* 9 */ // 61, 62 - не будет работать
+  {GPIOA, GPIO_Pin_9, GPIOA, GPIO_Pin_10},  /* 10 */ // 68, 69 - не тестировать, это DEBUG UART
+  {GPIOD, GPIO_Pin_5, GPIOD, GPIO_Pin_6},   /* 11 */ // 86, 87 - OK
+  {GPIOB, GPIO_Pin_3, GPIOB, GPIO_Pin_4},   /* 12 */ // 89, 90 - OK
+  {GPIOB, GPIO_Pin_5, GPIOB, GPIO_Pin_6},   /* 13 */ // 91, 92 - OK
+  {GPIOB, GPIO_Pin_8, GPIOB, GPIO_Pin_9},   /* 14 */ // 95, 96 - не получилось
+};
+
+#if 0
+pair_pin_t pins_with_pair[PAIR_PINS_SIZE] = {
+  {GPIOE, GPIO_Pin_2, GPIOE, GPIO_Pin_3},   /* 1 */ // 2, 3 - не тестировать, они не используются
+  {GPIOE, GPIO_Pin_4, GPIOE, GPIO_Pin_5},   /* 2 */ // 4, 5 - не тестировать, они не используются
+  {GPIOA, GPIO_Pin_4, GPIOA, GPIO_Pin_5},   /* 3 */ // 29, 30 - ОК
+  {GPIOB, GPIO_Pin_2, GPIOE, GPIO_Pin_7},   /* 4 */ // 37, 38 - не будет работать
+  {GPIOE, GPIO_Pin_11, GPIOE, GPIO_Pin_12}, /* 5 */ // 42, 43 - не получилось, это LED не будет работать, это LED не будем тестировать
+  {GPIOE, GPIO_Pin_15, GPIOB, GPIO_Pin_10}, /* 6 */ // 46, 47 - OK
+  {GPIOB, GPIO_Pin_13, GPIOB, GPIO_Pin_14}, /* 7 */ // 52, 53 - не получилось
+  {GPIOB, GPIO_Pin_14, GPIOB, GPIO_Pin_15}, /* 8 */ // 53, 54 - не получилось
+  {GPIOD, GPIO_Pin_14, GPIOD, GPIO_Pin_15}, /* 9 */ // 61, 62 - не будет работать
+  {GPIOA, GPIO_Pin_9, GPIOA, GPIO_Pin_10},  /* 10 */ // 68, 69 - не тестировать, это DEBUG UART
+  {GPIOD, GPIO_Pin_5, GPIOD, GPIO_Pin_6},   /* 11 */ // 86, 87 - OK
+  {GPIOB, GPIO_Pin_3, GPIOB, GPIO_Pin_4},   /* 12 */ // 89, 90 - OK
+  {GPIOB, GPIO_Pin_5, GPIOB, GPIO_Pin_6},   /* 13 */ // 91, 92 - OK
+  {GPIOB, GPIO_Pin_8, GPIOB, GPIO_Pin_9},   /* 14 */ // 95, 96 - не получилось
+};
+#endif
+
+uint8_t pair_pin_resut[PAIR_PINS_SIZE];
+
+// Возможно замыкание на линию питания. Эти пины проверяются отдельно. 
+single_pin_t pins_with_power[] = {
+  {GPIOA, GPIO_Pin_4},                      // 29 - это LED не будем тестировать
+};
+
+// Возможно замыкание на землю. Эти пины проверяются отдельно.
+single_pin_t pins_with_ground[] = {
+  {GPIOA, GPIO_Pin_3},                      // 26 - это LED не будем тестировать
+};
+
+//
+void Test_Pins(void)
+{
+  printf("\r\nThis is PINS test\r\n");
+  //printf("Size of pair pins struct: %u\r\n", sizeof(pins_for_test)/16);
+  //printf("Size of power pins struct: %u\r\n", sizeof(pins_with_power)/8);
+  //printf("Size of ground pins struct: %u\r\n", sizeof(pins_with_ground)/8);
+ 
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
+ 
+  test_pair_pins();
+
+  TEST_SetTest(TEST_WAIT);
+}
+
+//
+static bool test_pair_pins(void)
+{
+  uint8_t res_1 = Bit_RESET;
+  uint8_t res_2 = Bit_RESET;
+
+  set_pin_as_input(GPIOE, GPIO_Pin_5);
+  res_1 = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
+  printf("PE_5 level: %u\r\n", res_1);
+
+#if 0
+  for (int i = 0; i < PAIR_PINS_SIZE; i++)
+  {
+    set_pin_as_output(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
+    set_pin_as_input(pins_with_pair[i].second_port, pins_with_pair[i].second_pin);
+
+    GPIO_SetBits(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
+    vTaskDelay(1);
+
+    res_1 = GPIO_ReadInputDataBit(pins_with_pair[i].second_port, pins_with_pair[i].second_pin);
+
+    GPIO_ResetBits(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
+    vTaskDelay(1);
+
+    res_2 = GPIO_ReadInputDataBit(pins_with_pair[i].second_port, pins_with_pair[i].second_pin);
+
+    if (res_1 != res_2)
+      pair_pin_resut[i] = 1;
+    else 
+      pair_pin_resut[i] = 0;
+    
+    set_pin_as_input(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
+  }
+
+#if 1  
+  // Вывод результата
+  printf("Pair pin result:\r\n");
+  for (int i = 0; i < PAIR_PINS_SIZE; i++) {
+    printf("%u ", pair_pin_resut[i]);
+  }
+  printf("\r\n");
+
+  printf("Port %X\r\n", GPIOA);
+
+#endif  
+
+#endif  
+}
+
+//
+static void set_pin_as_output(GPIO_TypeDef *port, uint8_t pin)
+{
+  GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+  GPIO_InitStructure.GPIO_Pin = pin;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+  GPIO_Init(port, &GPIO_InitStructure);
+}
+
+//
+static void set_pin_as_input(GPIO_TypeDef *port, uint8_t pin)
+{
+  GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+  GPIO_InitStructure.GPIO_Pin = pin;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
+  GPIO_Init(port, &GPIO_InitStructure);
+}
+
 
 
 /********************************* (C) РОТЕК **********************************/
 /********************************* (C) РОТЕК **********************************/

+ 3 - 0
service_hw/Commands/bt_6701_commands.h

@@ -20,6 +20,9 @@
   */
   */
 void Test_U232(void);
 void Test_U232(void);
 
 
+//
+void Test_Pins(void);
+
 #endif /* #ifndef __BT_6701_COMMANDS_H */
 #endif /* #ifndef __BT_6701_COMMANDS_H */
 
 
 /****************************** (C) LiteMesh ***************** end of file ****/
 /****************************** (C) LiteMesh ***************** end of file ****/

+ 4 - 1
service_hw/Commands/commands_api.c

@@ -181,7 +181,10 @@ void vTestCommands(void *params)
                 Test_Serno();
                 Test_Serno();
             break;
             break;
             
             
-            
+            case TEST_PIN :
+              Test_Pins();
+            break;
+
             default :
             default :
             break;
             break;
         }
         }

+ 1 - 0
service_hw/Commands/commands_api.h

@@ -31,6 +31,7 @@ typedef enum
     TEST_SPIFLASH,
     TEST_SPIFLASH,
     TEST_ETHERNET,
     TEST_ETHERNET,
     TEST_SERNO,
     TEST_SERNO,
+    TEST_PIN,
 
 
 } TEST_t;
 } TEST_t;
 
 

+ 116 - 107
service_hw/Console/port_microrl.c

@@ -86,6 +86,8 @@
 #define _SCMD_PB  "port_b"
 #define _SCMD_PB  "port_b"
 #define _SCMD_PD  "port_d"
 #define _SCMD_PD  "port_d"
 
 
+#define _CMD_PIN          "PIN"
+
 #define _NUM_OF_CMD 
 #define _NUM_OF_CMD 
 #define _NUM_OF_SETCLEAR_SCMD 2
 #define _NUM_OF_SETCLEAR_SCMD 2
 
 
@@ -138,7 +140,9 @@ char * keyworld [] = {
   _CMD_RST,
   _CMD_RST,
 
 
   _CMD_SPIFLASH,
   _CMD_SPIFLASH,
-  _CMD_U232
+  _CMD_U232,
+
+  _CMD_PIN,
 };
 };
 
 
 // 'set/clear' command argements
 // 'set/clear' command argements
@@ -198,7 +202,7 @@ void MICRORL_GetChar(uint8_t ch)
 // do what you want here, but don't write to argv!!! read only!!
 // do what you want here, but don't write to argv!!! read only!!
 int execute (int argc, const char * const * argv)
 int execute (int argc, const char * const * argv)
 {
 {
-	int i = 0;
+  int i = 0;
 	uint16_t len = 0;
 	uint16_t len = 0;
 	
 	
 	// just iterate through argv word and compare it with your commands
 	// just iterate through argv word and compare it with your commands
@@ -207,145 +211,150 @@ int execute (int argc, const char * const * argv)
 	  memset(param, 0, PARAM_LEN);  
 	  memset(param, 0, PARAM_LEN);  
 	  
 	  
 	  if (strcmp (argv[i], _CMD_HELP) == 0) 
 	  if (strcmp (argv[i], _CMD_HELP) == 0) 
-      {
- 		print ("microrl library v");
-		print (MICRORL_LIB_VER);
-		print ("\n\r");
-		print_help ();        // print help
+    {
+ 		  print ("microrl library v");
+		  print (MICRORL_LIB_VER);
+		  print ("\n\r");
+		  print_help ();        // print help
 	  } 
 	  } 
-      else if (strcmp (argv[i], _CMD_CLEAR) == 0) 
-      {
-		print ("\033[2J");    // ESC seq for clear entire screen
-		print ("\033[H");     // ESC seq for move cursor at left-top corner
+    else if (strcmp (argv[i], _CMD_CLEAR) == 0) 
+    {
+		  print ("\033[2J");    // ESC seq for clear entire screen
+		  print ("\033[H");     // ESC seq for move cursor at left-top corner
 	  }  
 	  }  
 	  /* Тестовая команда */
 	  /* Тестовая команда */
-      else if (strcmp (argv[i], _CMD_LED) == 0) 
-      {
-		//testLed = true;
-		// TODO Убрать затычку
-		printf("STATUS T1OK\r");
-		return 0;
-      } 
+    else if (strcmp (argv[i], _CMD_LED) == 0) 
+    {
+		  //testLed = true;
+		  // TODO Убрать затычку
+		  printf("STATUS T1OK\r");
+		  return 0;
+    } 
 	  /* Тест Ethernet */
 	  /* Тест Ethernet */
 	  else if (strcmp (argv[i], _CMD_ETH) == 0) 
 	  else if (strcmp (argv[i], _CMD_ETH) == 0) 
-      {
-        COM_SetMAC();
-		//testEthernet = true;
-        TEST_SetTest(TEST_ETHERNET);
-        print ("\n\r");
-        return 0;
-      }
+    {
+      COM_SetMAC();
+		  //testEthernet = true;
+      TEST_SetTest(TEST_ETHERNET);
+      print ("\n\r");
+      return 0;
+    }
 	  /* Тест кнопки SET */
 	  /* Тест кнопки SET */
 	  else if (strcmp (argv[i], _CMD_SET) == 0) 
 	  else if (strcmp (argv[i], _CMD_SET) == 0) 
-      {
-		//testSet = true;
-		TEST_SetTest(TEST_SET);
-		print ("\n\r");
-		return 0;
-      }
+    {
+		  //testSet = true;
+		  TEST_SetTest(TEST_SET);
+		  print ("\n\r");
+		  return 0;
+    }
 	  /* Тест кнопки DEF */
 	  /* Тест кнопки DEF */
 	  else if (strcmp (argv[i], _CMD_DEF) == 0) 
 	  else if (strcmp (argv[i], _CMD_DEF) == 0) 
-      {
-		//testDef = true;
-        TEST_SetTest(TEST_DEF);
-		print ("\n\r");
-		return 0;
-      }
+    {
+		  //testDef = true;
+      TEST_SetTest(TEST_DEF);
+		  print ("\n\r");
+		  return 0;
+    }
 	  /* Тест RTC */
 	  /* Тест RTC */
 	  else if (strcmp (argv[i], _CMD_RTC) == 0) 
 	  else if (strcmp (argv[i], _CMD_RTC) == 0) 
+    {
+		  if (++i < argc)
       {
       {
-		if (++i < argc)
-        {
-          len = strlen(argv[i]);
-          strncpy(param, argv[i], len);
-		  SNTP_SetServerAddr(param);
-		  TEST_SetTest(TEST_RTC);
-		 // testRtc = true;
-          print ("\n\r");
-          return 0;
-        }
-		print ("\n\r");
+        len = strlen(argv[i]);
+        strncpy(param, argv[i], len);
+		    SNTP_SetServerAddr(param);
+		    TEST_SetTest(TEST_RTC);
+		    // testRtc = true;
+        print ("\n\r");
+        return 0;
       }
       }
+		  print ("\n\r");
+    }
 	  /* Установка SERNO */
 	  /* Установка SERNO */
 	  else if (strcmp (argv[i], _CMD_SERNO) == 0) 
 	  else if (strcmp (argv[i], _CMD_SERNO) == 0) 
+    {
+		  if (++i < argc)
       {
       {
-		if (++i < argc)
-        {
-          len = strlen(argv[i]);
-          strncpy(param, argv[i], len);
-		  SETTINGS_SetSerno(param);
-		  //testSerno = true;
-          TEST_SetTest(TEST_SERNO);
-          print ("\n\r");
-          return 0;
-        }
-		print ("\n\r");
+        len = strlen(argv[i]);
+        strncpy(param, argv[i], len);
+		    SETTINGS_SetSerno(param);
+		    //testSerno = true;
+        TEST_SetTest(TEST_SERNO);
+        print ("\n\r");
+        return 0;
       }
       }
+		  print ("\n\r");
+    }
 	  
 	  
-      /* -------------------------------------------------------------------- */
-      /*                        Тесты для SmartUPS                            */
-      
-      /* Тест сухих контактов */
+    /* -------------------------------------------------------------------- */
+    /*                        Тесты для SmartUPS                            */
+    
+    /* Тест сухих контактов */
 	  else if (strcmp (argv[i], _CMD_DRY) == 0) 
 	  else if (strcmp (argv[i], _CMD_DRY) == 0) 
-      {
-		//testSet = true;
-        TEST_SetTest(TEST_DRY);
-		print ("\n\r");
-		return 0;
-      }
+    {
+		  //testSet = true;
+      TEST_SetTest(TEST_DRY);
+		  print ("\n\r");
+		  return 0;
+    }
       
       
-      /* Тест дополнительных пинов RS232 */
+    /* Тест дополнительных пинов RS232 */
 	  else if (strcmp (argv[i], _CMD_U232) == 0)
 	  else if (strcmp (argv[i], _CMD_U232) == 0)
-      {
-		//testSet = true;
-        TEST_SetTest(TEST_U232);
-		print ("\n\r");
-		return 0;
-      }
+    {
+		  //testSet = true;
+      TEST_SetTest(TEST_U232);
+		  print ("\n\r");
+		  return 0;
+    }
 
 
 	  /* Тест spi flash */
 	  /* Тест spi flash */
 	  else if (strcmp (argv[i], _CMD_SPIFLASH) == 0)
 	  else if (strcmp (argv[i], _CMD_SPIFLASH) == 0)
-	   {
-		//testSet = true;
-		 TEST_SetTest(TEST_SPIFLASH);
-		print ("\n\r");
-		return 0;
-	   }
+	  {
+		  //testSet = true;
+		  TEST_SetTest(TEST_SPIFLASH);
+		  print ("\n\r");
+		  return 0;
+	  }
 #ifdef DALLAS_SENSOR_ENABLE
 #ifdef DALLAS_SENSOR_ENABLE
-     	/* Тест линии OW */
-      else if (strcmp (argv[i], _CMD_ONEWIRE) == 0)
-      {
-        TEST_SetTest(TEST_OW);
-        print ("\n\r");
-        return 0;
-      }
+    /* Тест линии OW */
+    else if (strcmp (argv[i], _CMD_ONEWIRE) == 0)
+    {
+      TEST_SetTest(TEST_OW);
+      print ("\n\r");
+      return 0;
+    }
 #endif
 #endif
 	  /* -------------------------------------------------------------------- */
 	  /* -------------------------------------------------------------------- */
 	  /*                          Тесты этапа Т2                              */
 	  /*                          Тесты этапа Т2                              */
 	  /* Статус тестера */
 	  /* Статус тестера */
 	  else if (strcmp (argv[i], _CMD_STATUS) == 0) 
 	  else if (strcmp (argv[i], _CMD_STATUS) == 0) 
-      {
-		//printf("STATUS %s\r", sSettings.sFlags.testState);
-        printf("STATUS %s\r", SETTINGS_GetTestState());
-		return 0;
-      }
+    {
+		  //printf("STATUS %s\r", sSettings.sFlags.testState);
+      printf("STATUS %s\r", SETTINGS_GetTestState());
+		  return 0;
+    }
 	  /* T2READY */
 	  /* T2READY */
 	  else if (strcmp (argv[i], _CMD_T2READY) == 0) 
 	  else if (strcmp (argv[i], _CMD_T2READY) == 0) 
-      {
-		testT2Ready = true;		
-		return 0;
-      }
+    {
+		  testT2Ready = true;		
+		  return 0;
+    }
 	  
 	  
 	  /* Перезагрузить контроллер */
 	  /* Перезагрузить контроллер */
-      else if (strcmp (argv[i], _CMD_RST) == 0) 
-      {
-        NVIC_SystemReset();
-      }  
-      else 
-      {
-		print ("command: '");
-		print ((char*)argv[i]);
-		print ("' Not found.\n\r");
+    else if (strcmp (argv[i], _CMD_RST) == 0) 
+    {
+      NVIC_SystemReset();
+    }  
+
+    else if (strcmp(argv[i], _CMD_PIN) == 0)
+    {
+      TEST_SetTest(TEST_PIN);
+    }
+    else 
+    {
+  		print ("command: '");
+		  print ((char*)argv[i]);
+		  print ("' Not found.\n\r");
 	  }
 	  }
 	  i++;
 	  i++;
 	}
 	}