Добавлены команды чтения и записи портов по Ethernet.
This commit is contained in:
156
Core/Src/main.c
156
Core/Src/main.c
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user