#ifndef Okapi_h
#define Okapi_h
#include <Arduino.h>
#include <Wire.h>
#include <NW_Logger.h> // the logger core that Okapi and Margay share (NW_Sensor and NW_Pages through it)
#include <Adafruit_ADS1015.h> //Include ADC interface
#include <MCP4725.h> //Include custom DAC library
#include <MCP23018.h>
// Build identity: this library's version (held equal to library.properties by
// NW-Tests/version_check.py) and its build commit, set by the NW-Build wrapper from
// git and blank in an Arduino IDE build; the sketch's commit the same way.
#define OKAPI_LIBRARY_VERSION "0.7.0"
#ifndef OKAPI_LIBRARY_COMMIT
#define OKAPI_LIBRARY_COMMIT ""
#endif
#ifndef SKETCH_COMMIT
#define SKETCH_COMMIT ""
#endif
#define VPRIME 1
#define VBETA 2
#define INTERNAL 0
#define EXTERNAL 1
#define MODEL_1v0
#define MODEL_0v0
enum board
{
Model_0v0 = 0,
Model_1v0 = 1,
Model_2v0 = 2
};
enum build
{
Build_A = 0,
Build_B = 1,
Build_C = 2
};
enum temp_val
{
Therm_Val = 0,
RTC_Val = 1
};
class Okapi : public NW_Logger
{
public:
Okapi(board Model_ = Model_0v0, build Specs_ = Build_A); //Use Build_A by default
bool begin(uint8_t *Vals, uint8_t NumVals, String header_) override;
using NW_Logger::begin;
String readStr(uint8_t LineIndex, uint32_t DataIndex);
float getVoltage(uint8_t Pin); //Read ADC
uint8_t setVoltageRaw(uint16_t Val, bool Gain = GAIN_1X); //Set DAC with raw input, default to 1x gain
uint8_t setVoltage(float Val); //Set DAC to nearest interpolated value
void addDataPoint(String (*Update)(void)) override;
String getOnBoardVals();
uint8_t powerAuto();
void powerAux(uint8_t State);
void i2cState(bool State);
// --- NW_Sensor: Okapi is a Schema 1 device and watches itself ---
const char* name() const override { return "Okapi"; }
size_t printStatus(Print& out, bool boot = false) override;
// --- PascalCase names, deprecated 2026-09-23: forwarders for one release ---
[[deprecated("Use logStr()")]] int LogStr(String Val) { return logStr(Val); }
[[deprecated("Use readStr()")]] String ReadStr(uint8_t LineIndex, uint32_t DataIndex) { return readStr(LineIndex, DataIndex); }
[[deprecated("Use run()")]] void Run(String (*Update)(void), unsigned long LogInterval) { run(Update, LogInterval); }
[[deprecated("Use getVoltage()")]] float GetVoltage(uint8_t Pin) { return getVoltage(Pin); }
[[deprecated("Use setVoltageRaw()")]] uint8_t SetVoltageRaw(uint16_t Val, bool Gain = GAIN_1X) { return setVoltageRaw(Val, Gain); }
[[deprecated("Use setVoltage()")]] uint8_t SetVoltage(float Val) { return setVoltage(Val); }
[[deprecated("Use addDataPoint()")]] void AddDataPoint(String (*Update)(void)) { addDataPoint(Update); }
[[deprecated("Use getOnBoardVals()")]] String GetOnBoardVals() { return getOnBoardVals(); }
[[deprecated("Use initLogFile()")]] void InitLogFile() { initLogFile(); }
[[deprecated("Use resetWDT()")]] void ResetWD() { resetWDT(); }
[[deprecated("Use powerAuto()")]] uint8_t PowerAuto() { return powerAuto(); }
[[deprecated("Use powerAux()")]] void PowerAux(uint8_t State) { powerAux(State); }
[[deprecated("Use i2cState()")]] void I2CState(bool State) { i2cState(State); }
uint8_t TX = 11; //ADD TO DOCUMENTATION!
uint8_t RX = 10; //ADD TO DOCUMENTATION!
uint8_t C0 = 18;
uint8_t C1 = 19;
uint8_t Sw_Bus_Prime = 23;
uint8_t Sw_Bus_Sec = 22;
uint8_t PG_3v3_Core = 1;
uint8_t FeatherEN = 7;
uint8_t D0 = 12;
uint8_t D1 = 25;
uint8_t D2 = 3;
uint8_t D3 = 26;
uint8_t ADC_Sense_SW = 0;
uint8_t FeatherRTS = 31;
uint8_t FeatherCTS = 30;
uint8_t FeatherGPIO = 29;
uint8_t CS_Ext = 24;
uint8_t GlobalInt = 28;
const String LibVersion = OKAPI_LIBRARY_VERSION;
protected:
String dataHeader() override;
void sleepNow() override;
void afterLogEvent() override; //The backhaul: after LogCountPush rows on main power, hand them to the Feather
void turnOffSDcard();
void turnOnSDcard();
void enviroStats();
uint8_t chipFaults(); // Okapi's chip-fault bits for Block 0: SDCard, Clock, BME280, SensorBus, Charger, Backup
void fillPages(); // Page 2 and 3 from the logger's own readings, then endReading()
MCP4725 DAC; //Instatiate DAC
Adafruit_ADS1115 ADC_OB; //Initialize on board (power moitoring) ADC
Adafruit_ADS1115 ADC_Ext; //Initialize external (sensor) ADC
MCP23018 IO;
float PowerState = 0; //Keep track of what power mode the system is using when waking from sleep
board Model;
build Specs;
uint16_t LogCountPush = 5; //Number of logs to take before sending data off
uint16_t LogCount = 0; //Number of logs since last data write
uint16_t Index = 0; //Index of data entry USE???? FIX!
uint32_t LastSDIndex = 0; //Index as last data dump
};
#endif