@@ -10,8 +10,11 @@ import (
10
10
"os/exec"
11
11
"path/filepath"
12
12
"reflect"
13
+ "strconv"
14
+ "time"
13
15
14
16
"github.com/pion/webrtc/v4"
17
+ "go.bug.st/serial"
15
18
)
16
19
17
20
type JSONRPCRequest struct {
@@ -569,7 +572,172 @@ func rpcResetConfig() error {
569
572
return nil
570
573
}
571
574
572
- // TODO: replace this crap with code generator
575
+ type DCPowerState struct {
576
+ IsOn bool `json:"isOn"`
577
+ Voltage float64 `json:"voltage"`
578
+ Current float64 `json:"current"`
579
+ Power float64 `json:"power"`
580
+ }
581
+
582
+ func rpcGetDCPowerState () (DCPowerState , error ) {
583
+ return dcState , nil
584
+ }
585
+
586
+ func rpcSetDCPowerState (enabled bool ) error {
587
+ log .Printf ("[jsonrpc.go:rpcSetDCPowerState] Setting DC power state to: %v" , enabled )
588
+ err := setDCPowerState (enabled )
589
+ if err != nil {
590
+ return fmt .Errorf ("failed to set DC power state: %w" , err )
591
+ }
592
+ return nil
593
+ }
594
+
595
+ func rpcGetActiveExtension () (string , error ) {
596
+ return config .ActiveExtension , nil
597
+ }
598
+
599
+ func rpcSetActiveExtension (extensionId string ) error {
600
+ if config .ActiveExtension == extensionId {
601
+ return nil
602
+ }
603
+ if config .ActiveExtension == "atx-power" {
604
+ unmountATXControl ()
605
+ } else if config .ActiveExtension == "dc-power" {
606
+ unmountDCControl ()
607
+ }
608
+ config .ActiveExtension = extensionId
609
+ if err := SaveConfig (); err != nil {
610
+ return fmt .Errorf ("failed to save config: %w" , err )
611
+ }
612
+ if extensionId == "atx-power" {
613
+ mountATXControl ()
614
+ } else if extensionId == "dc-power" {
615
+ mountDCControl ()
616
+ }
617
+ return nil
618
+ }
619
+
620
+ func rpcSetATXPowerAction (action string ) error {
621
+ logger .Debugf ("[jsonrpc.go:rpcSetATXPowerAction] Executing ATX power action: %s" , action )
622
+ switch action {
623
+ case "power-short" :
624
+ logger .Debug ("[jsonrpc.go:rpcSetATXPowerAction] Simulating short power button press" )
625
+ return pressATXPowerButton (200 * time .Millisecond )
626
+ case "power-long" :
627
+ logger .Debug ("[jsonrpc.go:rpcSetATXPowerAction] Simulating long power button press" )
628
+ return pressATXPowerButton (5 * time .Second )
629
+ case "reset" :
630
+ logger .Debug ("[jsonrpc.go:rpcSetATXPowerAction] Simulating reset button press" )
631
+ return pressATXResetButton (200 * time .Millisecond )
632
+ default :
633
+ return fmt .Errorf ("invalid action: %s" , action )
634
+ }
635
+ }
636
+
637
+ type ATXState struct {
638
+ Power bool `json:"power"`
639
+ HDD bool `json:"hdd"`
640
+ }
641
+
642
+ func rpcGetATXState () (ATXState , error ) {
643
+ state := ATXState {
644
+ Power : ledPWRState ,
645
+ HDD : ledHDDState ,
646
+ }
647
+ return state , nil
648
+ }
649
+
650
+ type SerialSettings struct {
651
+ BaudRate string `json:"baudRate"`
652
+ DataBits string `json:"dataBits"`
653
+ StopBits string `json:"stopBits"`
654
+ Parity string `json:"parity"`
655
+ }
656
+
657
+ func rpcGetSerialSettings () (SerialSettings , error ) {
658
+ settings := SerialSettings {
659
+ BaudRate : strconv .Itoa (serialPortMode .BaudRate ),
660
+ DataBits : strconv .Itoa (serialPortMode .DataBits ),
661
+ StopBits : "1" ,
662
+ Parity : "none" ,
663
+ }
664
+
665
+ switch serialPortMode .StopBits {
666
+ case serial .OneStopBit :
667
+ settings .StopBits = "1"
668
+ case serial .OnePointFiveStopBits :
669
+ settings .StopBits = "1.5"
670
+ case serial .TwoStopBits :
671
+ settings .StopBits = "2"
672
+ }
673
+
674
+ switch serialPortMode .Parity {
675
+ case serial .NoParity :
676
+ settings .Parity = "none"
677
+ case serial .OddParity :
678
+ settings .Parity = "odd"
679
+ case serial .EvenParity :
680
+ settings .Parity = "even"
681
+ case serial .MarkParity :
682
+ settings .Parity = "mark"
683
+ case serial .SpaceParity :
684
+ settings .Parity = "space"
685
+ }
686
+
687
+ return settings , nil
688
+ }
689
+
690
+ var serialPortMode = defaultMode
691
+
692
+ func rpcSetSerialSettings (settings SerialSettings ) error {
693
+ baudRate , err := strconv .Atoi (settings .BaudRate )
694
+ if err != nil {
695
+ return fmt .Errorf ("invalid baud rate: %v" , err )
696
+ }
697
+ dataBits , err := strconv .Atoi (settings .DataBits )
698
+ if err != nil {
699
+ return fmt .Errorf ("invalid data bits: %v" , err )
700
+ }
701
+
702
+ var stopBits serial.StopBits
703
+ switch settings .StopBits {
704
+ case "1" :
705
+ stopBits = serial .OneStopBit
706
+ case "1.5" :
707
+ stopBits = serial .OnePointFiveStopBits
708
+ case "2" :
709
+ stopBits = serial .TwoStopBits
710
+ default :
711
+ return fmt .Errorf ("invalid stop bits: %s" , settings .StopBits )
712
+ }
713
+
714
+ var parity serial.Parity
715
+ switch settings .Parity {
716
+ case "none" :
717
+ parity = serial .NoParity
718
+ case "odd" :
719
+ parity = serial .OddParity
720
+ case "even" :
721
+ parity = serial .EvenParity
722
+ case "mark" :
723
+ parity = serial .MarkParity
724
+ case "space" :
725
+ parity = serial .SpaceParity
726
+ default :
727
+ return fmt .Errorf ("invalid parity: %s" , settings .Parity )
728
+ }
729
+ serialPortMode = & serial.Mode {
730
+ BaudRate : baudRate ,
731
+ DataBits : dataBits ,
732
+ StopBits : stopBits ,
733
+ Parity : parity ,
734
+ }
735
+
736
+ port .SetMode (serialPortMode )
737
+
738
+ return nil
739
+ }
740
+
573
741
var rpcHandlers = map [string ]RPCHandler {
574
742
"ping" : {Func : rpcPing },
575
743
"getDeviceID" : {Func : rpcGetDeviceID },
@@ -618,4 +786,12 @@ var rpcHandlers = map[string]RPCHandler{
618
786
"resetConfig" : {Func : rpcResetConfig },
619
787
"setBacklightSettings" : {Func : rpcSetBacklightSettings , Params : []string {"params" }},
620
788
"getBacklightSettings" : {Func : rpcGetBacklightSettings },
789
+ "getDCPowerState" : {Func : rpcGetDCPowerState },
790
+ "setDCPowerState" : {Func : rpcSetDCPowerState , Params : []string {"enabled" }},
791
+ "getActiveExtension" : {Func : rpcGetActiveExtension },
792
+ "setActiveExtension" : {Func : rpcSetActiveExtension , Params : []string {"extensionId" }},
793
+ "getATXState" : {Func : rpcGetATXState },
794
+ "setATXPowerAction" : {Func : rpcSetATXPowerAction , Params : []string {"action" }},
795
+ "getSerialSettings" : {Func : rpcGetSerialSettings },
796
+ "setSerialSettings" : {Func : rpcSetSerialSettings , Params : []string {"settings" }},
621
797
}
0 commit comments