diff --git a/bngsdk.go b/bngsdk.go index 2c6aed2..a174cbc 100644 --- a/bngsdk.go +++ b/bngsdk.go @@ -47,7 +47,7 @@ type BeamNGSDK struct { func NewBngSDK(opts Options) (*BeamNGSDK, error) { sdk := BeamNGSDK{ Opts: opts, - buffer: make([]byte, outgaugeSize), + buffer: make([]byte, OutgaugeSize), } var err error @@ -184,6 +184,22 @@ func (sdk *BeamNGSDK) Update() (*Outgauge, error) { return &sdk.data, sdk.parseData(sdk.buffer) } +func (sdk *BeamNGSDK) GetTotalRead() int64 { + return sdk.reader.GetTotalRead() +} + +func (sdk *BeamNGSDK) GetTotalWritten() int64 { + return sdk.writer.GetTotalWritten() +} + func (sdk *BeamNGSDK) parseData(buffer []byte) error { return sdk.data.ParseData(buffer) } + +func (sdk *BeamNGSDK) GetSourceSize() int64 { + if sizer, ok := sdk.reader.(Sizer); ok { + return sizer.Size() + } + + return 0 +} diff --git a/outgauge.go b/outgauge.go index 24c737a..ed7c476 100644 --- a/outgauge.go +++ b/outgauge.go @@ -7,7 +7,7 @@ import ( ) var ( - outgaugeSize = binary.Size(Outgauge{}) + OutgaugeSize = int64(binary.Size(Outgauge{})) ErrNotEnoughData = errors.New("buffer len is too short for Outgauge unpacking") ) @@ -64,7 +64,7 @@ type Outgauge struct { } func (og *Outgauge) ParseData(buffer []byte) error { - if len(buffer) < outgaugeSize { + if int64(len(buffer)) < OutgaugeSize { return ErrNotEnoughData } @@ -171,6 +171,11 @@ func (og *Outgauge) ABS() bool { return og.ShowLights&DL_ABS != 0 } +// Spare reports whether spare was flipped +func (og *Outgauge) Spare() bool { + return og.ShowLights&DL_SPARE != 0 +} + // ShowLights - functions to check if a given dash light is on [END] // DashLights - functions to check if a given dash light is provided [START] @@ -231,6 +236,11 @@ func (og *Outgauge) HasABSLight() bool { return og.DashLights&DL_ABS != 0 } +// HasSpare reports whether spare was flipped +func (og *Outgauge) HasSpare() bool { + return og.DashLights&DL_SPARE != 0 +} + // DashLights - functions to check if a given dash light is provided [END] // Flags - functions to check if a given flag is ON [START] diff --git a/reader.go b/reader.go index 0cb7963..e519065 100644 --- a/reader.go +++ b/reader.go @@ -3,6 +3,7 @@ package bngsdk type BngImporter interface { Reset() error Next([]byte) (int, error) + GetTotalRead() int64 Close() error } diff --git a/reader_binary.go b/reader_binary.go index 7ff138e..e8a5b00 100644 --- a/reader_binary.go +++ b/reader_binary.go @@ -6,10 +6,15 @@ import ( "unsafe" ) +type Sizer interface { + Size() int64 +} + type GobReader struct { TotalRead int64 File *os.File Buf []byte + size int64 } func NewOgBinReader(fp string) *GobReader { @@ -18,10 +23,16 @@ func NewOgBinReader(fp string) *GobReader { return nil } + info, err := bin.Stat() + if err != nil { + return nil + } + return &GobReader{ TotalRead: 0, File: bin, Buf: make([]byte, unsafe.Sizeof(Outgauge{})), + size: info.Size(), } } @@ -55,3 +66,11 @@ func (g *GobReader) Next(buffer []byte) (int, error) { return nBytes, nil } + +func (g *GobReader) GetTotalRead() int64 { + return g.TotalRead +} + +func (g *GobReader) Size() int64 { + return g.size +} diff --git a/reader_socket.go b/reader_socket.go index 5b99bb0..f768712 100644 --- a/reader_socket.go +++ b/reader_socket.go @@ -41,9 +41,13 @@ func (ogr *OgUDPReader) Next(buffer []byte) (int, error) { } // Check if enough data was received to fill our struct - if nBytes != outgaugeSize { + if int64(nBytes) != OutgaugeSize { return 0, ErrInvalidOutgaugeData } return nBytes, nil } + +func (ogr *OgUDPReader) GetTotalRead() int64 { + return ogr.udpConnection.GetTotalBytes() +} diff --git a/transport.go b/udp_transport.go similarity index 89% rename from transport.go rename to udp_transport.go index e3e9d1a..657d430 100644 --- a/transport.go +++ b/udp_transport.go @@ -32,6 +32,7 @@ type UDPTransport struct { address *net.UDPAddr connection *net.UDPConn dataChan chan frame + totalBytes int64 // returns total bytes read in case of reader and written in case of writer } func NewUDPReader(ip string, port int) (*UDPTransport, error) { @@ -110,7 +111,11 @@ func (ut *UDPTransport) udpSink() { } func (ut *UDPTransport) Write(data []byte) (int, error) { - return ut.connection.Write(data) + nBytes, err := ut.connection.Write(data) + + ut.totalBytes += int64(nBytes) + + return nBytes, err } func (ut *UDPTransport) Read(buffer []byte) (int, error) { @@ -123,6 +128,8 @@ func (ut *UDPTransport) Read(buffer []byte) (int, error) { nBytes := copy(buffer, latestFrame.Buf[:latestFrame.Len]) packetPool.Put(latestFrame.Buf) + ut.totalBytes += int64(nBytes) + return nBytes, nil } @@ -133,3 +140,7 @@ func (ut *UDPTransport) Close() error { return nil } + +func (ut *UDPTransport) GetTotalBytes() int64 { + return ut.totalBytes +} diff --git a/writer.go b/writer.go index 5d7eaad..640e9a5 100644 --- a/writer.go +++ b/writer.go @@ -2,6 +2,7 @@ package bngsdk type BngExporter interface { Write([]byte) (int, error) + GetTotalWritten() int64 Close() error } diff --git a/writer_binary.go b/writer_binary.go index 0bc16d9..d663a98 100644 --- a/writer_binary.go +++ b/writer_binary.go @@ -6,7 +6,8 @@ import ( ) type OgBinWriter struct { - file *os.File + file *os.File + totalBytes int64 } func NewOgBinWriter(path string) (*OgBinWriter, error) { @@ -34,5 +35,12 @@ func (ogw *OgBinWriter) Write(data []byte) (int, error) { return 0, err } - return len(data), nil + nBytes := len(data) + ogw.totalBytes += int64(nBytes) + + return nBytes, nil +} + +func (ogw *OgBinWriter) GetTotalWritten() int64 { + return ogw.totalBytes } diff --git a/writer_socket.go b/writer_socket.go index 9b347c3..1280d4c 100644 --- a/writer_socket.go +++ b/writer_socket.go @@ -27,3 +27,7 @@ func (sw *SocketWriter) Write(data []byte) (int, error) { // slog.Debug("Writing", "data", data) return sw.udpConnection.Write(data) } + +func (sw *SocketWriter) GetTotalWritten() int64 { + return sw.udpConnection.totalBytes +}