Добавлен выбор всех приборов и мигание светодиода при приёме команды.

This commit is contained in:
MaD_CaT
2024-09-17 08:45:41 +03:00
parent 671f674bcc
commit 3f72134e13
5 changed files with 17377 additions and 17073 deletions

View File

@@ -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;

View File

@@ -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)

View File

@@ -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 */
}