decoupled the winIDs from the telemetry data
hell yeah, brother!
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"log/slog"
|
||||
"os"
|
||||
"path"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
helper "esdi/helpers"
|
||||
@@ -106,8 +107,10 @@ func NewCDashState() *CDashState {
|
||||
}
|
||||
|
||||
type CDashDisplay struct {
|
||||
WT *communication.WalkieTalkie
|
||||
State *CDashState
|
||||
WT *communication.WalkieTalkie
|
||||
State *CDashState
|
||||
fieldToWindows map[telemetry.FieldID][]int16
|
||||
bufPool sync.Pool
|
||||
}
|
||||
|
||||
// Connect will try to find and connect to the CDashDisplay
|
||||
@@ -120,14 +123,42 @@ func NewCDashDisplay() (*CDashDisplay, error) {
|
||||
}
|
||||
|
||||
return &CDashDisplay{
|
||||
WT: p,
|
||||
State: NewCDashState(),
|
||||
WT: p,
|
||||
State: NewCDashState(),
|
||||
fieldToWindows: make(map[telemetry.FieldID][]int16),
|
||||
bufPool: sync.Pool{
|
||||
New: func() any {
|
||||
b := make([]byte, 0, telemetry.MaxFields*8)
|
||||
return &b
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (d *CDashDisplay) SendCommand() {
|
||||
}
|
||||
|
||||
func (d *CDashDisplay) RegisterFieldMapping(fieldID telemetry.FieldID, winID int16) {
|
||||
d.fieldToWindows[fieldID] = append(d.fieldToWindows[fieldID], winID)
|
||||
}
|
||||
|
||||
func (d *CDashDisplay) UnregisterFieldMapping(winID int16) {
|
||||
for fieldID, windows := range d.fieldToWindows {
|
||||
updated := windows[:0]
|
||||
for _, w := range windows {
|
||||
if w != winID {
|
||||
updated = append(updated, w)
|
||||
}
|
||||
|
||||
if len(updated) == 0 {
|
||||
delete(d.fieldToWindows, fieldID)
|
||||
} else {
|
||||
d.fieldToWindows[fieldID] = updated
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (d *CDashDisplay) CreateWindow(win *DesktopUIWindow) (*DesktopUIWindow, error) {
|
||||
bytes, err := helper.StructToBytes(win.UIWindow)
|
||||
if err != nil {
|
||||
@@ -146,6 +177,9 @@ func (d *CDashDisplay) CreateWindow(win *DesktopUIWindow) (*DesktopUIWindow, err
|
||||
slog.Info(fmt.Sprintf("Recived ID message: %v", wID))
|
||||
|
||||
d.State.Layout.AddWindow(win)
|
||||
if fieldID, ok := telemetry.GetFieldID(win.UIData.TelemetryField); ok {
|
||||
d.RegisterFieldMapping(fieldID, win.UIData.IDX)
|
||||
}
|
||||
|
||||
return win, nil
|
||||
}
|
||||
@@ -177,6 +211,8 @@ func (d *CDashDisplay) UpdateWindow(win *DesktopUIWindow) error {
|
||||
// Yeah, same address as suspected
|
||||
// I can't think about it right now. I'll think about that tomorrow
|
||||
|
||||
// TODO: need to update the field mappings here!
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -199,7 +235,8 @@ func (d *CDashDisplay) DestroyWindow(wID int16) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// NODE: add this
|
||||
// NOTE: add this
|
||||
d.UnregisterFieldMapping(wID)
|
||||
d.State.Layout.RemoveWindow(wID)
|
||||
|
||||
return nil
|
||||
@@ -357,7 +394,7 @@ func (d *CDashDisplay) UnloadLayout() error {
|
||||
}
|
||||
|
||||
func (d *CDashDisplay) SendData(data *telemetry.TelemetryData) {
|
||||
packet := data.Pack()
|
||||
packet := d.encodePacket(data)
|
||||
|
||||
bytes, err := helper.StructToBytes(packet)
|
||||
if err != nil {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
package cdashdisplay
|
||||
|
||||
import (
|
||||
"math"
|
||||
|
||||
"esdi/telemetry"
|
||||
)
|
||||
|
||||
// In this file we will place all structs that are 1:1 representation of the
|
||||
// types in the device transport layer ->
|
||||
|
||||
@@ -65,6 +71,71 @@ type UIWindowUpdatePacket struct {
|
||||
Window UIWindow
|
||||
}
|
||||
|
||||
// func getUIWindowDTO(w *DesktopWindowData) *UIWindow {
|
||||
//
|
||||
// }
|
||||
// TODO: this is here because this is the only device I use like this
|
||||
// once I add another serial device I will move this somewhere else that can
|
||||
// be reused by all devices but still is decoupled from the telemetry package
|
||||
func (cds *CDashDisplay) encodePacket(td *telemetry.TelemetryData) []byte {
|
||||
bufPtr := cds.bufPool.Get().(*[]byte)
|
||||
buf := (*bufPtr)[:0]
|
||||
|
||||
for fieldID, windowIDs := range cds.fieldToWindows {
|
||||
if int(fieldID) >= len(td.Values) || len(windowIDs) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
tf := &td.Values[fieldID]
|
||||
|
||||
for _, winID := range windowIDs {
|
||||
buf = packField(winID, tf, buf)
|
||||
}
|
||||
}
|
||||
|
||||
// We have to copy here because we have to return the buffer
|
||||
result := make([]byte, len(buf))
|
||||
copy(result, buf)
|
||||
|
||||
cds.bufPool.Put(&buf)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// Pack will pack this current TelemetryField into bytes to send over the wire
|
||||
// Format:
|
||||
// 0x00 - Field ID
|
||||
// 0x00 |
|
||||
// 0x01 - DataType
|
||||
// 0x02 - if its a (u)int8
|
||||
// or
|
||||
// 0x02 - if its a (u)int16 - first byte
|
||||
// 0x02 - if its a (u)int16 - second byte
|
||||
// or
|
||||
// 0x02 - str len max is 255 chars
|
||||
// [0x02] - str
|
||||
func packField(winID int16, tf *telemetry.TelemetryField, dest []byte) []byte {
|
||||
// NOTE: maybe we can have a pool of these so we don't have to create them here
|
||||
// or whatever
|
||||
dest = append(dest, uint8(winID), uint8(winID>>8))
|
||||
dest = append(dest, uint8(tf.Type))
|
||||
|
||||
switch tf.Type {
|
||||
case telemetry.DataTypeINT8, telemetry.DataTypeUINT8, telemetry.DataTypeCHAR:
|
||||
dest = append(dest, uint8(tf.Raw))
|
||||
case telemetry.DataTypeINT16, telemetry.DataTypeUINT16:
|
||||
dest = append(dest, uint8(tf.Raw), uint8(tf.Raw>>8))
|
||||
case telemetry.DataTypeINT32, telemetry.DataTypeUINT32:
|
||||
dest = append(dest, uint8(tf.Raw), uint8(tf.Raw>>8), uint8(tf.Raw>>16), uint8(tf.Raw>>24))
|
||||
case telemetry.DataTypeINT64, telemetry.DataTypeUINT64:
|
||||
dest = append(
|
||||
dest, uint8(tf.Raw), uint8(tf.Raw>>8), uint8(tf.Raw>>16),
|
||||
uint8(tf.Raw>>24), uint8(tf.Raw>>32), uint8(tf.Raw>>40), uint8(tf.Raw>>48),
|
||||
uint8(tf.Raw>>56),
|
||||
)
|
||||
case telemetry.DataTypeSTRING:
|
||||
l := min(len(tf.Str), math.MaxUint8)
|
||||
|
||||
dest = append(dest, uint8(l))
|
||||
dest = append(dest, tf.Str[:l]...)
|
||||
}
|
||||
|
||||
return dest
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user