/********************************* (C) РОТЕК *********************************** * @module bt_6701_commands * @file bt_6701_commands.c * @version 1.0.0 * @date XX.XX.XXXX * $brief bt_6701_commands ******************************************************************************* * @history Version Author Comment * XX.XX.XXXX 1.0.0 Telenkov D.A. First release. ******************************************************************************* */ #include "common_config.h" #include "stm32f4xx.h" #include "bt_6701_commands.h" #include "commands_api.h" #include "gpio.h" #include "buttons.h" #include "led.h" #include "netconf.h" #include "stm32f4x7_eth_bsp.h" #include "http_server.h" #include "rtc.h" #include "sntp_api.h" #include "d_inouts.h" #include "config_service.h" #include "usart.h" #include "spi_flash.h" #include "FreeRTOS.h" #include "task.h" #include "lwip/opt.h" #include "lwip/api.h" #include "lwip/sys.h" #ifdef PRINTF_STDLIB #include #endif #ifdef PRINTF_CUSTOM #include "tinystdio.h" #endif #include bool ntpResult = false; uint32_t SNTP_Time; extern uint8_t DefCounter; extern BUTTON_NO_FIX_t defButton; extern uint8_t SetCounter; extern BUTTON_NO_FIX_t setButton; /** * @brief Флаг ининциализации Eth интерфейса */ 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 функции /** * @brief */ void TestProcessing(void) { vTaskDelay(200); } /** * @brief */ void Test_U232(void) { // Отправляем символы в RS232 for (uint16_t i = 0; i < 1023; i++) ups_putchar('A'); vTaskDelay(10); for (uint16_t i = 0; i < 1023; i++) { if (ups_getchar(500) != 'A') { printf("U232 FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } } printf("U232 OK\r\n"); TEST_SetTest(TEST_WAIT); } #ifdef DALLAS_SENSOR_ENABLE void COM_TestOW(void) { uint8_t inputState; uint8_t start_state = 0; uint8_t end_state = 1; gpio_hw_config_pin(gpio_pins[WDATA1].port, gpio_pins[WDATA1].pin, GPIO_MODE_IN_CFG | GPIO_SPEED_HIGH_CFG); gpio_hw_config_pin(gpio_pins[WDATA2].port, gpio_pins[WDATA2].pin, GPIO_MODE_IN_CFG | GPIO_SPEED_HIGH_CFG); for (uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) { vTaskDelay(100); gpio_set((DOUT1 + i), start_state); vTaskDelay(100); if (get_state_din_outs((WDATA1 + i)) != start_state) { printf("OW FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } gpio_set((DOUT1 + i), end_state); vTaskDelay(100); if (get_state_din_outs((WDATA1 + i)) != end_state) { printf("OW FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } } vTaskDelay(100); printf("OW OK\r\n"); TEST_SetTest(TEST_WAIT); } #endif #ifdef DINS_ENABLE || DOUTS_ENABLE /** * @brief */ void Test_DRY(void) { uint8_t inputState; uint8_t start_state = 0; uint8_t end_state = 1; #ifdef DOUTS_ENABLE #if defined RELAY_NC start_state = 0; end_state = 1; for (uint8_t i = 0; i < OUTPUTS_TOTAL_COUNT; i ++) { set_state_douts((DOUT1 + i), 1); } #endif #ifdef RELAY_NO start_state = 1; end_state = 0; #endif for (uint8_t i = 0; i < OUTPUTS_TOTAL_COUNT; i ++) { #ifdef HARDWARE_BT6703 if(i == 2) { // функционал определяющий аппаратную часть контроллера BT-6703 (выпущено 120 шт. переделанных из BT-6702, различия в релейных выходах) break; } #endif vTaskDelay(100); inputState = get_state_din_outs(DIN1); set_state_douts((DOUT1 + i), start_state); vTaskDelay(100); if (get_state_din_outs(DIN1) == inputState) { #ifdef HARDWARE_BT6703 if(i == 0) { set_state_douts((DOUT1 + 2), start_state); vTaskDelay(100); if (get_state_din_outs(DIN1) == inputState) { printf("DRY FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } } else #endif { printf("DRY FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } } set_state_douts((DOUT1 + i), end_state); vTaskDelay(100); if (get_state_din_outs(DIN1) != inputState) { #ifdef HARDWARE_BT6703 if(i == 0) { set_state_douts((DOUT1 + 2), end_state); vTaskDelay(100); if (get_state_din_outs(DIN1) == inputState) { printf("DRY FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } } else #endif { printf("DRY FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } } } #else for (uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) { vTaskDelay(100); gpio_set((DOUT1 + i), start_state); vTaskDelay(100); if (get_state_din_outs((DIN1 + i)) != start_state) { printf("DRY FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } gpio_set((DOUT1 + i), end_state); vTaskDelay(100); if (get_state_din_outs((DIN1 + i)) != end_state) { printf("DRY FAIL\r\n"); TEST_SetTest(TEST_WAIT); return; } } #endif vTaskDelay(100); printf("DRY OK\r\n"); TEST_SetTest(TEST_WAIT); } #endif /** * @brief */ void vTest_DEF(void *params) { static uint32_t timeout = 0; for (;;) { if (timeout++ > BUTTON_TIMEOUT) { timeout = 0; DefCounter = 0; #ifdef LED_INIT_ERR LED_Off(LED_INIT_ERR); #endif #ifdef LED_ALARM LED_Off(LED_ALARM); #endif #ifdef LED_RED_MINOR LED_Off(LED_RED_MINOR); #endif printf("DEF FAIL\r\n"); TEST_SetTest(TEST_WAIT); ifTest_DEF = false; vTaskDelete(NULL); } BUTTON_NoFixHandler(&defButton); if (DefCounter == 3) { timeout = 0; DefCounter = 0; printf("DEF OK\r\n"); /* Завершение теста T0 */ /* Устанавливаем статус T0READY, сохраняем статус во флеш */ COM_SetTestState(T0READY); TEST_SetTest(TEST_WAIT); ifTest_DEF = false; vTaskDelete(NULL); } vTaskDelay(10); } } /** * @brief */ void vTest_SET(void *params) { static uint32_t timeout_set = 0; for (;;) { if (timeout_set++ > BUTTON_TIMEOUT) { timeout_set = 0; SetCounter = 0; #ifdef LED_INIT_OK LED_Off(LED_INIT_OK); #endif #ifdef LED_GREEN_MINOR LED_Off(LED_GREEN_MINOR); #endif printf("SET FAIL\r\n"); TEST_SetTest(TEST_WAIT); ifTest_SET = false; vTaskDelete(NULL); } BUTTON_NoFixHandler(&setButton); if (SetCounter == 3) { timeout_set = 0; SetCounter = 0; printf("SET OK\r\n"); /* Завершение теста T0 */ /* Устанавливаем статус T0READY, сохраняем статус во флеш */ COM_SetTestState(T0READY); TEST_SetTest(TEST_WAIT); ifTest_SET = false; vTaskDelete(NULL); } vTaskDelay(10); } } /** * @brief Тестирование RTC */ void COM_TestRtc(void) { /* Пытаемся синхронизироваться с NTP сервером */ SNTP_Enable(true); SNTP_Poll(); vTaskDelay(1000); /* Синхронизация удалась */ if (ntpResult) { printf("RTC OK\r\n"); } else printf("RTC FAIL SYNC\r\n"); TEST_SetTest(TEST_WAIT); } /** * @brief Тестирование SPIFLASH */ void COM_TestSPIflash(void) { if (spi_flash_test()) { printf("SPIFLASH OK\r\n"); } else printf("SPIFLASH FAIL SYNC\r\n"); TEST_SetTest(TEST_WAIT); } /** * @brief */ void Test_Ethernet(void) { static bool ethernetInit = false; int timeout = 100; /* 10 sec timeout */ // if (ethernetInit == false) { if (eth_ready_flag == 0) { if(!ethernetInit){ ethernetInit = true; ETH_BSP_Config(); LwIP_Init(); } else{ init_get_ip_address_controller(); } } /* Waiting ETH init */ while ((eth_ready_flag == 0) && (timeout-- > 0)) { vTaskDelay(100); } if (eth_ready_flag == 0) { printf("ETH FAIL\r\n"); } else { sys_thread_new("HTTP", vTaskTcpServer, NULL, 4*configMINIMAL_STACK_SIZE, tskIDLE_PRIORITY); ethernetInit = true; } } /* else { printf("ETH OK\r\n"); }*/ TEST_SetTest(TEST_WAIT); } /** * @brief */ void Test_Serno(void) { macWaiting = true; macIsInstalled = false; // Устанавливаем статус тестирования "T1OK" COM_SetTestState(T0OK); // Отправляем udp пакет с информацией //COM_TestSerno(); // Пауза. В это время должен прийти GET запрос с MAC адресом. //vTaskDelay(8000); //macWaiting = false; //if (!macIsInstalled) // printf("SERNO FAIL\r\n"); for (uint8_t i = 0; i < 4; i++) { // Отправляем udp пакет с информацией COM_TestSerno(); // Пауза. В это время должен прийти GET запрос с MAC адресом. vTaskDelay(8000); if (macIsInstalled) break; } if (!macIsInstalled) printf("SERNO FAIL\r\n"); TEST_SetTest(TEST_WAIT); } // -------------------------------------------------------------------------- // 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) РОТЕК **********************************/