From 3ceb6886632c2cfc4e08a7f788bc222a3f6f0f40 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Mon, 24 Jan 2022 13:11:24 +0100 Subject: [PATCH] examples/wifi: add unified example for tcpclient that compiles for all supported wifi adaptors Signed-off-by: deadprogram --- examples/wifi/tcpclient/espat.go | 28 +++++++ examples/wifi/tcpclient/main.go | 111 +++++++++++++++++++++++++++ examples/wifi/tcpclient/rtl8720dn.go | 77 +++++++++++++++++++ examples/wifi/tcpclient/wifinina.go | 36 +++++++++ 4 files changed, 252 insertions(+) create mode 100644 examples/wifi/tcpclient/espat.go create mode 100644 examples/wifi/tcpclient/main.go create mode 100644 examples/wifi/tcpclient/rtl8720dn.go create mode 100644 examples/wifi/tcpclient/wifinina.go diff --git a/examples/wifi/tcpclient/espat.go b/examples/wifi/tcpclient/espat.go new file mode 100644 index 0000000..dd487fc --- /dev/null +++ b/examples/wifi/tcpclient/espat.go @@ -0,0 +1,28 @@ +//go:build espat +// +build espat + +package main + +import ( + "machine" + "tinygo.org/x/drivers/espat" +) + +// these are the default pins for the Arduino Nano33 IoT. +// change these to connect to a different UART or pins for the ESP8266/ESP32 +var ( + uart = machine.UART1 + tx = machine.PA22 + rx = machine.PA23 + + adaptor *espat.Device +) + +func initAdaptor() *espat.Device { + uart.Configure(machine.UARTConfig{TX: tx, RX: rx}) + + adaptor = espat.New(uart) + adaptor.Configure() + + return adaptor +} diff --git a/examples/wifi/tcpclient/main.go b/examples/wifi/tcpclient/main.go new file mode 100644 index 0000000..6de4609 --- /dev/null +++ b/examples/wifi/tcpclient/main.go @@ -0,0 +1,111 @@ +// This example opens a TCP connection and sends some data, +// for the purpose of testing speed and connectivity. +// +// You can open a server to accept connections from this program using: +// +// nc -w 5 -lk 8080 +// +package main + +import ( + "bytes" + "fmt" + "time" + + "tinygo.org/x/drivers/net" +) + +// access point info +const ssid = "" +const pass = "" + +// IP address of the server aka "hub". Replace with your own info. +const serverIP = "" + +var buf = &bytes.Buffer{} + +func main() { + initAdaptor() + + connectToAP() + + for { + sendBatch() + time.Sleep(500 * time.Millisecond) + } + println("Done.") +} + +func sendBatch() { + + // make TCP connection + ip := net.ParseIP(serverIP) + raddr := &net.TCPAddr{IP: ip, Port: 8080} + laddr := &net.TCPAddr{Port: 8080} + + message("---------------\r\nDialing TCP connection") + conn, err := net.DialTCP("tcp", laddr, raddr) + for ; err != nil; conn, err = net.DialTCP("tcp", laddr, raddr) { + message(err.Error()) + time.Sleep(5 * time.Second) + } + + n := 0 + w := 0 + start := time.Now() + + // send data + message("Sending data") + + for i := 0; i < 1000; i++ { + buf.Reset() + fmt.Fprint(buf, + "\r---------------------------- i == ", i, " ----------------------------"+ + "\r---------------------------- i == ", i, " ----------------------------") + if w, err = conn.Write(buf.Bytes()); err != nil { + println("error:", err.Error(), "\r") + continue + } + n += w + } + + buf.Reset() + ms := time.Now().Sub(start).Milliseconds() + fmt.Fprint(buf, "\nWrote ", n, " bytes in ", ms, " ms\r\n") + message(buf.String()) + + if _, err := conn.Write(buf.Bytes()); err != nil { + println("error:", err.Error(), "\r") + } + + // Right now this code is never reached. Need a way to trigger it... + println("Disconnecting TCP...") + conn.Close() +} + +// connect to access point +func connectToAP() { + time.Sleep(2 * time.Second) + println("Connecting to " + ssid) + err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second) + if err != nil { // error connecting to AP + for { + println(err) + time.Sleep(1 * time.Second) + } + } + + println("Connected.") + + time.Sleep(2 * time.Second) + ip, err := adaptor.GetClientIP() + for ; err != nil; ip, err = adaptor.GetClientIP() { + message(err.Error()) + time.Sleep(1 * time.Second) + } + message(ip) +} + +func message(msg string) { + println(msg, "\r") +} diff --git a/examples/wifi/tcpclient/rtl8720dn.go b/examples/wifi/tcpclient/rtl8720dn.go new file mode 100644 index 0000000..a225bf9 --- /dev/null +++ b/examples/wifi/tcpclient/rtl8720dn.go @@ -0,0 +1,77 @@ +//go:build rtl8720dn +// +build rtl8720dn + +package main + +import ( + "device/sam" + "machine" + "runtime/interrupt" + "time" + + "tinygo.org/x/drivers/net" + "tinygo.org/x/drivers/rtl8720dn" +) + +var ( + adaptor *rtl8720dn.RTL8720DN + + uart UARTx +) + +func initAdaptor() *rtl8720dn.RTL8720DN { + adaptor, err := setupRTL8720DN() + if err != nil { + return nil + } + net.UseDriver(adaptor) + + return adaptor +} + +func handleInterrupt(interrupt.Interrupt) { + // should reset IRQ + uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF))) + uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC) +} + +func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) { + machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput}) + machine.RTL8720D_CHIP_PU.Low() + time.Sleep(100 * time.Millisecond) + machine.RTL8720D_CHIP_PU.High() + time.Sleep(1000 * time.Millisecond) + + uart = UARTx{ + UART: &machine.UART{ + Buffer: machine.NewRingBuffer(), + Bus: sam.SERCOM0_USART_INT, + SERCOM: 0, + }, + } + + uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt) + uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400}) + + rtl := rtl8720dn.New(uart) + //rtl.Debug(debug) + + _, err := rtl.Rpc_tcpip_adapter_init() + if err != nil { + return nil, err + } + + return rtl, nil +} + +type UARTx struct { + *machine.UART +} + +func (u UARTx) Read(p []byte) (n int, err error) { + if u.Buffered() == 0 { + time.Sleep(1 * time.Millisecond) + return 0, nil + } + return u.UART.Read(p) +} diff --git a/examples/wifi/tcpclient/wifinina.go b/examples/wifi/tcpclient/wifinina.go new file mode 100644 index 0000000..0902079 --- /dev/null +++ b/examples/wifi/tcpclient/wifinina.go @@ -0,0 +1,36 @@ +//go:build wifinina +// +build wifinina + +package main + +import ( + "machine" + "tinygo.org/x/drivers/wifinina" +) + +var ( + // default interface for the Arduino Nano33 IoT. + spi = machine.NINA_SPI + + // ESP32/ESP8266 chip that has the WIFININA firmware flashed on it + adaptor *wifinina.Device +) + +func initAdaptor() *wifinina.Device { + // Configure SPI for 8Mhz, Mode 0, MSB First + spi.Configure(machine.SPIConfig{ + Frequency: 8 * 1e6, + SDO: machine.NINA_SDO, + SDI: machine.NINA_SDI, + SCK: machine.NINA_SCK, + }) + + adaptor = wifinina.New(spi, + machine.NINA_CS, + machine.NINA_ACK, + machine.NINA_GPIO0, + machine.NINA_RESETN) + adaptor.Configure() + + return adaptor +}