agrobot_base/Firmware/Modulos/Pinout.h

114 lines
3.5 KiB
C++

#include "Enuns.h"
#include "SerialService.h"
#include <Wire.h>
#include <Adafruit_MCP23X17.h>
#ifndef Pinout
#define Pinout
Adafruit_MCP23X17 mcp;
bool mcpInicializado = false;
class PinoModel {
public:
int num;
TiposBarramentos barramento;
TiposPinos tipo;
TiposLeituras leitura;
PinoModel(int numero = -1, TiposBarramentos barr = CONTROLADOR, TiposPinos tp = _INPUT, TiposLeituras lt = DIGITAL) : num(numero), barramento(barr), tipo(tp), leitura(lt) {
}
bool Definido() {
return num > -1;
}
void Conectar(bool statusInicial = false) {
if (Definido()) {
if (barramento == CONTROLADOR) {
if (tipo == _INPUT) {
pinMode(num, INPUT);
} else if (tipo == _OUTPUT) {
pinMode(num, OUTPUT);
set(statusInicial);
}
}
else if (barramento == EXPANSORI2C) {
if (tipo == _INPUT) {
mcp.pinMode(num, INPUT);
} else if (tipo == _OUTPUT) {
mcp.pinMode(num, OUTPUT);
set(statusInicial);
}
}
}
}
void Desconectar() {
if (Definido()) {
if (barramento == CONTROLADOR) {
if (tipo == _PWM) {
ledcDetachPin(num);
}
pinMode(num, INPUT);
}
else if (barramento == EXPANSORI2C) {
mcp.pinMode(num, INPUT);
}
}
}
int get() {
if (Definido()) {
if (barramento == CONTROLADOR) {
if (leitura == DIGITAL) {
return digitalRead(num);
}
else if (leitura == ANALOGICO) {
return analogRead(num);
}
}
else if (barramento == EXPANSORI2C) {
return mcp.digitalRead(num);
}
}
return -1;
}
void set(bool status) {
if (Definido()) {
if (barramento == CONTROLADOR) {
digitalWrite(num, status ? HIGH : LOW);
}
else if (barramento == EXPANSORI2C) {
mcp.digitalWrite(num, status ? HIGH : LOW);
}
}
}
};
void iniciarMCP(T_Code Modulo, String Mod_ID, int sda, int scl, byte endereco, bool Mandatorio = false) {
Serial.println("Iniciando MCP23X17...");
if (!mcpInicializado) {
bool init = Wire.begin(sda, scl);
String str = "SDA " + (String)sda + " SCL " + (String)scl + " Res " + init;
Serial.print(str);
if (!mcp.begin_I2C(endereco, &Wire)) {
mcpInicializado = false;
Serial.println("Erro ao iniciar MCP23X17!");
if (Mandatorio) {
Serial.println("Conexão obrigatória, tentando novamente em 5 segundos...");
EnviarDadosSerial(Mod_ID, MontarProtocoloErro(Modulo));
delay(5000);
iniciarMCP(Modulo, Mod_ID, sda, scl, endereco, Mandatorio);
}
}
else {
Serial.println("MCP23X17 iniciado com sucesso!");
mcpInicializado = true;
}
}
}
#endif