Compare commits

...

2 Commits

Author SHA1 Message Date
didinst 349050edb4
109 full impl 3 years ago
didinst 1a47ad1c7f
108, 109 codes partial impl 3 years ago
  1. 2
      can.go
  2. 255
      chademo.go

@ -21,7 +21,7 @@ var pattern = regexp.MustCompile(expr)
func FromString(text *string) *CanFrame {
submatch := pattern.FindStringSubmatch(*text)
if len(submatch) == length {
canid, err := strconv.Atoi(submatch[2])
canid, err := strconv.ParseUint(submatch[2], 16, 0)
if err != nil {
return nil
}

@ -5,9 +5,11 @@ import (
)
const (
CAN_ID_100 = 100
CAN_ID_101 = 101
CAN_ID_102 = 102
CAN_ID_100 = 0x100
CAN_ID_101 = 0x101
CAN_ID_102 = 0x102
CAN_ID_108 = 0x108
CAN_ID_109 = 0x109
DISABLED VehicleChargingEnabled = iota
ENABLED
@ -23,6 +25,21 @@ const (
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
@ -35,6 +52,16 @@ 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)
@ -62,8 +89,8 @@ type MaxChargingTimeM frame
// EstChargingTimeM Estimated remaining time before the end of charging calculated by EV
type EstChargingTimeM frame
// ControlProtocolNumber Software version of control protocol to which EV corresponds
type ControlProtocolNumber frame
// EVControlProtocolNumber Software version of control protocol to which EV corresponds
type EVControlProtocolNumber frame
// TargetBatteryVoltage Target battery voltage ed charging voltage at the vehicle inlet terminals
type TargetBatteryVoltage frame
@ -104,6 +131,53 @@ type HighBattTemperature frame
// BattVoltageDeviationErr Status flag indicating whether or not the vehicle battery voltage deviates from the output voltage measured by the station
type BattVoltageDeviationErr frame
// EVSE entity from here
// EVcontWeldingDetectSupport Identifier indicating whether or not the station deals with EV contactor welding detection
type EVcontWeldingDetectSupport frame
// AvailableOutputVoltage Maximum output voltage value at the vehicle connector terminals
type AvailableOutputVoltage frame
// AvailableOutputCurrent Maximum output current value of the station
type AvailableOutputCurrent frame
// ThresholdVoltage Threshold voltage to stop the charging process in order to protect vehicle battery
type ThresholdVoltage frame
// EVSEControlProtocolNumber Software version number of control protocol or charging sequences that the station deals with
type EVSEControlProtocolNumber frame
// OutputVoltage Supply voltage value of the output circuit in the station
type OutputVoltage frame
// OutputCurrent Supply current value of the output circuit in the station
type OutputCurrent frame
// RemainingChargingTimeS Remaining time before the end of charging (counted by 10 s)
type RemainingChargingTimeS frame
// RemainingChargingTimeM Remaining time before the end of charging (counted by min)
type RemainingChargingTimeM frame
// StationStatus Status flag indicating the energy transfer from the station
type StationStatus frame
// StationMalfunction Status flag indicating whether or not there is a malfunction caused by the station
type StationMalfunction frame
// VehicleConnectorLock Status flag indicating Vehicle connector lock the electromagnetic lock status of vehicle connector
type VehicleConnectorLock frame
// BatteryIncompatibility Status flag indicating the compatibility of vehicle battery with the output voltage of station
type BatteryIncompatibility frame
// ChargingSystemMalfunction Status flag indicating whether or not there is a problem with EV, such as improper connection
type ChargingSystemMalfunction frame
// ChargerStopControl Status flag indicating whether or not the station proceeds with shutdown process
type ChargerStopControl frame
func FromCanFrames(frames <-chan *CanFrame) <-chan ChademoEvent {
events := make(chan ChademoEvent)
@ -121,7 +195,7 @@ func FromCanFrames(frames <-chan *CanFrame) <-chan ChademoEvent {
events <- &MaxChargingTimeM{frame}
events <- &EstChargingTimeM{frame}
case CAN_ID_102:
events <- &ControlProtocolNumber{frame}
events <- &EVControlProtocolNumber{frame}
events <- &TargetBatteryVoltage{frame}
events <- &ChargingCurrentReq{frame}
events <- &ChargingRate{frame}
@ -135,6 +209,23 @@ func FromCanFrames(frames <-chan *CanFrame) <-chan ChademoEvent {
events <- &BattCurrentDeviationErr{frame}
events <- &HighBattTemperature{frame}
events <- &BattVoltageDeviationErr{frame}
case CAN_ID_108:
events <- &EVcontWeldingDetectSupport{frame}
events <- &AvailableOutputVoltage{frame}
events <- &AvailableOutputCurrent{frame}
events <- &ThresholdVoltage{frame}
case CAN_ID_109:
events <- &EVSEControlProtocolNumber{frame}
events <- &OutputVoltage{frame}
events <- &OutputCurrent{frame}
events <- &RemainingChargingTimeS{frame}
events <- &RemainingChargingTimeM{frame}
events <- &StationStatus{frame}
events <- &StationMalfunction{frame}
events <- &VehicleConnectorLock{frame}
events <- &BatteryIncompatibility{frame}
events <- &ChargingSystemMalfunction{frame}
events <- &ChargerStopControl{frame}
}
}
}()
@ -198,6 +289,41 @@ func bytesToUint16(bytes []uint8) uint16 {
return result
}
func evWeldingDetectionSupport(bytes *[]uint8) SuppVehicleWeldingDetection {
if (*bytes)[0] == 0 {
return VEHICLE_WELDING_DETECTION_NOT_SUPPORTED
}
return VEHICLE_WELDING_DETECTION_SUPPORTED
}
func getStationState(bytes *[]uint8) StationState {
if isBitSet((*bytes)[5], 0) {
return CHARGING
}
return STANDBY
}
func getConnectorLock(bytes *[]byte) ConnectorLock {
if isBitSet((*bytes)[5], 2) {
return CONNECTOR_LOCKED
}
return CONNECTOR_UNLOCKED
}
func getBatteryCompatibility(bytes *[]uint8) BatteryCompatible {
if isBitSet((*bytes)[5], 3) {
return BATTERY_INCOMPATIBLE
}
return BATTERY_COMPATIBLE
}
func getChargerStopControl(bytes *[]uint8) StopControl {
if isBitSet((*bytes)[5], 5) {
return SHUTDOWN_STOP
}
return OPERATING
}
func (m MaximumBatteryVoltage) GetValue() (interface{}, *string) {
return bytesToUint16(m.payload[4:6]), &m.date
}
@ -222,7 +348,7 @@ func (e EstChargingTimeM) GetValue() (interface{}, *string) {
return e.payload[3], &e.date
}
func (c ControlProtocolNumber) GetValue() (interface{}, *string) {
func (c EVControlProtocolNumber) GetValue() (interface{}, *string) {
return c.payload[0], &c.date
}
@ -278,6 +404,66 @@ func (b BattVoltageDeviationErr) GetValue() (interface{}, *string) {
return getFault(&b.payload, 4, 4), &b.date
}
func (e EVcontWeldingDetectSupport) GetValue() (interface{}, *string) {
return evWeldingDetectionSupport(&e.payload), &e.date
}
func (a AvailableOutputVoltage) GetValue() (interface{}, *string) {
return bytesToUint16(a.payload[1:3]), &a.date
}
func (a AvailableOutputCurrent) GetValue() (interface{}, *string) {
return a.payload[3], &a.date
}
func (t ThresholdVoltage) GetValue() (interface{}, *string) {
return bytesToUint16(t.payload[4:6]), &t.date
}
func (e EVSEControlProtocolNumber) GetValue() (interface{}, *string) {
return e.payload[0], &e.date
}
func (o OutputVoltage) GetValue() (interface{}, *string) {
return bytesToUint16(o.payload[1:3]), &o.date
}
func (o OutputCurrent) GetValue() (interface{}, *string) {
return o.payload[3], &o.date
}
func (r RemainingChargingTimeS) GetValue() (interface{}, *string) {
return r.payload[6] * 10, &r.date
}
func (r RemainingChargingTimeM) GetValue() (interface{}, *string) {
return r.payload[7], &r.date
}
func (s StationStatus) GetValue() (interface{}, *string) {
return getStationState(&s.payload), &s.date
}
func (s StationMalfunction) GetValue() (interface{}, *string) {
return getFault(&s.payload, 5, 1), &s.date
}
func (v VehicleConnectorLock) GetValue() (interface{}, *string) {
return getConnectorLock(&v.payload), &v.date
}
func (b BatteryIncompatibility) GetValue() (interface{}, *string) {
return getBatteryCompatibility(&b.payload), &b.date
}
func (c ChargingSystemMalfunction) GetValue() (interface{}, *string) {
return getFault(&c.payload, 5, 4), &c.date
}
func (c ChargerStopControl) GetValue() (interface{}, *string) {
return getChargerStopControl(&c.payload), &c.date
}
func (v VehicleChargingEnabled) String() string {
switch v {
case DISABLED:
@ -332,3 +518,58 @@ func (s StopRequest) String() string {
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")
}
}

Loading…
Cancel
Save