Classes

  Name
class Okapi
The Okapi data logger: what is Okapi’s about it, on the NW_Logger core.

Types

  Name
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}

Defines

  Name
  OKAPI_LIBRARY_VERSION
  OKAPI_LIBRARY_COMMIT
  SKETCH_COMMIT
  VPRIME
  VBETA
  INTERNAL
  EXTERNAL
  MODEL_1v0
  MODEL_0v0

Types Documentation

enum board

Enumerator Value Description
Model_0v0 0  
Model_1v0 1  
Model_2v0 2  

enum build

Enumerator Value Description
Build_A 0  
Build_B 1  
Build_C 2  

enum temp_val

Enumerator Value Description
Therm_Val 0  
RTC_Val 1  

Macros Documentation

define OKAPI_LIBRARY_VERSION

#define OKAPI_LIBRARY_VERSION "0.7.0"

define OKAPI_LIBRARY_COMMIT

#define OKAPI_LIBRARY_COMMIT ""

define SKETCH_COMMIT

#define SKETCH_COMMIT ""

define VPRIME

#define VPRIME 1

define VBETA

#define VBETA 2

define INTERNAL

#define INTERNAL 0

define EXTERNAL

#define EXTERNAL 1

define MODEL_1v0

#define MODEL_1v0 

define MODEL_0v0

#define MODEL_0v0 

Source code

#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

Updated on 2026-09-23 at 22:44:32 +0000