Добавлены команды чтения и записи портов по Ethernet.

This commit is contained in:
MaD_CaT
2024-09-10 11:21:32 +03:00
parent ee17ebfb76
commit e607f3034d
5 changed files with 53026 additions and 38 deletions

View File

@@ -18,7 +18,9 @@
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "lwip.h"
#include "lwip/udp.h"
#include "lwip/debug.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
@@ -46,9 +48,9 @@ SRAM_HandleTypeDef hsram1;
/* USER CODE BEGIN PV */
uint32_t br_counter = 0;
uint16_t reply_len = 0;
unsigned char msg[1400];
ip_addr_t rx_addr;
struct rcv_msg rx_msg;
struct tsm_msg tx_msg;
_Bool need_send_private = 0;
/* USER CODE END PV */
@@ -107,15 +109,10 @@ int main(void)
/* USER CODE BEGIN 2 */
struct udp_pcb * pcb = udp_new();
sock_init(pcb);
memset(msg, 0, sizeof msg);
msg[0] = 1;
msg[1] = 2;
msg[2] = 3;
msg[3] = 4;
struct pbuf *p = pbuf_alloc(0, sizeof msg, PBUF_RAM);
memset(tx_msg.tx_buf, 0, sizeof tx_msg.tx_buf);
struct pbuf *p = pbuf_alloc(0, sizeof tx_msg.tx_buf, PBUF_RAM);
uint32_t br_addr = ipaddr_addr("10.1.1.255");
u16_t br_port = 50000U;
set_pbuf_params(p, sizeof msg);
// timer start
if (HAL_TIM_Base_Start_IT(&htim3) != HAL_OK)
{
@@ -132,15 +129,14 @@ int main(void)
if (need_send_private == 1)
{
need_send_private = 0;
create_header();
set_pbuf_params(p, create_header() + reply_len);
err_t errok = udp_sendto(pcb, p, (ip_addr_t*)&rx_msg.rcv_addr, rx_msg.port);
set_pbuf_params(p, tx_msg.status_len + tx_msg.cmd_len);
err_t errok = udp_sendto(pcb, p, &rx_addr, rx_msg.port);
br_counter = 0;
}
if (br_counter > 99)
{
create_header();
set_pbuf_params(p, create_header() + reply_len);
set_pbuf_params(p, create_header() + tx_msg.cmd_len);
err_t errok = udp_sendto(pcb, p, (ip_addr_t*)&br_addr, br_port);
br_counter = 0;
}
@@ -342,22 +338,21 @@ static void MX_GPIO_Init(void)
uint16_t create_header(void)
{
uint16_t status_len;
msg[0] = 0;
msg[1] = 0;
msg[2] = rx_msg.rx_buf[2];
msg[3] = rx_msg.rx_buf[3];
msg[5] = 0;
msg[6] = 0;
status_len = set_status(msg);
return status_len + 6;
tx_msg.tx_buf[0] = 0;
tx_msg.tx_buf[1] = 0;
tx_msg.tx_buf[2] = rx_msg.rx_buf[2];
tx_msg.tx_buf[3] = rx_msg.rx_buf[3];
tx_msg.tx_buf[5] = 0;
tx_msg.tx_buf[6] = 0;
tx_msg.status_len = set_status(tx_msg.tx_buf) + 6;
return tx_msg.status_len;
}
void set_pbuf_params(struct pbuf *p, u16_t length)
{
p->len = length;
p->tot_len = p->len;
memcpy(p->payload, msg, p->tot_len);
memcpy(p->payload, tx_msg.tx_buf, p->tot_len);
}
void sock_init(struct udp_pcb * pcb)
@@ -366,12 +361,13 @@ void sock_init(struct udp_pcb * pcb)
u16_t port = get_port();
err_t errok = udp_bind(pcb, (ip_addr_t*)&ipaddr, port);
udp_recv(pcb, udp_echo_recv, NULL);
rx_msg.rcv_addr = 0;
rx_msg.port = 0;
rx_msg.cmd_num = 0;
rx_msg.cmd_code = 0;
rx_msg.clnt_con = 0;
rx_msg.length = 0;
tx_msg.status_len = 0;
tx_msg.cmd_len = 0;
memset(rx_msg.rx_buf, 0, sizeof rx_msg.rx_buf);
return;
}
@@ -380,20 +376,20 @@ void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,
const ip_addr_t *addr, u16_t port)
{
if (p != NULL) {
ip_addr_t rcv_addr = addr[0];
if (p->tot_len < sizeof rx_msg.rx_buf)
{
if (p->tot_len < 6)
{
return;
}
memcpy(rx_msg.rx_buf, p->payload, p->tot_len);
if (rx_msg.clnt_con == 1)
{
/*if ((rx_msg.rcv_addr != (uint32_t) rcv_addr.addr) || (rx_msg.port != port))
if ((memcmp(&rx_addr, addr, sizeof rx_addr)!= 0) || (rx_msg.port != port))
{
return;
}*/
u16_t cmd_num = rx_msg.rx_buf[2] | (rx_msg.rx_buf[3] << 8);
}
uint16_t cmd_num = rx_msg.rx_buf[2] | (rx_msg.rx_buf[3] << 8);
if (cmd_num != (rx_msg.cmd_num + 1))
{
return;
@@ -401,12 +397,11 @@ void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,
}
else
{
rx_msg.rcv_addr = (uint32_t) rcv_addr.addr;
memcpy(&rx_addr, addr, sizeof rx_addr);
rx_msg.port = port;
}
rx_msg.con_timeout = 0;
rx_msg.clnt_con = 1;
memcpy(rx_msg.rx_buf, p->payload, p->tot_len);
rx_msg.length = p->tot_len;
rcv_command();
}
@@ -417,10 +412,107 @@ void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,
void rcv_command(void)
{
uint16_t ports_amount = 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];
need_send_private = 1;
tx_msg.status_len = create_header();
unsigned char *cmd_buf = &tx_msg.tx_buf[tx_msg.status_len];
switch(rx_msg.cmd_code) // код команды
{
case 0:
//-----------------------------------------------------------
// КОМАНДА №0
// ЧТЕНИЕ МАССИВА ПОРТОВ
//-----------------------------------------------------------
cmd_buf[0] = rx_msg.cmd_code; // - код команды
ports_amount = rx_msg.rx_buf[7];
// Проверка размера принятого буфера
if( rx_msg.length < (8 + ports_amount * 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];
uint16_t port_data = 0xFFFF;
uint16_t port_addr = 0x0000;
for (i = 0; i<ports_amount; i++)
{
port_addr = rx_msg.rx_buf[8 + i * 2] + (rx_msg.rx_buf[9 + i * 2] << 8);
cmd_buf[3 + (i*4)] = rx_msg.rx_buf[8 + i * 2];
cmd_buf[4 + (i*4)] = rx_msg.rx_buf[9 + i * 2];
port_data = read_isa(port_addr);
cmd_buf[5 + (i*4)] = port_data & 0xFF;
cmd_buf[6 + (i*4)] = port_data >> 8;
}
// Установить размер буфера
tx_msg.cmd_len = (ports_amount << 2) + 3;
}
break;
case 1:
//-----------------------------------------------------------
// КОМАНДА №1
// ЗАПИСЬ МАССИВА ПОРТОВ
//-----------------------------------------------------------
cmd_buf[0] = rx_msg.cmd_code; // - код команды
ports_amount = rx_msg.rx_buf[7];
// Проверка размера принятого буфера
if( rx_msg.length < (8 + ports_amount * 4))
{
// Размер принятого пакета меньше чем долно быть
// Установить ошибку
// КОД = 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];
uint16_t port_data;
uint16_t port_addr;
for (i = 0; i<ports_amount; i++)
{
port_addr = rx_msg.rx_buf[8 + i * 4] + (rx_msg.rx_buf[9 + i * 4] << 8);
port_data = rx_msg.rx_buf[10 + i * 4] + (rx_msg.rx_buf[11 + i * 4] << 8);
cmd_buf[3 + (i*4)] = rx_msg.rx_buf[8 + i * 4];
cmd_buf[4 + (i*4)] = rx_msg.rx_buf[9 + i * 4];
write_isa(port_addr, port_data);
port_data = read_isa(port_addr);
cmd_buf[5 + (i*4)] = port_data & 0xFF;
cmd_buf[6 + (i*4)] = port_data >> 8;
}
// Установить размер буфера
tx_msg.cmd_len = (ports_amount << 2) + 3;
}
break;
}
need_send_private = 1;
}