Better sdk #1
@@ -3,11 +3,9 @@ package bngsdk
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"math"
|
||||
"time"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
@@ -42,12 +40,11 @@ type Options struct {
|
||||
}
|
||||
|
||||
type BeamNGSDK struct {
|
||||
Opts Options
|
||||
reader BngImporter
|
||||
writer BngExporter
|
||||
Data Outgauge
|
||||
buffer []byte
|
||||
receiver *Receiver
|
||||
Opts Options
|
||||
reader BngImporter
|
||||
writer BngExporter
|
||||
Data Outgauge
|
||||
buffer []byte
|
||||
}
|
||||
|
||||
func NewBngSDK(opts Options) (*BeamNGSDK, error) {
|
||||
@@ -76,6 +73,20 @@ func NewBngSDK(opts Options) (*BeamNGSDK, error) {
|
||||
return &sdk, nil
|
||||
}
|
||||
|
||||
func (sdk *BeamNGSDK) Close() error {
|
||||
sdk.buffer = nil
|
||||
|
||||
if sdk.writer != nil {
|
||||
sdk.writer.Close()
|
||||
}
|
||||
|
||||
if sdk.reader != nil {
|
||||
sdk.reader.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sdk *BeamNGSDK) openReader() error {
|
||||
switch sdk.Opts.SourceType {
|
||||
case BinaryFile:
|
||||
@@ -209,59 +220,6 @@ func (sdk *BeamNGSDK) parseData(buffer []byte) error {
|
||||
return ParseData(&sdk.Data, buffer)
|
||||
}
|
||||
|
||||
// ReadData will read new data from the UDP server
|
||||
func (sdk *BeamNGSDK) ReadData(timeout time.Duration) error {
|
||||
buf := make([]byte, 2048)
|
||||
nBytes := sdk.receiver.GetLatest(buf)
|
||||
if nBytes < 0 {
|
||||
return fmt.Errorf("no new data")
|
||||
}
|
||||
|
||||
// Read the binary data into the struct
|
||||
err := sdk.parseData(buf)
|
||||
if err != nil {
|
||||
fmt.Println("Error decoding UDP packet:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
// this means there's new data
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sdk *BeamNGSDK) GetBuffer() []byte {
|
||||
buf := make([]byte, 2048)
|
||||
sdk.receiver.GetLatest(buf)
|
||||
return buf
|
||||
}
|
||||
|
||||
func (sdk *BeamNGSDK) GetBufferPtr() []byte {
|
||||
return sdk.receiver.GetBufferPtr()
|
||||
}
|
||||
|
||||
func (sdk *BeamNGSDK) Close() {
|
||||
if sdk.receiver != nil {
|
||||
sdk.receiver.Close()
|
||||
}
|
||||
}
|
||||
|
||||
// Init initializes a BeamNG SDK struct
|
||||
// NOTE: Change this to output a *BeamNGSDK
|
||||
// func Init(ip string, port int) (BeamNGSDK, error) {
|
||||
// var err error
|
||||
// sdk := BeamNGSDK{}
|
||||
//
|
||||
// // Create the connection to the OutGauge server
|
||||
// sdk.Conn, sdk.Addr, err = createUDPConnection(ip, port, int(unsafe.Sizeof(sdk.Buffer)))
|
||||
// if err != nil {
|
||||
// return BeamNGSDK{}, err
|
||||
// }
|
||||
//
|
||||
// // Initiate the data variables
|
||||
// sdk.Buffer = make([]byte, 1024)
|
||||
//
|
||||
// return sdk, nil
|
||||
// }
|
||||
|
||||
// SDK utilities
|
||||
|
||||
// ShowLights - functions to check if a given dash light is on [START]
|
||||
|
||||
@@ -1,19 +1,13 @@
|
||||
package bngsdk
|
||||
|
||||
import "os"
|
||||
|
||||
type BngImporter interface {
|
||||
Reset() error
|
||||
Next([]byte) (int, error)
|
||||
Close() error
|
||||
}
|
||||
|
||||
func NewBinaryImporter(file string) (BngImporter, error) {
|
||||
bin, err := os.Open(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return OgBinReader(bin), nil
|
||||
return NewOgBinReader(file), nil
|
||||
}
|
||||
|
||||
func NewSocketImporter(address string, port int) (BngImporter, error) {
|
||||
|
||||
+17
-3
@@ -2,23 +2,37 @@ package bngsdk
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type GobReader struct {
|
||||
TotalRead int64
|
||||
File io.ReadSeeker
|
||||
File *os.File
|
||||
Buf []byte
|
||||
}
|
||||
|
||||
func OgBinReader(r io.ReadSeeker) *GobReader {
|
||||
func NewOgBinReader(fp string) *GobReader {
|
||||
bin, err := os.Open(fp)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &GobReader{
|
||||
TotalRead: 0,
|
||||
File: r,
|
||||
File: bin,
|
||||
Buf: make([]byte, unsafe.Sizeof(Outgauge{})),
|
||||
}
|
||||
}
|
||||
|
||||
func (g *GobReader) Close() error {
|
||||
if g.File != nil {
|
||||
return g.File.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *GobReader) Reset() error {
|
||||
_, err := g.File.Seek(0, io.SeekStart)
|
||||
if err != nil {
|
||||
|
||||
@@ -20,6 +20,14 @@ func NewOgUDPReader(ip string, port int) (*OgUDPReader, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (ogr *OgUDPReader) Close() error {
|
||||
if ogr.udpConnection != nil {
|
||||
return ogr.udpConnection.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ogr *OgUDPReader) Reset() error {
|
||||
// NOTE: what to implement here?
|
||||
return nil
|
||||
|
||||
@@ -2,6 +2,7 @@ package bngsdk
|
||||
|
||||
type BngExporter interface {
|
||||
Write([]byte) (int, error)
|
||||
Close() error
|
||||
}
|
||||
|
||||
func NewSocketExporter(address string, port int) (BngExporter, error) {
|
||||
|
||||
@@ -20,6 +20,14 @@ func NewOgBinWriter(path string) (*OgBinWriter, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (ogw *OgBinWriter) Close() error {
|
||||
if ogw.file != nil {
|
||||
return ogw.file.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ogw *OgBinWriter) Write(data []byte) (int, error) {
|
||||
err := binary.Write(ogw.file, binary.LittleEndian, data)
|
||||
if err != nil {
|
||||
|
||||
@@ -15,6 +15,14 @@ func NewSocketWriter(ip string, port int) (*SocketWriter, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (sw *SocketWriter) Close() error {
|
||||
if sw.udpConnection != nil {
|
||||
return sw.udpConnection.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sw *SocketWriter) Write(data []byte) (int, error) {
|
||||
// slog.Debug("Writing", "data", data)
|
||||
return sw.udpConnection.Write(data)
|
||||
|
||||
Reference in New Issue
Block a user