@@ -10,7 +10,7 @@ WRAPPER_CLASS radio_driver(radio, board);
1010
1111VolatileRTCClock fallback_clock;
1212AutoDiscoverRTCClock rtc_clock (fallback_clock);
13- SensorManager sensors;
13+ PromicroSensorManager sensors;
1414
1515#ifndef LORA_CR
1616 #define LORA_CR 5
@@ -74,3 +74,85 @@ mesh::LocalIdentity radio_new_identity() {
7474 RadioNoiseListener rng (radio);
7575 return mesh::LocalIdentity (&rng); // create new random identity
7676}
77+
78+ INA3221 INA_3221 (TELEM_INA3221_ADDRESS, &Wire);
79+
80+ bool PromicroSensorManager::begin () {
81+ if (INA_3221.begin () ) {
82+ Serial.print (" Found INA3221 at address " );
83+ Serial.print (INA_3221.getAddress ());
84+ Serial.println ();
85+ Serial.print (INA_3221.getDieID (), HEX);
86+ Serial.print (INA_3221.getManufacturerID (), HEX);
87+ Serial.print (INA_3221.getConfiguration (), HEX);
88+ Serial.println ();
89+
90+ for (int i = 0 ; i < 3 ; i++) {
91+ INA_3221.setShuntR (i, TELEM_INA3221_SHUNT_VALUE);
92+ }
93+ INA3221initialized = true ;
94+ }
95+ else {
96+ INA3221initialized = false ;
97+ Serial.print (" INA3221 was not found at I2C address " );
98+ Serial.print (TELEM_INA3221_ADDRESS, HEX);
99+ Serial.println ();
100+ }
101+ return true ;
102+ }
103+
104+ bool PromicroSensorManager::querySensors (uint8_t requester_permissions, CayenneLPP& telemetry) {
105+ if (requester_permissions && TELEM_PERM_ENVIRONMENT) {
106+ if (INA3221initialized) {
107+ for (int i = 0 ; i < 3 ; i++) {
108+ // add only enabled INA3221 channels to telemetry
109+ if (INA3221_CHANNEL_ENABLED[i]) {
110+ telemetry.addVoltage (INA3221_CHANNELS[i], INA_3221.getBusVoltage (i));
111+ telemetry.addCurrent (INA3221_CHANNELS[i], INA_3221.getCurrent (i));
112+ telemetry.addPower (INA3221_CHANNELS[i], INA_3221.getPower (i));
113+ }
114+ }
115+ }
116+ }
117+
118+ return true ;
119+ }
120+
121+ int PromicroSensorManager::getNumSettings () const {
122+ return NUM_SENSOR_SETTINGS;
123+ }
124+
125+ const char * PromicroSensorManager::getSettingName (int i) const {
126+ if (i >= 0 && i < NUM_SENSOR_SETTINGS) {
127+ return INA3221_CHANNEL_NAMES[i];
128+ }
129+ return NULL ;
130+ }
131+
132+ const char * PromicroSensorManager::getSettingValue (int i) const {
133+ if (i >= 0 && i < NUM_SENSOR_SETTINGS) {
134+ return INA3221_CHANNEL_ENABLED[i] ? " 1" : " 0" ;
135+ }
136+ return NULL ;
137+ }
138+
139+ bool PromicroSensorManager::setSettingValue (const char * name, const char * value) {
140+ for (int i = 0 ; i < NUM_SENSOR_SETTINGS; i++) {
141+ if (strcmp (name, INA3221_CHANNEL_NAMES[i]) == 0 ) {
142+ int channelEnabled = INA_3221.getEnableChannel (i);
143+ if (strcmp (value, " 1" ) == 0 ) {
144+ INA3221_CHANNEL_ENABLED[i] = true ;
145+ if (!channelEnabled) {
146+ INA_3221.enableChannel (i);
147+ }
148+ } else {
149+ INA3221_CHANNEL_ENABLED[i] = false ;
150+ if (channelEnabled) {
151+ INA_3221.disableChannel (i);
152+ }
153+ }
154+ return true ;
155+ }
156+ }
157+ return false ;
158+ }
0 commit comments