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
This commit is contained in:
Eric F
2026-06-08 00:38:27 -04:00
parent 468cfeaa50
commit d398a6ced2
7326 changed files with 1177561 additions and 7 deletions

View File

@@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.10)
# set the project name
project(phyverso_cli VERSION 0.1)
# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
find_package(Threads REQUIRED)
# add the executable
add_executable(phyverso_cli main.cpp)
target_include_directories(phyverso_cli
PUBLIC
"${PROJECT_BINARY_DIR}"
"../phyverso_mcu_comms/protobuf"
"../phyverso_mcu_comms"
"../phyverso_config"
)
target_link_libraries(phyverso_cli
PRIVATE
Pal::Sigslot
Threads::Threads
phyverso_mcu_comms
everest::framework
everest::nanopb
phyverso_config
)
install(TARGETS phyverso_cli
DESTINATION ${EVEREST_MOD_PHYVERSOBSP_DESTINATION})

View File

@@ -0,0 +1,307 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#include <stdio.h>
#include <string.h>
#include "evSerial.h"
#include <unistd.h>
#include "phyverso.pb.h"
#include <sigslot/signal.hpp>
std::atomic_bool sw_version_received = false;
void help() {
printf("\nUsage: ./phyverso_cli /dev/ttyXXX /path/to/config.json\n\n");
}
int main(int argc, char* argv[]) {
int selected_connector = 1;
printf("-- Phyverso CLI tool --\n");
printf("Use the following keys to send packets:\n");
printf("A or a: set AC coil on or off\n");
printf("D or d: set (monitored) DC coil on or off\n");
printf("O or o: set (unmonitored) AUX1 DC coil on or off\n");
printf("P or p: set (unmonitored) AUX2 DC coil on or off\n");
printf("L or l: motorlock lock or unlock\n");
printf("R or r: hard or soft reset\n");
printf("V: send keep alive/get version\n");
printf("K: trigger RCD TEST on selected connector\n");
printf("k: reset RCD on selected connector\n\n");
printf("1: use connector 1\n");
printf("2: use connector 2\n\n");
printf("0: PWM F (0%% DC, -12V)\n");
printf("5: PWM 5%%\n");
printf("6: PWM 10%%\n");
printf("7: PWM 80%%\n");
printf("8: PWM 97%%\n");
printf("9: PWM X1 (100%%)\n");
printf("9: PWM X1 (100%%)\n");
printf("U or u: Fan1 50%% or OFF (if your fan supports 0%% duty cycle)\n");
printf("I or i: Fan2 ON or 20%%\n");
if (argc != 3) {
help();
exit(0);
}
const char* device = argv[1];
const char* config_path = argv[2];
evConfig verso_config;
// with config rework we still have to go the json route here
if (!verso_config.open_file(config_path)) {
printf("Could not open config file \"%s\"\n", config_path);
return -1;
}
verso_config.json_conf_to_evConfig();
evSerial p(verso_config);
if (!p.open_device(device, 115200)) {
printf("Cannot open device \"%s\"\n", device);
} else {
p.run();
p.signal_config_request.connect([&]() {
printf("Received config request\n");
p.send_config();
printf("Sent config packet\n");
});
p.signal_keep_alive.connect([](KeepAlive s) {
printf(">> KeepAlive: phyverso MCU SW Version: %s, Hardware %i/rev %i, MCU Timestamp %i\n",
s.sw_version_string, s.hw_type, s.hw_revision, s.time_stamp);
sw_version_received = true;
});
p.signal_set_coil_state_response.connect([](int connector, CoilState s) {
if (s.coil_state)
printf(">> Connector %i, Coil %d: Relais CLOSED\n", connector, s.coil_type);
else
printf(">> Connector %i, Coil %d: Relais OPEN\n", connector, s.coil_type);
});
p.signal_telemetry.connect([](int connector, Telemetry t) {
printf(">> Connector %i: CP Voltage %i %i\n", connector, t.cp_voltage_hi, t.cp_voltage_lo);
});
p.signal_cp_state.connect([](int connector, CpState s) {
switch (s) {
case CpState_STATE_A:
printf(">> Connector %i: CP state A\n", connector);
break;
case CpState_STATE_B:
printf(">> Connector %i: CP state B\n", connector);
break;
case CpState_STATE_C:
printf(">> Connector %i: CP state C\n", connector);
break;
case CpState_STATE_D:
printf(">> Connector %i: CP state D\n", connector);
break;
case CpState_STATE_E:
printf(">> Connector %i: CP state E\n", connector);
break;
case CpState_STATE_F:
printf(">> Connector %i: CP state F\n", connector);
break;
}
});
p.signal_pp_state.connect([](int connector, PpState s) {
switch (s) {
case PpState_STATE_NC:
printf(">> Connector %i: PP state NC\n", connector);
break;
case PpState_STATE_13A:
printf(">> Connector %i: PP state 13A\n", connector);
break;
case PpState_STATE_20A:
printf(">> Connector %i: PP state 20A\n", connector);
break;
case PpState_STATE_32A:
printf(">> Connector %i: PP state 32A\n", connector);
break;
case PpState_STATE_70A:
printf(">> Connector %i: PP state 70A\n", connector);
break;
case PpState_STATE_FAULT:
printf(">> Connector %i: PP state FAULT\n", connector);
break;
}
});
p.signal_fan_state.connect([](FanState s) {
printf(">> Fan %i: EN=%s, Duty=%d RPM=%d\n", s.fan_id, (s.enabled ? "ON" : "OFF"), s.duty, s.rpm);
});
p.signal_lock_state.connect([](int connector, LockState s) {
switch (s) {
case LockState_UNDEFINED:
printf(">> Connector %i: Lock State UNDEFINED\n", connector);
break;
case LockState_LOCKED:
printf(">> Connector %i: Lock State Locked\n", connector);
break;
case LockState_UNLOCKED:
printf(">> Connector %i: Lock State Unlocked\n", connector);
break;
case LockState_LOCKING:
printf(">> Connector %i: Lock State Locking\n", connector);
break;
case LockState_UNLOCKING:
printf(">> Connector %i: Lock State Unlocking\n", connector);
break;
}
});
p.signal_error_flags.connect([](int connector, ErrorFlags error_flags) {
printf("------------\nError flags Connector %d:\n", connector);
printf("\tdiode_fault: %d\n", error_flags.diode_fault);
printf("\trcd_selftest_failed: %d\n", error_flags.rcd_selftest_failed);
printf("\trcd_triggered: %d\n", error_flags.rcd_triggered);
printf("\tventilation_not_available: %d\n", error_flags.ventilation_not_available);
printf("\tconnector_lock_failed: %d\n", error_flags.connector_lock_failed);
printf("\tcp_signal_fault: %d\n", error_flags.cp_signal_fault);
printf("\theartbeat_timeout: %d\n", error_flags.heartbeat_timeout);
printf("\tcoil_feedback_diverges_ac: %d\n", error_flags.coil_feedback_diverges);
printf("\tpp_signal_fault: %d\n", error_flags.pp_signal_fault);
printf("------------\n");
});
while (true) {
char c = getc(stdin);
switch (c) {
/* AC coils*/
case 'A':
printf("Setting AC coil to ON\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_AC, true);
break;
case 'a':
printf("Setting AC coil to OFF\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_AC, false);
break;
/* DC coils */
case 'D':
printf("Setting monitored DC coil to ON\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_DC1, true);
break;
case 'd':
printf("Setting monitored DC coil to OFF\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_DC1, false);
break;
case 'O':
printf("Setting AUX1 DC coil to ON\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_DC2, true);
break;
case 'o':
printf("Setting AUX1 DC coil to OFF\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_DC2, false);
break;
case 'P':
printf("Setting AUX2 DC coil to ON\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_DC3, true);
break;
case 'p':
printf("Setting AUX2 DC coil to OFF\n");
p.set_coil_state_request(selected_connector, CoilType_COIL_DC3, false);
break;
/* Motor lock */
case 'L':
printf("Locking connector\n");
p.lock(selected_connector, true);
break;
case 'l':
printf("Unlocking connector\n");
p.lock(selected_connector, false);
break;
/* Resets */
case 'r':
printf("Soft reset\n");
p.reset(-1);
break;
case 'R':
printf("Hard reset\n");
p.reset(1);
break;
/* Versions/timestamp */
case 'V':
printf("Sending keep alive\n");
p.keep_alive();
break;
/* Charging connector selection */
case '1':
printf("Connector 1 selected.\n");
selected_connector = 1;
break;
case '2':
printf("Connector 2 selected.\n");
selected_connector = 2;
break;
/* CP PWM setting */
case '0':
printf("Set 0%% PWM\n");
p.set_pwm(selected_connector, 0);
break;
case '5':
printf("Set 5%% PWM\n");
p.set_pwm(selected_connector, 500);
break;
case '6':
printf("Set 10%% PWM\n");
p.set_pwm(selected_connector, 1000);
break;
case '7':
printf("Set 80%% PWM\n");
p.set_pwm(selected_connector, 8000);
break;
case '8':
printf("Set 97%% PWM\n");
p.set_pwm(selected_connector, 9700);
break;
case '9':
printf("Set 100%% PWM\n");
p.set_pwm(selected_connector, 10000);
break;
/* Fans */
case 'U':
printf("Set fan1 to 50%%\n");
p.set_fan_state(0, true, 500);
break;
case 'u':
printf("Set fan1 to OFF\n");
p.set_fan_state(0, false, 500); // example for setting fan off via enable param
// check if your fan supports full OFF on PWM 0% duty (also check PWM on oscilloscope)
// some PWM fans wont turn fully off without switching 12V supply
break;
case 'I':
printf("Set fan2 to ON\n");
p.set_fan_state(1, true, 1000);
break;
case 'i':
printf("Set fan2 to 20%%\n");
p.set_fan_state(1, true, 200);
break;
/* RCD */
case 'K':
printf("Sending RCD Test on connector %d\n", selected_connector);
p.set_rcd_test(selected_connector, true);
break;
case 'k':
printf("Resetting RCD on connector %d\n", selected_connector);
p.reset_rcd(selected_connector, true);
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
return 0;
}