Добавлен выбор всех приборов и мигание светодиода при приёме команды.
This commit is contained in:
177
Core/Src/main.c
177
Core/Src/main.c
@@ -50,6 +50,7 @@ SRAM_HandleTypeDef hsram1;
|
||||
|
||||
/* USER CODE BEGIN PV */
|
||||
uint32_t br_counter = 0;
|
||||
uint32_t rx_counter = 0;
|
||||
ip_addr_t rx_addr;
|
||||
struct rcv_msg rx_msg;
|
||||
struct tsm_msg tx_msg;
|
||||
@@ -122,6 +123,7 @@ int main(void)
|
||||
/* Starting Error */
|
||||
Error_Handler();
|
||||
}
|
||||
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
@@ -150,6 +152,10 @@ int main(void)
|
||||
rx_msg.clnt_con = 0;
|
||||
}
|
||||
|
||||
if (rx_counter > 30)
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);
|
||||
}
|
||||
}
|
||||
/* USER CODE END WHILE */
|
||||
}
|
||||
@@ -417,12 +423,15 @@ void rcv_command(void)
|
||||
{
|
||||
uint16_t ports_amount = 0;
|
||||
uint16_t bytes_amount = 0;
|
||||
uint16_t len_block = 0;
|
||||
uint16_t i = 0;
|
||||
rx_msg.cmd_num = rx_msg.rx_buf[2] | (rx_msg.rx_buf[3] << 8);
|
||||
rx_msg.cmd_code = rx_msg.rx_buf[6];
|
||||
tx_msg.status_len = create_header();
|
||||
|
||||
unsigned char *cmd_buf = &tx_msg.tx_buf[tx_msg.status_len];
|
||||
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET);
|
||||
rx_counter = 0;
|
||||
switch(rx_msg.cmd_code) // код команды
|
||||
{
|
||||
case 0:
|
||||
@@ -494,7 +503,7 @@ void rcv_command(void)
|
||||
{
|
||||
// Установить ВЫПОЛНЕНО
|
||||
cmd_buf[1] = NO_ERROR;
|
||||
// Колличество прочитаных портов
|
||||
// Колличество записанных портов
|
||||
cmd_buf[2] = rx_msg.rx_buf[7];
|
||||
|
||||
uint16_t port_data;
|
||||
@@ -514,39 +523,6 @@ void rcv_command(void)
|
||||
tx_msg.cmd_len = (ports_amount << 2) + 3;
|
||||
}
|
||||
break;
|
||||
case 55:
|
||||
//-----------------------------------------------------------
|
||||
// КОМАНДА №55
|
||||
// ЗАПИСЬ МАССИВА В FLASH
|
||||
//-----------------------------------------------------------
|
||||
|
||||
cmd_buf[0] = rx_msg.cmd_code; // - код команды
|
||||
bytes_amount = rx_msg.rx_buf[9] + (rx_msg.rx_buf[10] << 8);
|
||||
|
||||
// Проверка размера принятого буфера
|
||||
if( rx_msg.length < (10 + bytes_amount))
|
||||
{
|
||||
// Размер принятого пакета меньше чем долно быть
|
||||
// Установить ошибку
|
||||
// КОД = 2
|
||||
cmd_buf[1] = ERR_SIZE;
|
||||
|
||||
// Установить размер буфера = 2
|
||||
tx_msg.cmd_len = 2;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Установить ВЫПОЛНЕНО
|
||||
cmd_buf[1] = NO_ERROR;
|
||||
|
||||
uint16_t flash_addr = rx_msg.rx_buf[7] + (rx_msg.rx_buf[8] << 8);
|
||||
uint16_t numofwords = (bytes_amount/4)+((bytes_amount%4)!=0);
|
||||
Flash_Write_Data(FLASH_BASE_WR + flash_addr, (uint32_t *)&rx_msg.rx_buf[11], numofwords);
|
||||
// Установить размер буфера
|
||||
tx_msg.cmd_len = 2;
|
||||
}
|
||||
break;
|
||||
case 51:
|
||||
//-----------------------------------------------------------
|
||||
// КОМАНДА №51
|
||||
@@ -584,6 +560,139 @@ void rcv_command(void)
|
||||
tx_msg.cmd_len = 6 + bytes_amount;
|
||||
}
|
||||
break;
|
||||
case 55:
|
||||
//-----------------------------------------------------------
|
||||
// КОМАНДА №55
|
||||
// ЗАПИСЬ МАССИВА В FLASH
|
||||
//-----------------------------------------------------------
|
||||
|
||||
cmd_buf[0] = rx_msg.cmd_code; // - код команды
|
||||
bytes_amount = rx_msg.rx_buf[9] + (rx_msg.rx_buf[10] << 8);
|
||||
|
||||
// Проверка размера принятого буфера
|
||||
if( rx_msg.length < (10 + bytes_amount))
|
||||
{
|
||||
// Размер принятого пакета меньше чем долно быть
|
||||
// Установить ошибку
|
||||
// КОД = 2
|
||||
cmd_buf[1] = ERR_SIZE;
|
||||
|
||||
// Установить размер буфера = 2
|
||||
tx_msg.cmd_len = 2;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Установить ВЫПОЛНЕНО
|
||||
cmd_buf[1] = NO_ERROR;
|
||||
|
||||
uint16_t flash_addr = rx_msg.rx_buf[7] + (rx_msg.rx_buf[8] << 8);
|
||||
uint16_t numofwords = (bytes_amount/4)+((bytes_amount%4)!=0);
|
||||
Flash_Write_Data(FLASH_BASE_WR + flash_addr, (uint32_t *)&rx_msg.rx_buf[11], numofwords);
|
||||
// Установить размер буфера
|
||||
tx_msg.cmd_len = 2;
|
||||
}
|
||||
break;
|
||||
case 60:
|
||||
//-----------------------------------------------------------
|
||||
// КОМАНДА №60
|
||||
// ЗАПИСЬ МАССИВА В ПОРТ
|
||||
//-----------------------------------------------------------
|
||||
|
||||
cmd_buf[0] = rx_msg.cmd_code; // - код команды
|
||||
len_block = rx_msg.rx_buf[7] + (rx_msg.rx_buf[8] << 8); // - длинна блока данных в словах
|
||||
|
||||
// Проверка размера принятого буфера
|
||||
if( rx_msg.length < (11 + len_block * 2))
|
||||
{
|
||||
// Размер принятого пакета меньше чем долно быть
|
||||
// Установить ошибку
|
||||
// КОД = 2
|
||||
cmd_buf[1] = ERR_SIZE;
|
||||
|
||||
// Установить размер буфера = 2
|
||||
tx_msg.cmd_len = 2;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Установить ВЫПОЛНЕНО
|
||||
cmd_buf[1] = NO_ERROR;
|
||||
// Колличество записанных портов
|
||||
cmd_buf[2] = rx_msg.rx_buf[7];
|
||||
cmd_buf[3] = rx_msg.rx_buf[8];
|
||||
cmd_buf[4] = rx_msg.rx_buf[9];
|
||||
cmd_buf[5] = rx_msg.rx_buf[10];
|
||||
|
||||
uint16_t port_data;
|
||||
uint16_t port_addr;
|
||||
|
||||
port_addr = rx_msg.rx_buf[9] + (rx_msg.rx_buf[10] << 8);
|
||||
for (i = 0; i<len_block; i++)
|
||||
{
|
||||
port_data = rx_msg.rx_buf[11 + i * 2] + (rx_msg.rx_buf[12 + i * 2] << 8);
|
||||
write_isa(port_addr, port_data);
|
||||
}
|
||||
// Установить размер буфера
|
||||
tx_msg.cmd_len = 6;
|
||||
}
|
||||
break;
|
||||
case 61:
|
||||
//-----------------------------------------------------------
|
||||
// КОМАНДА №61
|
||||
// ЧТЕНИЕ МАССИВА ИЗ ПОРТА
|
||||
//-----------------------------------------------------------
|
||||
|
||||
cmd_buf[0] = rx_msg.cmd_code; // - код команды
|
||||
len_block = rx_msg.rx_buf[7] + (rx_msg.rx_buf[8] << 8); // - длинна блока данных в словах
|
||||
|
||||
// Проверка размера принятого буфера
|
||||
if( rx_msg.length < 11 )
|
||||
{
|
||||
// Размер принятого пакета меньше чем долно быть
|
||||
// Установить ошибку
|
||||
// КОД = 2
|
||||
cmd_buf[1] = ERR_SIZE;
|
||||
|
||||
// Установить размер буфера = 2
|
||||
tx_msg.cmd_len = 2;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Установить ВЫПОЛНЕНО
|
||||
cmd_buf[1] = NO_ERROR;
|
||||
// Колличество прочитаных портов
|
||||
cmd_buf[2] = rx_msg.rx_buf[7];
|
||||
cmd_buf[3] = rx_msg.rx_buf[8];
|
||||
cmd_buf[4] = rx_msg.rx_buf[9];
|
||||
cmd_buf[5] = rx_msg.rx_buf[10];
|
||||
|
||||
uint16_t port_data;
|
||||
uint16_t port_addr;
|
||||
|
||||
port_addr = rx_msg.rx_buf[9] + (rx_msg.rx_buf[10] << 8);
|
||||
for (i = 0; i<len_block; i++)
|
||||
{
|
||||
port_data = read_isa(port_addr);
|
||||
cmd_buf[6 + (i*2)] = port_data & 0xFF;
|
||||
cmd_buf[7 + (i*2)] = port_data >> 8;
|
||||
}
|
||||
// Установить размер буфера
|
||||
tx_msg.cmd_len = 6 + len_block * 2;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
//-----------------------------------------------------------
|
||||
// НЕИЗВЕСТНАЯ КОМАНДА
|
||||
//-----------------------------------------------------------
|
||||
|
||||
cmd_buf[0] = rx_msg.cmd_code; // - код команды
|
||||
cmd_buf[1] = ERR_UNKNOW_COMMAND;
|
||||
tx_msg.cmd_len = 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
need_send_private = 1;
|
||||
|
||||
@@ -10,15 +10,45 @@
|
||||
uint32_t get_ip(void)
|
||||
{
|
||||
uint32_t pribor = (((GPIOC->IDR) >> 6) & 0x7) | (((GPIOC->IDR) >> 9) & 0x18);
|
||||
if (pribor == PRIBOR_UF) return ipaddr_addr(IP_PRIBOR_UF);
|
||||
else return ipaddr_addr("10.1.1.69");
|
||||
switch(pribor)
|
||||
{
|
||||
case PRIBOR_UF: return ipaddr_addr(IP_PRIBOR_UF);
|
||||
case PRIBOR_PRDN1: return ipaddr_addr(IP_PRIBOR_PRDN1);
|
||||
case PRIBOR_PRDN2: return ipaddr_addr(IP_PRIBOR_PRDN2);
|
||||
case PRIBOR_PRDN3: return ipaddr_addr(IP_PRIBOR_PRDN3);
|
||||
case PRIBOR_PRDN4: return ipaddr_addr(IP_PRIBOR_PRDN4);
|
||||
case PRIBOR_PRDV1: return ipaddr_addr(IP_PRIBOR_PRDV1);
|
||||
case PRIBOR_PRDV2: return ipaddr_addr(IP_PRIBOR_PRDV2);
|
||||
case PRIBOR_PRDV3: return ipaddr_addr(IP_PRIBOR_PRDV3);
|
||||
case PRIBOR_PRDV4: return ipaddr_addr(IP_PRIBOR_PRDV4);
|
||||
case PRIBOR_PRDK1: return ipaddr_addr(IP_PRIBOR_PRDK1);
|
||||
case PRIBOR_PRDK2: return ipaddr_addr(IP_PRIBOR_PRDK2);
|
||||
case PRIBOR_PRDK3: return ipaddr_addr(IP_PRIBOR_PRDK3);
|
||||
case PRIBOR_PRDK4: return ipaddr_addr(IP_PRIBOR_PRDK4);
|
||||
default: return ipaddr_addr(IP_PRIBOR_DEFAULT);
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t get_port(void)
|
||||
{
|
||||
uint32_t pribor = (((GPIOC->IDR) >> 6) & 0x7) | (((GPIOC->IDR) >> 9) & 0x18);
|
||||
if (pribor == PRIBOR_UF) return 50000U + PORT_PRIBOR_UF;
|
||||
else return 50069U;
|
||||
switch(pribor)
|
||||
{
|
||||
case PRIBOR_UF: return 50000U + PORT_PRIBOR_UF;
|
||||
case PRIBOR_PRDN1: return 50000U + PORT_PRIBOR_PRDN1;
|
||||
case PRIBOR_PRDN2: return 50000U + PORT_PRIBOR_PRDN2;
|
||||
case PRIBOR_PRDN3: return 50000U + PORT_PRIBOR_PRDN3;
|
||||
case PRIBOR_PRDN4: return 50000U + PORT_PRIBOR_PRDN4;
|
||||
case PRIBOR_PRDV1: return 50000U + PORT_PRIBOR_PRDV1;
|
||||
case PRIBOR_PRDV2: return 50000U + PORT_PRIBOR_PRDV2;
|
||||
case PRIBOR_PRDV3: return 50000U + PORT_PRIBOR_PRDV3;
|
||||
case PRIBOR_PRDV4: return 50000U + PORT_PRIBOR_PRDV4;
|
||||
case PRIBOR_PRDK1: return 50000U + PORT_PRIBOR_PRDK1;
|
||||
case PRIBOR_PRDK2: return 50000U + PORT_PRIBOR_PRDK2;
|
||||
case PRIBOR_PRDK3: return 50000U + PORT_PRIBOR_PRDK3;
|
||||
case PRIBOR_PRDK4: return 50000U + PORT_PRIBOR_PRDK4;
|
||||
default: return 50000U + PORT_PRIBOR_DEFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t set_status(unsigned char *buf)
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PV */
|
||||
extern uint32_t br_counter;
|
||||
extern uint32_t rx_counter;
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
@@ -211,6 +212,7 @@ void TIM3_IRQHandler(void)
|
||||
/* USER CODE BEGIN TIM3_IRQn 1 */
|
||||
br_counter++;
|
||||
rx_msg.con_timeout++;
|
||||
rx_counter++;
|
||||
|
||||
/* USER CODE END TIM3_IRQn 1 */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user