Skip to content

Commit

Permalink
emulator: get-status API function
Browse files Browse the repository at this point in the history
  • Loading branch information
twystd committed Dec 16, 2024
1 parent 0aaf67a commit ff9d7f3
Show file tree
Hide file tree
Showing 15 changed files with 569 additions and 75 deletions.
8 changes: 8 additions & 0 deletions Rev.0/cli/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,11 @@ set-time:
python3 main.py --destination $(ADDRESS) --protocol udp set-time
python3 main.py --destination $(ADDRESS) --protocol tcp set-time

get-status:
python3 main.py get-status
# python3 main.py --destination $(ADDRESS) --protocol udp get-status
# python3 main.py --destination $(ADDRESS) --protocol tcp get-status

tls:
python3 main.py --destination $(TLS) --protocol tls get-controller

70 changes: 70 additions & 0 deletions Rev.0/driver/rpc/ssmp/ssmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,76 @@ func (s SSMP) Get(oid string) (any, error) {
return time.Now().Format("2006-01-02 15:04:05"), nil
}

// ... controller error
if oid == ".1.3.6.1.4.1.65536.2.9" {
return 0x12, nil
}

// ... controller special info
if oid == ".1.3.6.1.4.1.65536.2.10" {
return 0x23, nil
}

// ... door 1 unlocked
if oid == ".1.3.6.1.4.1.65536.3.1.3" {
return true, nil
}

// ... door 1 open
if oid == ".1.3.6.1.4.1.65536.3.1.4" {
return true, nil
}

// ... door 1 button
if oid == ".1.3.6.1.4.1.65536.3.1.5" {
return true, nil
}

// ... door 2 unlocked
if oid == ".1.3.6.1.4.1.65536.3.2.3" {
return true, nil
}

// ... door 2 open
if oid == ".1.3.6.1.4.1.65536.3.2.4" {
return true, nil
}

// ... door 2 button
if oid == ".1.3.6.1.4.1.65536.3.2.5" {
return false, nil
}

// ... door 3 unlocked
if oid == ".1.3.6.1.4.1.65536.3.3.3" {
return true, nil
}

// ... door 3 open
if oid == ".1.3.6.1.4.1.65536.3.3.4" {
return false, nil
}

// ... door 3 button
if oid == ".1.3.6.1.4.1.65536.3.3.5" {
return true, nil
}

// ... door 4 unlocked
if oid == ".1.3.6.1.4.1.65536.3.4.3" {
return false, nil
}

// ... door 4 open
if oid == ".1.3.6.1.4.1.65536.3.4.4" {
return true, nil
}

// ... door 4 button
if oid == ".1.3.6.1.4.1.65536.3.4.5" {
return false, nil
}

return nil, fmt.Errorf("unknown OID %v", oid)
}

Expand Down
30 changes: 28 additions & 2 deletions Rev.0/emulator/go/MIB/MIB.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,32 @@ var OID_CONTROLLER_NETMASK = []uint32{1, 3, 6, 1, 4, 1, 65536, 2, 5}
var OID_CONTROLLER_GATEWAY = []uint32{1, 3, 6, 1, 4, 1, 65536, 2, 6}
var OID_CONTROLLER_MAC = []uint32{1, 3, 6, 1, 4, 1, 65536, 2, 7}
var OID_CONTROLLER_DATETIME = []uint32{1, 3, 6, 1, 4, 1, 65536, 2, 8}
var OID_CONTROLLER_ERROR = []uint32{1, 3, 6, 1, 4, 1, 65536, 2, 9}
var OID_CONTROLLER_SPECIAL_INFO = []uint32{1, 3, 6, 1, 4, 1, 65536, 2, 10}

var OID_EVENTS_LISTENER = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 1}
var OID_EVENTS_INTERVAL = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 2}
var OID_DOORS_1_MODE = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 1, 1}
var OID_DOORS_1_DELAY = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 1, 2}
var OID_DOORS_1_UNLOCKED = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 1, 3}
var OID_DOORS_1_OPEN = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 1, 4}
var OID_DOORS_1_BUTTON = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 1, 5}

var OID_DOORS_2_MODE = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 2, 1}
var OID_DOORS_2_DELAY = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 2, 2}
var OID_DOORS_2_UNLOCKED = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 2, 3}
var OID_DOORS_2_OPEN = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 2, 4}
var OID_DOORS_2_BUTTON = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 2, 5}

var OID_DOORS_3_MODE = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 3, 1}
var OID_DOORS_3_DELAY = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 3, 2}
var OID_DOORS_3_UNLOCKED = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 3, 3}
var OID_DOORS_3_OPEN = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 3, 4}
var OID_DOORS_3_BUTTON = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 3, 5}

var OID_DOORS_4_MODE = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 4, 1}
var OID_DOORS_4_DELAY = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 4, 2}
var OID_DOORS_4_UNLOCKED = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 4, 3}
var OID_DOORS_4_OPEN = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 4, 4}
var OID_DOORS_4_BUTTON = []uint32{1, 3, 6, 1, 4, 1, 65536, 3, 4, 5}

var OID_EVENTS_LISTENER = []uint32{1, 3, 6, 1, 4, 1, 65536, 4, 1}
var OID_EVENTS_INTERVAL = []uint32{1, 3, 6, 1, 4, 1, 65536, 4, 2}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package types
package MIB

import (
"fmt"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package types
package MIB

import (
"fmt"
Expand Down
13 changes: 0 additions & 13 deletions Rev.0/emulator/go/MIB/system.go

This file was deleted.

3 changes: 3 additions & 0 deletions Rev.0/emulator/go/UT0311/UT0311.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ func (ut0311 UT0311) received(request any) (any, error) {
case *messages.SetTimeRequest:
return ut0311.setTime(rq)

case *messages.GetStatusRequest:
return ut0311.getStatus(rq)

default:
warnf("unknown message type (%T)", request)
}
Expand Down
152 changes: 152 additions & 0 deletions Rev.0/emulator/go/UT0311/get-status.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package UT0311

import (
"fmt"

"github.com/uhppoted/uhppote-core/messages"
"github.com/uhppoted/uhppote-core/types"

"emulator/MIB"
)

func (ut0311 *UT0311) getStatus(rq *messages.GetStatusRequest) (any, error) {
if id, err := ut0311.getID(); err != nil {
return nil, err
} else if id == 0 || (rq.SerialNumber != 0 && uint32(rq.SerialNumber) != id) {
return nil, nil
} else {
response := messages.GetStatusResponse{
SerialNumber: types.SerialNumber(id),
RelayState: 0x00,
}

if v, err := ut0311.driver.Get(MIB.OID_CONTROLLER_DATETIME); err != nil {
return nil, err
} else if s, ok := v.(string); !ok {
return nil, fmt.Errorf("invalid controller date/time (%v)", v)
} else if datetime, err := types.ParseDateTime(s); err != nil {
return nil, err
} else {
response.SystemDate = types.SystemDate(datetime)
response.SystemTime = types.SystemTime(datetime)
}

if v, err := ut0311.driver.Get(MIB.OID_CONTROLLER_ERROR); err != nil {
return nil, err
} else if e, ok := v.(int); !ok {
return nil, fmt.Errorf("invalid controller error (%T)", v)
} else {
response.SystemError = uint8(e)
}

if v, err := ut0311.driver.Get(MIB.OID_CONTROLLER_SPECIAL_INFO); err != nil {
return nil, err
} else if e, ok := v.(int); !ok {
return nil, fmt.Errorf("invalid controller special info (%T)", v)
} else {
response.SpecialInfo = uint8(e)
}

// ... door 1
if v, err := ut0311.driver.Get(MIB.OID_DOORS_1_UNLOCKED); err != nil {
return nil, err
} else if unlocked, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 1 unlocked (%T)", v)
} else if unlocked {
response.RelayState |= 0x01
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_1_OPEN); err != nil {
return nil, err
} else if open, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 1 open (%T)", v)
} else {
response.Door1State = open
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_1_BUTTON); err != nil {
return nil, err
} else if pressed, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 1 button (%T)", v)
} else {
response.Door1Button = pressed
}

// ... door 2
if v, err := ut0311.driver.Get(MIB.OID_DOORS_2_UNLOCKED); err != nil {
return nil, err
} else if unlocked, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 2 unlocked (%T)", v)
} else if unlocked {
response.RelayState |= 0x02
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_2_OPEN); err != nil {
return nil, err
} else if open, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 2 open (%T)", v)
} else {
response.Door2State = open
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_2_BUTTON); err != nil {
return nil, err
} else if pressed, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 2 button (%T)", v)
} else {
response.Door2Button = pressed
}

// ... door 3
if v, err := ut0311.driver.Get(MIB.OID_DOORS_3_UNLOCKED); err != nil {
return nil, err
} else if unlocked, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 3 unlocked (%T)", v)
} else if unlocked {
response.RelayState |= 0x04
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_3_OPEN); err != nil {
return nil, err
} else if open, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 3 open (%T)", v)
} else {
response.Door3State = open
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_3_BUTTON); err != nil {
return nil, err
} else if pressed, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 3 button (%T)", v)
} else {
response.Door3Button = pressed
}

// ... door 4
if v, err := ut0311.driver.Get(MIB.OID_DOORS_4_UNLOCKED); err != nil {
return nil, err
} else if unlocked, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 4 unlocked (%T)", v)
} else if unlocked {
response.RelayState |= 0x08
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_4_OPEN); err != nil {
return nil, err
} else if open, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 4 open (%T)", v)
} else {
response.Door4State = open
}

if v, err := ut0311.driver.Get(MIB.OID_DOORS_4_BUTTON); err != nil {
return nil, err
} else if pressed, ok := v.(bool); !ok {
return nil, fmt.Errorf("invalid controller door 4 button (%T)", v)
} else {
response.Door4Button = pressed
}

return response, nil
}
}
21 changes: 10 additions & 11 deletions Rev.0/emulator/go/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"strconv"

"emulator/MIB"
"emulator/MIB/types"
)

type Config struct {
Expand Down Expand Up @@ -81,40 +80,40 @@ func Save(c Config) error {
return nil
}

func Get[T any](c Config, oid types.OID) (T, error) {
func Get[T any](c Config, oid MIB.OID) (T, error) {
var null T

if types.OID.Equal(oid, MIB.OID_CONTROLLER_ADDRESS) {
if MIB.OID.Equal(oid, MIB.OID_CONTROLLER_ADDRESS) {
if v, ok := any(c.Network.IPv4.Address).(T); ok {
return v, nil
}
}

if types.OID.Equal(oid, MIB.OID_CONTROLLER_NETMASK) {
if MIB.OID.Equal(oid, MIB.OID_CONTROLLER_NETMASK) {
if v, ok := any(c.Network.IPv4.Netmask).(T); ok {
return v, nil
}
}

if types.OID.Equal(oid, MIB.OID_CONTROLLER_GATEWAY) {
if MIB.OID.Equal(oid, MIB.OID_CONTROLLER_GATEWAY) {
if v, ok := any(c.Network.IPv4.Gateway).(T); ok {
return v, nil
}
}

if types.OID.Equal(oid, MIB.OID_CONTROLLER_MAC) {
if MIB.OID.Equal(oid, MIB.OID_CONTROLLER_MAC) {
if v, ok := any(c.Network.IPv4.MAC).(T); ok {
return v, nil
}
}

if types.OID.Equal(oid, MIB.OID_EVENTS_LISTENER) {
if MIB.OID.Equal(oid, MIB.OID_EVENTS_LISTENER) {
if v, ok := any(c.Events.Listener).(T); ok {
return v, nil
}
}

if types.OID.Equal(oid, MIB.OID_EVENTS_INTERVAL) {
if MIB.OID.Equal(oid, MIB.OID_EVENTS_INTERVAL) {
if v, ok := any(c.Events.Interval).(T); ok {
return v, nil
}
Expand All @@ -123,8 +122,8 @@ func Get[T any](c Config, oid types.OID) (T, error) {
return null, fmt.Errorf("invalid OID (%v)", oid)
}

func Set(c *Config, oid types.OID, v any) error {
if types.OID.Equal(oid, MIB.OID_EVENTS_LISTENER) {
func Set(c *Config, oid MIB.OID, v any) error {
if MIB.OID.Equal(oid, MIB.OID_EVENTS_LISTENER) {
if addrPort, ok := v.(netip.AddrPort); !ok {
return fmt.Errorf("invalid events listener address:port (%v)", v)
} else {
Expand All @@ -134,7 +133,7 @@ func Set(c *Config, oid types.OID, v any) error {
}
}

if types.OID.Equal(oid, MIB.OID_EVENTS_INTERVAL) {
if MIB.OID.Equal(oid, MIB.OID_EVENTS_INTERVAL) {
if interval, ok := v.(uint8); !ok {
return fmt.Errorf("invalid events listener interval (%v)", v)
} else {
Expand Down
Loading

0 comments on commit ff9d7f3

Please sign in to comment.