rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
gppwm.cpp
Go to the documentation of this file.
1
2#include "pch.h"
3
4#include "gppwm_channel.h"
5
6static GppwmChannel channels[GPPWM_CHANNELS];
7static OutputPin pins[GPPWM_CHANNELS];
8static SimplePwm outputs[GPPWM_CHANNELS];
9
11
12static gppwm_Map3D_t table1{"gppwm1"};
13static gppwm_Map3D_t table2{"gppwm2"};
14static gppwm_Map3D_t table3{"gppwm3"};
15static gppwm_Map3D_t table4{"gppwm4"};
16
17static gppwm_Map3D_t* const tables[] = {
18 &table1,
19 &table2,
20 &table3,
21 &table4,
22};
23
24static const char *channelNames[GPPWM_CHANNELS] = { "GPPWM#1",
25"GPPWM#2",
26"GPPWM#3",
27"GPPWM#4",
28 };
29
30
31void initGpPwm() {
32 for (size_t i = 0; i < efi::size(channels); i++) {
33 auto& cfg = engineConfiguration->gppwm[i];
34
35 // If no pin, don't enable this channel.
36 if (!isBrainPinValid(cfg.pin)) {
37 continue;
38 }
39
40 // Determine frequency and whether PWM is enabled
41 float freq = cfg.pwmFrequency;
42 bool usePwm = freq > 0;
43
44 // Setup pin & pwm
45 pins[i].initPin("gp pwm", cfg.pin);
46 if (usePwm) {
47 startSimplePwm(&outputs[i], channelNames[i], &engine->scheduler, &pins[i], freq, 0);
48 }
49
50 // Set up this channel's lookup table
51 tables[i]->initTable(cfg.table, cfg.rpmBins, cfg.loadBins);
52
53 // Finally configure the channel
54 channels[i].init(usePwm, &outputs[i], &pins[i], tables[i], &cfg);
55 }
56}
57
59 for (size_t i = 0; i < efi::size(channels); i++) {
60 auto result = channels[i].update(i);
61
62 engine->outputChannels.gppwmOutput[i] = result.Result;
63 engine->outputChannels.gppwmXAxis[i] = result.X;
64 engine->outputChannels.gppwmYAxis[i] = result.Y;
65 }
66}
SingleTimerExecutor scheduler
Definition engine.h:271
TunerStudioOutputChannels outputChannels
Definition engine.h:109
void init(bool usePwm, IPwm *pwm, OutputPin *outputPin, const ValueProvider3D *table, const gppwm_channel *config)
GppwmResult update(size_t index)
void initTable(TValueInit(&table)[TRowNum][TColNum], const TXColumnInit(&columnBins)[TColNum], const TRowInit(&rowBins)[TRowNum])
Single output pin reference and state.
Definition efi_output.h:49
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
Definition efi_gpio.cpp:711
static EngineAccessor engine
Definition engine.h:413
static constexpr engine_configuration_s * engineConfiguration
static OutputPin pins[GPPWM_CHANNELS]
Definition gppwm.cpp:7
static gppwm_Map3D_t table2
Definition gppwm.cpp:13
static GppwmChannel channels[GPPWM_CHANNELS]
Definition gppwm.cpp:6
static gppwm_Map3D_t *const tables[]
Definition gppwm.cpp:17
static gppwm_Map3D_t table1
Definition gppwm.cpp:12
static gppwm_Map3D_t table4
Definition gppwm.cpp:15
static SimplePwm outputs[GPPWM_CHANNELS]
Definition gppwm.cpp:8
static const char * channelNames[GPPWM_CHANNELS]
Definition gppwm.cpp:24
void initGpPwm()
Definition gppwm.cpp:31
Map3D< GPPWM_RPM_COUNT, GPPWM_LOAD_COUNT, uint8_t, int16_t, int16_t > gppwm_Map3D_t
Definition gppwm.cpp:10
static gppwm_Map3D_t table3
Definition gppwm.cpp:14
void updateGppwm()
Definition gppwm.cpp:58
bool isBrainPinValid(brain_pin_e brainPin)
void startSimplePwm(SimplePwm *state, const char *msg, Scheduler *executor, OutputPin *output, float frequency, float dutyCycle, pwm_gen_callback *callback)
scaled_channel< uint8_t, 2, 1 > gppwmOutput[4]
scaled_channel< int16_t, 1, 1 > gppwmXAxis[4]
scaled_channel< int16_t, 10, 1 > gppwmYAxis[4]