bsp 跟进 未测试

This commit is contained in:
WangQiang 2016-06-28 12:49:25 +00:00
parent 1d767a00d7
commit 08336935aa
2 changed files with 79 additions and 95 deletions

View File

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

View File

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