Files
Eric F d398a6ced2 Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter
- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
2026-06-08 00:38:27 -04:00

152 lines
3.7 KiB
C++

// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
/**
* \file Common structs used between linux and the STM32 dev board. Data
* will be sent raw over the UDP socket, with the sender using
* \ref send(struct, sizeof(CbStruct))
* and the receiver using
* \ref receive(raw_bytes, sizeof(CbStruct))
* CbStruct *struct = reinterpret_cast<CbStruct *>(raw_bytes);
*
* Notes:
* 1) After V1 structs will not be able to remove fields, only add fields
* after the existing fields
* 2) There can be problems with variable length structs, for example
* CbFirmwarePacket that can have a payload with lengths 0-1024
*
* Test files are added at the end that check the sizes of the structs
* at compile time, to determine the fact that they are consistent
* across platforms.
*/
#pragma once
#include <stdint.h>
#include "cb_config.h"
#ifndef __cplusplus
#error "This header is C++ only"
#endif
enum class AppUDPResponse : uint32_t {
AUR_Ok = 0x500D500D, AUR_Bad = 0xBADBAD00,
};
enum class CbType : uint8_t {
CCS_EVSE = 0, CCS_EV = 1,
};
/*
* What type of message is on the socket
*/
enum class CbStructType : uint16_t {
// track IP with timeout and port
// Housekeepig, heartbeat/config (safety_config, serial port(fixed)/CAN bitrate, gpio config, mdns module name), fw version, softreset,
CST_HostToCb_Heartbeat = 1,
CST_CbToHost_Heartbeat = 2,
// track IP with timeout and port
// GPIO client
CST_HostToCb_Gpio = 3,
CST_CbToHost_Gpio = 4,
// FW update
CST_CbFirmwareReply = 0xFFF9,
CST_CbFirmwareStart = 0xFFFA,
CST_CbFirmwarePacket = 0xFFFB,
CST_CbFirmwareFinish = 0xFFFC,
CST_CbFirmwareUpdateCancel = 0xFFFD,
CST_CbFirmwarePing = 0xFFFE,
CST_CbFirmwareGetVersion = 0xFFFF,
};
/*
This container message is used for all generic module management packets
*/
template<typename T>
struct CB_COMPILER_ATTR_PACK CbManagementPacket {
CbStructType type;
T data;
};
template<> struct CB_COMPILER_ATTR_PACK CbManagementPacket<void> {
CbStructType type;
};
struct CB_COMPILER_ATTR_PACK CbGpioPacket {
uint8_t number_of_gpios; // Just to check compatibility
uint16_t gpio_values[CB_NUMBER_OF_GPIOS]; // Actual value, 0: low, 1: high, or duty cycle for PWM
};
struct CB_COMPILER_ATTR_PACK CbHeartbeatPacket {
CbConfig module_config;
};
struct CB_COMPILER_ATTR_PACK CbHeartbeatReplyPacket {
int32_t cp_hi_mV;
int32_t cp_lo_mV;
int32_t vdd_core;
int32_t vdd_3v3;
int32_t vdd_refint;
int32_t vdd_12V;
int32_t vdd_N12V;
int32_t pp_mOhm;
int32_t pp_voltage_mV;
uint8_t relay_state_feedback[3];
int16_t temperature_mcu_C;
int16_t temperature_pcb_C;
int16_t temperature_modem_C;
int16_t temperature_PT1000_C[2];
int32_t uptime_ms;
};
struct CB_COMPILER_ATTR_PACK CbFirmwareStart {
uint8_t is_secure_fw :1;
uint8_t requires_crc_verification :1;
uint8_t requires_sha256_verification :1;
uint8_t requires_signature_verification :1;
uint8_t requires_decryption :1;
// IV in case we require decryption
uint8_t iv[16];
};
struct CB_COMPILER_ATTR_PACK CbFirmwarePacket {
// If it is the last packet sent, used when we need to take care of
// the padding bytes in case of decryption or other operations
uint8_t last_packet :1;
uint16_t sector;
uint16_t data_len;
uint8_t data[1024];
};
struct CB_COMPILER_ATTR_PACK CbFirmwareEnd {
uint32_t firmware_len;
// Signature for the firmware in the faw format
uint8_t fw_signature[128];
uint8_t fw_signature_len;
uint8_t watermark_secure_end;
};
struct CB_COMPILER_ATTR_PACK CbFirmwareUpdateCancel {
uint8_t dummy;
};
struct CB_COMPILER_ATTR_PACK CbFirmwarePing {
uint8_t dummy;
};
struct CB_COMPILER_ATTR_PACK CbFirmwareGetVersion {
uint8_t dummy;
};
#include "test/cb_management_test.h"