summaryrefslogtreecommitdiff
path: root/software
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2024-05-30 16:47:29 +0200
committerxengineering <me@xengineering.eu>2024-05-30 16:48:39 +0200
commit96d159114af675d55fe0d7c0f22a69d65e9563fc (patch)
tree1d7b7e6a84b5d06765084ea6414874a21d3cbaa5 /software
parent0cfd378394b6c5d90e00c217b12113e0c3284031 (diff)
downloadiot-core-96d159114af675d55fe0d7c0f22a69d65e9563fc.tar
iot-core-96d159114af675d55fe0d7c0f22a69d65e9563fc.tar.zst
iot-core-96d159114af675d55fe0d7c0f22a69d65e9563fc.zip
software: communication: Add SerialInterface
This new type bundles the whole communication stack. This is easier to use than handling types for each layer on the user side of the communication package.
Diffstat (limited to 'software')
-rw-r--r--software/communication/interface.go52
-rw-r--r--software/communication/physical.go28
-rw-r--r--software/main.go16
3 files changed, 59 insertions, 37 deletions
diff --git a/software/communication/interface.go b/software/communication/interface.go
new file mode 100644
index 0000000..d6111cc
--- /dev/null
+++ b/software/communication/interface.go
@@ -0,0 +1,52 @@
+package communication
+
+import (
+ "fmt"
+ "log"
+
+ "go.bug.st/serial"
+)
+
+type SerialInterface struct {
+ port serial.Port
+}
+
+func NewSerialInterface() (SerialInterface, error) {
+ iface := SerialInterface{}
+
+ devices, err := getStSerials()
+ if err != nil {
+ return iface, err
+ }
+
+ if len(devices) != 1 {
+ return iface, fmt.Errorf("Require exactly one serial device from STMicroelectronics but %d attached", len(devices))
+ }
+ device := devices[0]
+
+ iface.port, err = openSerial(device)
+ if err != nil {
+ return iface, err
+ }
+
+ return iface, nil
+}
+
+func (i *SerialInterface) Log() {
+ for {
+ data, err := i.Read()
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.Printf("RX: '%s'\n", string(data))
+ }
+}
+
+func (i *SerialInterface) Read() ([]byte, error) {
+ buff := make([]byte, 100)
+ n, err := i.port.Read(buff)
+ if err != nil {
+ return []byte{}, err
+ }
+ return buff[:n], nil
+}
diff --git a/software/communication/physical.go b/software/communication/physical.go
index f79d382..853e4c4 100644
--- a/software/communication/physical.go
+++ b/software/communication/physical.go
@@ -1,8 +1,6 @@
package communication
import (
- "fmt"
-
"go.bug.st/serial"
"go.bug.st/serial/enumerator"
)
@@ -11,11 +9,7 @@ const (
ST_VID = `0483`
)
-type Phy struct {
- port serial.Port
-}
-
-func GetStSerials() ([]string, error) {
+func getStSerials() ([]string, error) {
retval := make([]string, 0)
ports, err := enumerator.GetDetailedPortsList()
@@ -34,26 +28,14 @@ func GetStSerials() ([]string, error) {
return retval, nil
}
-func NewPhy(device string) (Phy, error) {
- p := Phy{}
+func openSerial(device string) (serial.Port, error) {
+ var port serial.Port
mode := &serial.Mode{
BaudRate: 115200,
}
port, err := serial.Open(device, mode)
if err != nil {
- return p, err
- }
- p.port = port
- return p, nil
-}
-
-func (phy *Phy) Cat() error {
- buff := make([]byte, 100)
- for {
- n, err := phy.port.Read(buff)
- if err != nil {
- return err
- }
- fmt.Printf("%s", string(buff[:n]))
+ return port, err
}
+ return port, nil
}
diff --git a/software/main.go b/software/main.go
index 48b71e7..d0d3a8c 100644
--- a/software/main.go
+++ b/software/main.go
@@ -7,22 +7,10 @@ import (
)
func main() {
- ports, err := communication.GetStSerials()
+ iface, err := communication.NewSerialInterface()
if err != nil {
log.Fatal(err)
}
- if len(ports) != 1 {
- log.Fatalf("Require exactly one serial port from STMicroelectronics but %d attached", len(ports))
- }
-
- log.Printf("Detected serial port: %s\n", ports[0])
-
- phy, err := communication.NewPhy(ports[0])
-
- log.Println("Starting to print out incoming data from serial port")
- err = phy.Cat()
- if err != nil {
- log.Fatal(err)
- }
+ iface.Log()
}