Files
cariflex/tools/EVerest-main/modules/HardwareDrivers/EVSE/PhyVersoBSP/phyverso_gpio/evGpio.h
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

104 lines
2.5 KiB
C++

// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#ifndef PHYVERSO_GPIO_EV_GPIO_H
#define PHYVERSO_GPIO_EV_GPIO_H
#include "evConfig.h"
#include <atomic>
#include <chrono>
#include <everest/gpio/gpio.hpp>
#include <sigslot/signal.hpp>
#include <stdexcept>
#include <stdint.h>
#include <utility>
#include <utils/thread.hpp>
class evGpio {
public:
evGpio(evConfig& _verso_config);
~evGpio();
void poll_thread();
void run();
bool init_gpios();
// Read thread for serial port
Everest::Thread poll_thread_handle;
// Signals to communicate state changes to other modules
sigslot::signal<int, bool> signal_stop_button_state;
// List of used buttons/gpios
enum PushButtonName {
CONN1_PB_STOP,
CONN2_PB_STOP,
NUM_PB_NAMES,
};
private:
static constexpr uint32_t poll_time_ms = 10; //< time in ms between polled gpio input readings/debouncing
// structure to encapsulate Everest::Gpio and corresponding debounce shift register
// for now we will use 16 consecutive 0's or 1's to correspond to a stable input level (could be 8/32/64 aswell,
// just needs adjusting in bitmasks and bitwidths)
struct PushButton {
void init_gpio(const Everest::GpioSettings& settings) {
gpio.open(settings);
gpio.set_input();
};
bool ready() {
return gpio.is_ready();
};
void read() {
debounce_shift_reg = (debounce_shift_reg << 1) | gpio.read();
switch (debounce_shift_reg) {
case 0xFFFF:
state = true;
break;
case 0x0000:
state = false;
break;
default:
break;
}
state_changed = (last_state != state);
last_state = state;
};
bool get_state() {
return state;
};
bool get_state_changed() {
return state_changed;
};
void set_enabled(bool _enabled) {
enabled = _enabled;
};
bool get_enabled() {
return enabled;
};
private:
Everest::Gpio gpio;
bool state, last_state, state_changed = false;
bool enabled = false;
uint16_t debounce_shift_reg = 0;
};
PushButton push_buttons[NUM_PB_NAMES];
// config bridge (filled by json or everest module config)
evConfig& verso_config;
};
#endif // PHYVERSO_GPIO_EV_GPIO_H