bsp 跟进 未测试
This commit is contained in:
parent
1d767a00d7
commit
08336935aa
|
@ -29,6 +29,10 @@ PA0903::PA0903()
|
||||||
{
|
{
|
||||||
EthernetLed = nullptr;
|
EthernetLed = nullptr;
|
||||||
WirelessLed = nullptr;
|
WirelessLed = nullptr;
|
||||||
|
|
||||||
|
Host = nullptr;
|
||||||
|
HostAP = nullptr;
|
||||||
|
Client = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint OnSerial(ITransport* transport, Buffer& bs, void* param, void* param2)
|
uint OnSerial(ITransport* transport, Buffer& bs, void* param, void* param2)
|
||||||
|
@ -81,113 +85,92 @@ void PA0903::Setup(ushort code, cstring name, COM message, int baudRate)
|
||||||
Config::Current = &Config::CreateFlash();
|
Config::Current = &Config::CreateFlash();
|
||||||
}
|
}
|
||||||
|
|
||||||
ISocketHost* PA0903::Create5500()
|
// 网络就绪
|
||||||
|
void OnNetReady(PA0903& ap, ISocketHost& host)
|
||||||
|
{
|
||||||
|
if (ap.Client) ap.Client->Open();
|
||||||
|
}
|
||||||
|
|
||||||
|
ISocketHost* PA0903::Open5500()
|
||||||
|
{
|
||||||
|
IDataPort* led = nullptr;
|
||||||
|
if(EthernetLed) led = CreateFlushPort(EthernetLed);
|
||||||
|
|
||||||
|
auto host = (W5500*)Create5500(Spi1, PA8, PA0, led);
|
||||||
|
host->NetReady = Delegate<ISocketHost&>(OnNetReady, this);
|
||||||
|
if(host->Open()) return host;
|
||||||
|
|
||||||
|
delete host;
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ISocketHost* PA0903::Create5500(SPI spi, Pin irq, Pin rst, IDataPort* led)
|
||||||
{
|
{
|
||||||
debug_printf("\r\nW5500::Create \r\n");
|
debug_printf("\r\nW5500::Create \r\n");
|
||||||
|
|
||||||
auto spi = new Spi(Spi1, 36000000);
|
auto spi_ = new Spi(spi, 36000000);
|
||||||
|
|
||||||
auto net = new W5500();
|
auto net = new W5500();
|
||||||
net->LoadConfig();
|
net->LoadConfig();
|
||||||
net->Init(spi, PA8, PA0);
|
net->Init(spi_, irq, rst);
|
||||||
|
|
||||||
if(EthernetLed) net->Led = CreateFlushPort(EthernetLed);
|
|
||||||
|
|
||||||
Host = net;
|
|
||||||
|
|
||||||
return net;
|
return net;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************** DHCP ********************************/
|
|
||||||
|
|
||||||
static Action _DHCP_Ready = nullptr;
|
|
||||||
|
|
||||||
static void On_DHCP_Ready(void* param)
|
|
||||||
{
|
|
||||||
if(_DHCP_Ready) _DHCP_Ready(param);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void OnDhcpStop(Dhcp& dhcp)
|
|
||||||
{
|
|
||||||
// DHCP成功,或者失败且超过最大错误次数,都要启动网关,让它以上一次配置工作
|
|
||||||
if(dhcp.Result || dhcp.Times >= dhcp.MaxTimes)
|
|
||||||
{
|
|
||||||
// 防止调用栈太深,另外开任务
|
|
||||||
if(_DHCP_Ready) Sys.AddTask(On_DHCP_Ready, &dhcp.Host, 0, -1, "网络就绪");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PA0903::InitDHCP(Action onNetReady)
|
|
||||||
{
|
|
||||||
_DHCP_Ready = onNetReady;
|
|
||||||
|
|
||||||
// 打开DHCP
|
|
||||||
auto dhcp = new Dhcp(*Host);
|
|
||||||
dhcp->OnStop = OnDhcpStop;
|
|
||||||
dhcp->Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************** DNS ********************************/
|
|
||||||
|
|
||||||
bool PA0903::QueryDNS(TokenConfig& tk)
|
|
||||||
{
|
|
||||||
auto svr = tk.Server();
|
|
||||||
if(svr.Length() == 0) return false;
|
|
||||||
|
|
||||||
// 根据DNS获取云端IP地址
|
|
||||||
auto ip = DNS::Query(*Host, svr);
|
|
||||||
if(ip == IPAddress::Any())
|
|
||||||
{
|
|
||||||
debug_printf("DNS::Query %s 失败!\r\n", svr.GetBuffer());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
debug_printf("服务器地址 %s %s:%d \r\n", svr.GetBuffer(), ip.ToString().GetBuffer(), tk.ServerPort);
|
|
||||||
|
|
||||||
tk.ServerIP = ip.Value;
|
|
||||||
tk.Save();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************** Token ********************************/
|
/******************************** Token ********************************/
|
||||||
|
|
||||||
TokenClient* PA0903::CreateClient()
|
void PA0903::CreateClient()
|
||||||
{
|
{
|
||||||
debug_printf("\r\nCreateClient \r\n");
|
if(Client) return;
|
||||||
|
|
||||||
auto tk = TokenConfig::Current;
|
auto tk = TokenConfig::Current;
|
||||||
|
|
||||||
// 创建连接服务器的Socket
|
|
||||||
auto socket = Host->CreateSocket(tk->Protocol);
|
|
||||||
socket->Remote.Port = tk->ServerPort;
|
|
||||||
socket->Remote.Address = IPAddress(tk->ServerIP);
|
|
||||||
|
|
||||||
// 创建连接服务器的控制器
|
|
||||||
auto ctrl = new TokenController();
|
|
||||||
ctrl->Port = dynamic_cast<ITransport*>(socket);
|
|
||||||
|
|
||||||
// 创建客户端
|
// 创建客户端
|
||||||
auto client = new TokenClient();
|
auto client = new TokenClient();
|
||||||
client->Control = ctrl;
|
//client->Control = ctrl;
|
||||||
//client->Local = ctrl;
|
//client->Local = ctrl;
|
||||||
client->Cfg = tk;
|
client->Cfg = tk;
|
||||||
|
|
||||||
// 如果是TCP,需要再建立一个本地UDP
|
Client = client;
|
||||||
//if(tk->Protocol == NetType::Tcp)
|
}
|
||||||
{
|
|
||||||
// 建立一个监听内网的UDP Socket
|
|
||||||
socket = Host->CreateSocket(NetType::Udp);
|
|
||||||
socket->Remote.Port = 3355; // 广播端口。其实用哪一个都不重要,因为不会主动广播
|
|
||||||
socket->Remote.Address = IPAddress::Broadcast();
|
|
||||||
socket->Local.Port = tk->Port;
|
|
||||||
|
|
||||||
// 建立内网控制器
|
void PA0903::OpenClient()
|
||||||
auto token2 = new TokenController();
|
{
|
||||||
token2->Port = dynamic_cast<ITransport*>(socket);
|
debug_printf("\r\n OpenClient \r\n");
|
||||||
client->Local = token2;
|
assert(Host, "Host");
|
||||||
}
|
|
||||||
|
|
||||||
return client;
|
auto tk = TokenConfig::Current;
|
||||||
|
AddControl(*Host, *tk);
|
||||||
|
|
||||||
|
TokenConfig cfg;
|
||||||
|
cfg.Protocol = NetType::Udp;
|
||||||
|
cfg.ServerIP = IPAddress::Broadcast().Value;
|
||||||
|
cfg.ServerPort = 3355;
|
||||||
|
AddControl(*Host, cfg);
|
||||||
|
|
||||||
|
if(HostAP) AddControl(*HostAP, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PA0903::AddControl(ISocketHost& host, TokenConfig& cfg)
|
||||||
|
{
|
||||||
|
// 创建连接服务器的Socket
|
||||||
|
auto socket = host.CreateSocket(cfg.Protocol);
|
||||||
|
socket->Remote.Port = cfg.ServerPort;
|
||||||
|
socket->Remote.Address = IPAddress(cfg.ServerIP);
|
||||||
|
socket->Server = cfg.Server();
|
||||||
|
|
||||||
|
// 创建连接服务器的控制器
|
||||||
|
auto ctrl = new TokenController();
|
||||||
|
//ctrl->Port = dynamic_cast<ITransport*>(socket);
|
||||||
|
ctrl->Socket = socket;
|
||||||
|
|
||||||
|
// 创建客户端
|
||||||
|
auto client = Client;
|
||||||
|
client->Controls.Add(ctrl);
|
||||||
|
|
||||||
|
// 如果不是第一个,则打开远程
|
||||||
|
if(client->Controls.Count() > 1) ctrl->ShowRemote = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************** 2401 ********************************/
|
/******************************** 2401 ********************************/
|
||||||
|
|
|
@ -11,25 +11,26 @@ class PA0903
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OutputPort Leds[2];
|
OutputPort Leds[2];
|
||||||
// InputPort Buttons[2];
|
|
||||||
|
|
||||||
OutputPort* EthernetLed; // 以太网指示灯
|
OutputPort* EthernetLed; // 以太网指示灯
|
||||||
OutputPort* WirelessLed; // 无线指示灯
|
OutputPort* WirelessLed; // 无线指示灯
|
||||||
|
|
||||||
ISocketHost* Host; // 网络主机
|
ISocketHost* Host; // 网络主机
|
||||||
|
ISocketHost* HostAP; // 网络主机
|
||||||
|
TokenClient* Client; // 令牌客户端
|
||||||
|
|
||||||
PA0903();
|
PA0903();
|
||||||
|
|
||||||
void Setup(ushort code, cstring name, COM message = COM1, int baudRate = 0);
|
void Setup(ushort code, cstring name, COM message = COM1, int baudRate = 0);
|
||||||
|
|
||||||
|
// 打开以太网W5500,如果网络未接通,则返回空
|
||||||
|
ISocketHost* Open5500();
|
||||||
|
static ISocketHost* Create5500(SPI spi, Pin irq, Pin rst = P0, IDataPort* led = nullptr);
|
||||||
|
|
||||||
|
void CreateClient();
|
||||||
|
void OpenClient();
|
||||||
|
void AddControl(ISocketHost& host, TokenConfig& cfg);
|
||||||
|
|
||||||
ISocketHost* Create5500();
|
|
||||||
//ITransport* Create2401();
|
|
||||||
//ISocketHost* Create8266();
|
|
||||||
|
|
||||||
TokenClient* CreateClient();
|
|
||||||
|
|
||||||
void InitDHCP(Action onNetReady = nullptr);
|
|
||||||
bool QueryDNS(TokenConfig& tk);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue