Skip to content

Commit

Permalink
add another basic commands
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan Klaban committed May 24, 2024
1 parent 56565cc commit d2bd240
Show file tree
Hide file tree
Showing 11 changed files with 599 additions and 44 deletions.
15 changes: 0 additions & 15 deletions dlmsal/cast.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,6 @@ func Cast(trg interface{}, data DlmsData) error {
return recast(reflect.Indirect(r), &data)
}

type NumberType byte

const (
SignedInt NumberType = 0
UnsignedInt NumberType = 1
Real NumberType = 2
)

type Number struct {
Type NumberType
SignedInt int64
UnsignedInt uint64
Real float64
}

func recast(trg reflect.Value, data *DlmsData) error {
e := trg.Kind()
_, istime := trg.Interface().(time.Time)
Expand Down
3 changes: 3 additions & 0 deletions dlmsal/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,9 @@ func EncodeData(d DlmsData) ([]byte, error) {
}

func encodeData(out *bytes.Buffer, d *DlmsData) error {
if d == nil {
return fmt.Errorf("nil data") // no panic here
}
out.WriteByte(byte(d.Tag))
return encodeDatanoTag(out, d)
}
Expand Down
2 changes: 2 additions & 0 deletions dlmsal/dlmsal.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ type DlmsClient interface {
GetStream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error)
Read(items []DlmsSNRequestItem) ([]DlmsData, error)
ReadStream(item DlmsSNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error) // only for big single item queries
Write(items []DlmsSNRequestItem) ([]AccessResultTag, error)
Action(item DlmsLNRequestItem) (*DlmsData, error)
Set(items []DlmsLNRequestItem) ([]AccessResultTag, error)
LNAuthentication(checkresp bool) error
}

Expand Down
25 changes: 25 additions & 0 deletions dlmsal/dlmsexception.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package dlmsal

import (
"fmt"
"io"
)

func decodeException(src io.Reader, tmp *tmpbuffer) (e DlmsData, err error) {
var n int
n, err = io.ReadFull(src, tmp[:2])
switch n {
case 0:
e = NewDlmsDataError(DlmsError{Result: TagAccOtherReason})
case 1:
e = NewDlmsDataError(DlmsError{Result: TagAccOtherReason}) // not decoding state-error
case 2:
e = NewDlmsDataError(DlmsError{Result: TagAccOtherReason}) // not decoding service error
default:
err = fmt.Errorf("programatic error, unexpected read bytes count")
}
if err == io.EOF || err == io.ErrUnexpectedEOF {
err = nil
}
return
}
8 changes: 6 additions & 2 deletions dlmsal/dlmslnaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ func (ln *dlmsalaction) actiondata(tag CosemTag) (data *DlmsData, err error) {
case TagActionResponse:
case TagExceptionResponse: // no lower layer readout
ln.state = 100
d := NewDlmsDataError(DlmsError{Result: TagAccOtherReason})
return &d, nil // dont decode exception pdu
d, err := decodeException(ln.transport, &master.tmpbuffer)
return &d, err // dont decode exception pdu
default:
return data, fmt.Errorf("unexpected tag: %02x", tag)
}
Expand Down Expand Up @@ -221,6 +221,10 @@ func (ln *dlmsalaction) Read(p []byte) (n int, err error) { // this will go to d

// action part, only single action is supported, not list of actions, at least not yet, fuck support everything is a bit pointless
func (d *dlmsal) Action(item DlmsLNRequestItem) (data *DlmsData, err error) { // todo blocking support in case of really big action
if !d.isopen {
return nil, base.ErrNotOpened
}

ln := &dlmsalaction{master: d, state: 0, blockexp: 0}
return ln.action(item)
}
28 changes: 25 additions & 3 deletions dlmsal/dlmslnget.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,12 @@ func (ln *dlmsalget) getstreamdata(tag CosemTag, inmem bool) (s DlmsDataStream,
switch tag {
case TagGetResponse:
case TagExceptionResponse: // no lower layer readout
return nil, &DlmsError{Result: TagAccOtherReason}, nil // dont decode exception pdu, maybe todo, should be 2 bytes
d, err := decodeException(ln.transport, &master.tmpbuffer)
if err != nil {
return nil, nil, err
}
ex := d.Value.(DlmsError)
return nil, &ex, nil // dont decode exception pdu, maybe todo, should be 2 bytes
default:
return nil, nil, fmt.Errorf("unexpected tag: %02x", tag)
}
Expand Down Expand Up @@ -182,11 +187,12 @@ func (ln *dlmsalget) getnextdata(tag CosemTag, i int) (cont bool, err error) {
switch tag {
case TagGetResponse:
case TagExceptionResponse: // no lower layer readout
d, err := decodeException(ln.transport, &master.tmpbuffer)
for i := 0; i < len(ln.data); i++ {
ln.data[i] = NewDlmsDataError(DlmsError{Result: TagAccOtherReason}) // dont decode exception pdu
ln.data[i] = d
}
ln.state = 100
return true, nil
return true, err
default:
return false, fmt.Errorf("unexpected tag: %02x", tag)
}
Expand Down Expand Up @@ -261,6 +267,14 @@ func (ln *dlmsalget) getnextdata(tag CosemTag, i int) (cont bool, err error) {
if len(ln.data) == 1 {
ln.data[i], _, err = decodeDataTag(ln, &master.tmpbuffer)
} else { // with list, so read first byte to decide if there is an error and result byte or decode data
var l uint
l, _, err = decodelength(ln, &master.tmpbuffer)
if err != nil {
return false, err
}
if l != uint(len(ln.data)) {
return false, fmt.Errorf("different amount of data received")
}
err = ln.decodedata(i)
}
return false, err
Expand Down Expand Up @@ -384,11 +398,19 @@ func (ln *dlmsalget) Read(p []byte) (n int, err error) { // this will go to data
}

func (d *dlmsal) Get(items []DlmsLNRequestItem) ([]DlmsData, error) {
if !d.isopen {
return nil, base.ErrNotOpened
}

ln := &dlmsalget{master: d, state: 0, blockexp: 0}
return ln.get(items)
}

func (d *dlmsal) GetStream(item DlmsLNRequestItem, inmem bool) (DlmsDataStream, *DlmsError, error) {
if !d.isopen {
return nil, nil, base.ErrNotOpened
}

ln := &dlmsalget{master: d, state: 0, blockexp: 0}
return ln.getstream(item, inmem)
}
Loading

0 comments on commit d2bd240

Please sign in to comment.