3 #include "pico/stdlib.h"
4 #include "hardware/gpio.h"
5 #include "hardware/adc.h"
6 #include "hardware/gpio.h"
7 #include "hardware/adc.h"
8 #include "hardware/pwm.h"
9 #include "hardware/clocks.h"
11 #ifndef PICO_MAX_PIN_COUNT
12 #define PICO_MAX_PIN_COUNT 40
18 enum PinFunctionEnum {PIN_FUNC_UNDEFINED, PIN_FUNC_GPIO, PIN_FUNC_ADC, PIN_FUNC_PWM};
31 bool is_setup =
false;
32 bool is_defined =
false;
42 virtual void setupPin(
PinInfo *info, pin_size_t pin) = 0;
43 virtual bool usePin(
PinInfo *info, pin_size_t pin) {
return false; };
59 virtual void setupPin(
PinInfo *info, pin_size_t pinNumber) {
61 Logger.
printf(PicoLogger::Debug,
"PinSetupADC::setupPin %d\n", pinNumber);
65 virtual bool usePin(
PinInfo *info, pin_size_t pinNumber) {
66 Logger.
printf(PicoLogger::Debug,
"PinSetupADC::usePin %d\n", pinNumber);
67 int adc = pinNumber - 26;
75 if (current_adc != adc){
76 Logger.
printf(PicoLogger::Debug,
"adc_select_input %d\n",adc);
77 adc_select_input((id_t)adc);
89 Logger.
info(
"adc_init");
98 bool adc_init_flag =
false;
114 virtual void setupPin(
PinInfo *info, pin_size_t pinNumber) {
115 Logger.
debug(
"PinSetupGPIO::setupPin");
116 gpio_init(pinNumber);
117 gpio_set_dir(pinNumber, info->pinMode==OUTPUT ? GPIO_OUT: GPIO_IN);
118 if (info->pinMode==INPUT_PULLUP) gpio_pull_up(pinNumber);
119 if (info->pinMode==INPUT_PULLDOWN) gpio_pull_down(pinNumber);
120 info->is_setup =
true;
137 if (inst_ptr==
nullptr){
145 Logger.
debug(
"PicoGPIOFunction::PinMode");
146 bool changed =
false;
147 if (!(pinInfo[pinNumber].is_defined) || pinInfo[pinNumber].
pinMode !=
pinMode){
148 pinInfo[pinNumber].pinMode =
pinMode;
149 pinInfo[pinNumber].is_setup =
false;
150 pinInfo[pinNumber].is_defined =
true;
152 Logger.
printf(PicoLogger::Debug,
"PicoGPIOFunction::PinMode -> has changed - pin: %d\n", pinNumber);
160 return pinInfo[pinNumber].is_defined;
165 return pinInfo[pinNumber].pinMode==INPUT;
170 return pinInfo[pinNumber].pinMode==OUTPUT;
175 return pinInfo[pinNumber].is_setup;
180 pinInfo[pinNumber].is_setup =
true;
185 return (PinMode) pinInfo[pinNumber].pinMode;
191 return isInput(pinNumber) ?
"INPUT" :
"OUTPUT";
199 Logger.
debug(
"clear");
200 gpio_set_function(pinNumber, GPIO_FUNC_NULL);
201 pinInfo[pinNumber].is_setup =
false;
206 Logger.
printf(PicoLogger::Debug,
"PicoGPIOFunction::usePin %d\n", pinNumber);
207 PinInfo *info = & (pinInfo[pinNumber]);
209 if (!info->is_setup) {
212 setup->setupPin(info, pinNumber);
213 info->is_setup =
true;
219 setup->usePin(info, pinNumber);
225 bool adc_init_flag =
false;
230 Logger.
debug(
"PicoGPIOFunction");
231 pinInfo =
new PinInfo[PICO_MAX_PIN_COUNT];
virtual int printf(LogLevel current_level, const char *fmt,...)
printf support
Definition: PicoLogger.h:65
virtual void info(const char *str, const char *str1=nullptr, const char *str2=nullptr)
logs an info message
Definition: PicoLogger.h:50
virtual void debug(const char *str, const char *str1=nullptr, const char *str2=nullptr)
writes an debug message
Definition: PicoLogger.h:60
The pico requires that the function of the pin is defined. In Arduino, there is no such concept - how...
Definition: PicoPinFunction.h:133
PinMode pinMode(pin_size_t pinNumber)
returns the pin mode
Definition: PicoPinFunction.h:184
void clear(pin_size_t pinNumber)
set gpio function to GPIO_FUNC_NULL
Definition: PicoPinFunction.h:198
bool isSetup(pin_size_t pinNumber)
checks if the setup has been done for the pin
Definition: PicoPinFunction.h:174
void usePin(pin_size_t pinNumber, PinFunctionEnum pinFunction, PinSetup *setup=nullptr)
setup Pico pin init function bysed on functionality
Definition: PicoPinFunction.h:205
bool isModeDefined(pin_size_t pinNumber)
checks if the mode was defined for the pin
Definition: PicoPinFunction.h:159
const char * pinModeStr(pin_size_t pinNumber)
returns the PinMode as string
Definition: PicoPinFunction.h:189
bool isInput(pin_size_t pinNumber)
checks if the pin has been defined as input
Definition: PicoPinFunction.h:164
bool setPinMode(pin_size_t pinNumber, PinMode pinMode)
defines the actual Arduino PinMode. Returns true if it needed to be changed
Definition: PicoPinFunction.h:144
bool isOutput(pin_size_t pinNumber)
checks if the pin has been defined as output
Definition: PicoPinFunction.h:169
void setSetup(pin_size_t pinNumber)
marks the pin setup as completed
Definition: PicoPinFunction.h:179
PicoPinFunction()
protected constructor because this is a singleton
Definition: PicoPinFunction.h:229
Pin Initialization for ADC.
Definition: PicoPinFunction.h:51
bool adcSelect(int adc)
select the ADC if it has been changed
Definition: PicoPinFunction.h:73
bool initADC()
calls adc_init() if necessary - returns true if it has been intialized (the first time)
Definition: PicoPinFunction.h:85
Pin Initialization for GPIO.
Definition: PicoPinFunction.h:112
Base class for function specific pin setup and pin use functionality.
Definition: PicoPinFunction.h:40
Pico Arduino Framework.
Definition: Arduino.cpp:26
PinFunctionEnum
Supported pin functions.
Definition: PicoPinFunction.h:18
Information about an the status and the Arduino PinMode of an individual pin.
Definition: PicoPinFunction.h:28