EVSE to EV, refactor #1
@@ -1,61 +1,20 @@
|
||||
//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
|
||||
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
type CanFrame struct {
|
||||
canid uint32
|
||||
payload []uint8
|
||||
date string
|
||||
}
|
||||
|
||||
// (2022-07-08 16:54:15.587099) can0 100 [8] 00 00 00 00 00 00 64 00
|
||||
const expr = "\\((.*)\\)\\s+can\\d+\\s+(\\d+)\\s+\\[\\d\\]\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)"
|
||||
const length = 11
|
||||
|
||||
var pattern = regexp.MustCompile(expr)
|
||||
|
||||
func FromString(text *string) *CanFrame {
|
||||
submatch := pattern.FindStringSubmatch(*text)
|
||||
if len(submatch) == length {
|
||||
canid, err := strconv.ParseUint(submatch[2], 16, 0)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
payload := make([]uint8, 8)
|
||||
for idx, octet := range submatch[3:] {
|
||||
val, err := strconv.ParseUint(octet, 16, 0)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
continue
|
||||
}
|
||||
|
||||
payload[idx] = uint8(val)
|
||||
}
|
||||
|
||||
return &CanFrame{
|
||||
date: submatch[1],
|
||||
canid: uint32(canid),
|
||||
payload: payload,
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// New returns a new CAN bus socket.
|
||||
// NewCan New returns a new CAN bus socket.
|
||||
func NewCan() (*Socket, error) {
|
||||
fd, err := unix.Socket(unix.AF_CAN, unix.SOCK_RAW, unix.CAN_RAW)
|
||||
if err != nil {
|
||||
@@ -142,6 +101,8 @@ func StartCan(canbus string) (<-chan *CanFrame, error) {
|
||||
{Id: CAN_ID_100, Mask: 0xFFF},
|
||||
{Id: CAN_ID_101, Mask: 0xFFF},
|
||||
{Id: CAN_ID_102, Mask: 0xFFF},
|
||||
{Id: CAN_ID_108, Mask: 0xFFF},
|
||||
{Id: CAN_ID_109, Mask: 0xFFF},
|
||||
}
|
||||
|
||||
if socket, err := NewCan(); err == nil {
|
||||
@@ -156,8 +117,6 @@ func StartCan(canbus string) (<-chan *CanFrame, error) {
|
||||
|
||||
for { //TODO implement stop
|
||||
if id, data, serr := socket.Recv(); serr == nil {
|
||||
//log.Println("debug: data", data)
|
||||
|
||||
canevents <- &CanFrame{
|
||||
date: time.Now().String(),
|
||||
canid: id,
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
//go:build windows
|
||||
// +build windows
|
||||
|
||||
package main
|
||||
|
||||
func StartCan(canbus string) (<-chan *CanFrame, error) {
|
||||
return nil, &NotImplError{}
|
||||
}
|
||||
|
||||
type NotImplError struct {
|
||||
}
|
||||
|
||||
func (e *NotImplError) Error() string {
|
||||
return "Not implemented for windows platform"
|
||||
}
|
||||
+1
-29
@@ -1,7 +1,6 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
@@ -20,7 +19,7 @@ func main() {
|
||||
switch {
|
||||
case len(*filename) > 0:
|
||||
fmt.Printf("Open file %v\n", *filename)
|
||||
frames = readfile(filename)
|
||||
frames = Readfile(filename)
|
||||
case len(*canbus) > 0:
|
||||
fmt.Printf("Open device %v\n", canbus)
|
||||
var err error
|
||||
@@ -58,30 +57,3 @@ func main() {
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
func readfile(filename *string) <-chan *CanFrame {
|
||||
c := make(chan *CanFrame)
|
||||
|
||||
go func() {
|
||||
defer close(c)
|
||||
|
||||
file, err := os.Open(*filename)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
text := scanner.Text()
|
||||
c <- FromString(&text)
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}()
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
-168
@@ -4,64 +4,6 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
const (
|
||||
CAN_ID_100 = 0x100
|
||||
CAN_ID_101 = 0x101
|
||||
CAN_ID_102 = 0x102
|
||||
CAN_ID_108 = 0x108
|
||||
CAN_ID_109 = 0x109
|
||||
|
||||
DISABLED VehicleChargingEnabled = iota
|
||||
ENABLED
|
||||
|
||||
PARKING ShiftLeverPosition = iota
|
||||
OTHER
|
||||
|
||||
NORMAL SystemFault = iota
|
||||
FAULT
|
||||
|
||||
CONTACTOR_CLOSED ContactorVehicleStatus = iota
|
||||
CONTACTOR_OPEN
|
||||
|
||||
NO_REQUEST StopRequest = iota
|
||||
STOP_REQUEST
|
||||
|
||||
VEHICLE_WELDING_DETECTION_SUPPORTED SuppVehicleWeldingDetection = iota
|
||||
VEHICLE_WELDING_DETECTION_NOT_SUPPORTED
|
||||
|
||||
STANDBY StationState = iota
|
||||
CHARGING
|
||||
|
||||
CONNECTOR_LOCKED ConnectorLock = iota
|
||||
CONNECTOR_UNLOCKED
|
||||
|
||||
BATTERY_COMPATIBLE BatteryCompatible = iota
|
||||
BATTERY_INCOMPATIBLE
|
||||
|
||||
OPERATING StopControl = iota
|
||||
SHUTDOWN_STOP
|
||||
)
|
||||
|
||||
type VehicleChargingEnabled uint8
|
||||
|
||||
type ShiftLeverPosition uint8
|
||||
|
||||
type SystemFault uint8
|
||||
|
||||
type ContactorVehicleStatus uint8
|
||||
|
||||
type StopRequest uint8
|
||||
|
||||
type SuppVehicleWeldingDetection uint8
|
||||
|
||||
type StationState uint8
|
||||
|
||||
type ConnectorLock uint8
|
||||
|
||||
type BatteryCompatible uint8
|
||||
|
||||
type StopControl uint8
|
||||
|
||||
type ChademoEvent interface {
|
||||
// GetValue Return processed/calculated value and timestamp string
|
||||
GetValue() (interface{}, *string)
|
||||
@@ -463,113 +405,3 @@ func (c ChargingSystemMalfunction) GetValue() (interface{}, *string) {
|
||||
func (c ChargerStopControl) GetValue() (interface{}, *string) {
|
||||
return getChargerStopControl(&c.payload), &c.date
|
||||
}
|
||||
|
||||
func (v VehicleChargingEnabled) String() string {
|
||||
switch v {
|
||||
case DISABLED:
|
||||
return "disabled"
|
||||
case ENABLED:
|
||||
return "enabled"
|
||||
default:
|
||||
panic("VehicleChargingEnabled not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s ShiftLeverPosition) String() string {
|
||||
switch s {
|
||||
case PARKING:
|
||||
return "parking"
|
||||
case OTHER:
|
||||
return "other"
|
||||
default:
|
||||
panic("ShiftLeverPosition not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s SystemFault) String() string {
|
||||
switch s {
|
||||
case NORMAL:
|
||||
return "normal"
|
||||
case FAULT:
|
||||
return "fault"
|
||||
default:
|
||||
panic("SystemFault not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (c ContactorVehicleStatus) String() string {
|
||||
switch c {
|
||||
case CONTACTOR_CLOSED:
|
||||
return "contactor closed"
|
||||
case CONTACTOR_OPEN:
|
||||
return "contactor open"
|
||||
default:
|
||||
panic("ContactorVehicleStatus not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s StopRequest) String() string {
|
||||
switch s {
|
||||
case NO_REQUEST:
|
||||
return "no request"
|
||||
case STOP_REQUEST:
|
||||
return "stop request"
|
||||
default:
|
||||
panic("StopRequest not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s SuppVehicleWeldingDetection) String() string {
|
||||
switch s {
|
||||
case VEHICLE_WELDING_DETECTION_NOT_SUPPORTED:
|
||||
return "not supported"
|
||||
case VEHICLE_WELDING_DETECTION_SUPPORTED:
|
||||
return "supported"
|
||||
default:
|
||||
panic("SuppVehicleWeldingDetection not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s StationState) String() string {
|
||||
switch s {
|
||||
case CHARGING:
|
||||
return "charging"
|
||||
case STANDBY:
|
||||
return "standby"
|
||||
default:
|
||||
panic("StationState not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (c ConnectorLock) String() string {
|
||||
switch c {
|
||||
case CONNECTOR_LOCKED:
|
||||
return "locked"
|
||||
case CONNECTOR_UNLOCKED:
|
||||
return "unlocked"
|
||||
default:
|
||||
panic("ConnectorLock not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (b BatteryCompatible) String() string {
|
||||
switch b {
|
||||
case BATTERY_COMPATIBLE:
|
||||
return "compatible"
|
||||
case BATTERY_INCOMPATIBLE:
|
||||
return "incompatible"
|
||||
default:
|
||||
panic("BatteryCompatible not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s StopControl) String() string {
|
||||
switch s {
|
||||
case OPERATING:
|
||||
return "operating"
|
||||
case SHUTDOWN_STOP:
|
||||
return "shutdown or stop charging"
|
||||
default:
|
||||
panic("StopControl not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// (2022-07-08 16:54:15.587099) can0 100 [8] 00 00 00 00 00 00 64 00
|
||||
const expr = "\\((.*)\\)\\s+can\\d+\\s+(\\d+)\\s+\\[\\d\\]\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)"
|
||||
const length = 11
|
||||
|
||||
var pattern = regexp.MustCompile(expr)
|
||||
|
||||
func Readfile(filename *string) <-chan *CanFrame {
|
||||
c := make(chan *CanFrame)
|
||||
|
||||
go func() {
|
||||
defer close(c)
|
||||
|
||||
file, err := os.Open(*filename)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
text := scanner.Text()
|
||||
c <- fromString(&text)
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}()
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
func fromString(text *string) *CanFrame {
|
||||
submatch := pattern.FindStringSubmatch(*text)
|
||||
if len(submatch) == length {
|
||||
canid, err := strconv.ParseUint(submatch[2], 16, 0)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
payload := make([]uint8, 8)
|
||||
for idx, octet := range submatch[3:] {
|
||||
val, err := strconv.ParseUint(octet, 16, 0)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
continue
|
||||
}
|
||||
|
||||
payload[idx] = uint8(val)
|
||||
}
|
||||
|
||||
return &CanFrame{
|
||||
date: submatch[1],
|
||||
canid: uint32(canid),
|
||||
payload: payload,
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -22,7 +22,7 @@ func TestFromString(t *testing.T) {
|
||||
name: "Candump parsing test",
|
||||
args: args{text: &dump},
|
||||
want: &CanFrame{
|
||||
canid: 100,
|
||||
canid: CAN_ID_100,
|
||||
date: "2022-07-08 16:54:15.587099",
|
||||
payload: []uint8{0, 0, 0, 0, 0, 0, 0x64, 0},
|
||||
},
|
||||
@@ -30,8 +30,8 @@ func TestFromString(t *testing.T) {
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := FromString(tt.args.text); !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("FromString() = %v, want %v", got, tt.want)
|
||||
if got := fromString(tt.args.text); !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("fromString() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
package main
|
||||
|
||||
const (
|
||||
CAN_ID_100 = 0x100
|
||||
CAN_ID_101 = 0x101
|
||||
CAN_ID_102 = 0x102
|
||||
CAN_ID_108 = 0x108
|
||||
CAN_ID_109 = 0x109
|
||||
|
||||
DISABLED VehicleChargingEnabled = iota
|
||||
ENABLED
|
||||
|
||||
PARKING ShiftLeverPosition = iota
|
||||
OTHER
|
||||
|
||||
NORMAL SystemFault = iota
|
||||
FAULT
|
||||
|
||||
CONTACTOR_CLOSED ContactorVehicleStatus = iota
|
||||
CONTACTOR_OPEN
|
||||
|
||||
NO_REQUEST StopRequest = iota
|
||||
STOP_REQUEST
|
||||
|
||||
VEHICLE_WELDING_DETECTION_SUPPORTED SuppVehicleWeldingDetection = iota
|
||||
VEHICLE_WELDING_DETECTION_NOT_SUPPORTED
|
||||
|
||||
STANDBY StationState = iota
|
||||
CHARGING
|
||||
|
||||
CONNECTOR_LOCKED ConnectorLock = iota
|
||||
CONNECTOR_UNLOCKED
|
||||
|
||||
BATTERY_COMPATIBLE BatteryCompatible = iota
|
||||
BATTERY_INCOMPATIBLE
|
||||
|
||||
OPERATING StopControl = iota
|
||||
SHUTDOWN_STOP
|
||||
)
|
||||
|
||||
type VehicleChargingEnabled uint8
|
||||
|
||||
type ShiftLeverPosition uint8
|
||||
|
||||
type SystemFault uint8
|
||||
|
||||
type ContactorVehicleStatus uint8
|
||||
|
||||
type StopRequest uint8
|
||||
|
||||
type SuppVehicleWeldingDetection uint8
|
||||
|
||||
type StationState uint8
|
||||
|
||||
type ConnectorLock uint8
|
||||
|
||||
type BatteryCompatible uint8
|
||||
|
||||
type StopControl uint8
|
||||
|
||||
type CanFrame struct {
|
||||
canid uint32
|
||||
payload []uint8
|
||||
date string
|
||||
}
|
||||
|
||||
func (v VehicleChargingEnabled) String() string {
|
||||
switch v {
|
||||
case DISABLED:
|
||||
return "disabled"
|
||||
case ENABLED:
|
||||
return "enabled"
|
||||
default:
|
||||
panic("VehicleChargingEnabled not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s ShiftLeverPosition) String() string {
|
||||
switch s {
|
||||
case PARKING:
|
||||
return "parking"
|
||||
case OTHER:
|
||||
return "other"
|
||||
default:
|
||||
panic("ShiftLeverPosition not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s SystemFault) String() string {
|
||||
switch s {
|
||||
case NORMAL:
|
||||
return "normal"
|
||||
case FAULT:
|
||||
return "fault"
|
||||
default:
|
||||
panic("SystemFault not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (c ContactorVehicleStatus) String() string {
|
||||
switch c {
|
||||
case CONTACTOR_CLOSED:
|
||||
return "contactor closed"
|
||||
case CONTACTOR_OPEN:
|
||||
return "contactor open"
|
||||
default:
|
||||
panic("ContactorVehicleStatus not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s StopRequest) String() string {
|
||||
switch s {
|
||||
case NO_REQUEST:
|
||||
return "no request"
|
||||
case STOP_REQUEST:
|
||||
return "stop request"
|
||||
default:
|
||||
panic("StopRequest not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s SuppVehicleWeldingDetection) String() string {
|
||||
switch s {
|
||||
case VEHICLE_WELDING_DETECTION_NOT_SUPPORTED:
|
||||
return "not supported"
|
||||
case VEHICLE_WELDING_DETECTION_SUPPORTED:
|
||||
return "supported"
|
||||
default:
|
||||
panic("SuppVehicleWeldingDetection not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s StationState) String() string {
|
||||
switch s {
|
||||
case CHARGING:
|
||||
return "charging"
|
||||
case STANDBY:
|
||||
return "standby"
|
||||
default:
|
||||
panic("StationState not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (c ConnectorLock) String() string {
|
||||
switch c {
|
||||
case CONNECTOR_LOCKED:
|
||||
return "locked"
|
||||
case CONNECTOR_UNLOCKED:
|
||||
return "unlocked"
|
||||
default:
|
||||
panic("ConnectorLock not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (b BatteryCompatible) String() string {
|
||||
switch b {
|
||||
case BATTERY_COMPATIBLE:
|
||||
return "compatible"
|
||||
case BATTERY_INCOMPATIBLE:
|
||||
return "incompatible"
|
||||
default:
|
||||
panic("BatteryCompatible not implemented")
|
||||
}
|
||||
}
|
||||
|
||||
func (s StopControl) String() string {
|
||||
switch s {
|
||||
case OPERATING:
|
||||
return "operating"
|
||||
case SHUTDOWN_STOP:
|
||||
return "shutdown or stop charging"
|
||||
default:
|
||||
panic("StopControl not implemented")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user