STIMA  3
i2c-power.h
1 /*********************************************************************
2 Copyright (C) 2022 Marco Baldinetti <m.baldinetti@digiteco.it>
3 authors:
4 Paolo patruno <p.patruno@iperbole.bologna.it>
5 Marco Baldinetti <m.baldinetti@digiteco.it>
6 
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of
10 the License, or (at your option) any later version.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 **********************************************************************/
20 
21 #ifndef _I2C_POWER_H
22 #define _I2C_POWER_H
23 
24 #include "i2c-power-config.h"
25 #include <debug.h>
26 #include <i2c_config.h>
27 #include <avr/sleep.h>
28 #include <avr/power.h>
29 #include <avr/wdt.h>
30 #include <i2c_utility.h>
31 #include <rmap_utility.h>
32 #include <sdcard_utility.h>
33 #if (USE_JSON)
34 #include <json_utility.h>
35 #endif
36 #include <eeprom_utility.h>
37 #include <Wire.h>
38 #include <TimeLib.h>
39 #include <typedef.h>
40 #include <ADS1115.h>
41 #include <registers-power.h>
42 #include <debug_config.h>
43 #include <SdFat.h>
44 #include <StreamUtils.h>
45 #include <ArduinoLog.h>
46 
47 /*********************************************************************
48 * TYPEDEF
49 *********************************************************************/
54 typedef struct {
55  uint8_t module_main_version;
56  uint8_t module_configuration_version;
57  uint8_t module_type;
58  uint8_t i2c_address;
59  bool is_oneshot;
60  uint16_t adc_voltage_max_panel;
61  uint16_t adc_voltage_max_battery;
63 
68 typedef struct {
69  int16_t sample_panel;
70  int16_t sample_battery;
71  int16_t avg_panel;
72  int16_t avg_battery;
73 } data_t;
74 
79 typedef struct {
80  uint8_t module_type;
81  uint8_t module_main_version;
82  uint8_t module_minor_version;
83  data_t power;
85 
90 typedef struct {
91  uint8_t i2c_address;
92  bool is_oneshot;
93  uint16_t adc_voltage_max_panel;
94  uint16_t adc_voltage_max_battery;
95 
97 
98 /*********************************************************************
99 * TYPEDEF for Finite State Machine
100 *********************************************************************/
105 typedef enum {
106  INIT,
107  #if (USE_POWER_DOWN)
108  ENTER_POWER_DOWN,
109  #endif
111  END
112 } state_t;
113 
118 typedef enum {
119  POWER_INIT,
120  POWER_READING_PANEL,
121  POWER_READING_BATTERY,
122  POWER_ELABORATE,
123  POWER_END,
124  POWER_WAIT_STATE
125 } power_state_t;
126 
131 typedef enum {
132  POWER_HR_INIT,
133  POWER_HR_READ,
134  POWER_HR_EVALUATE,
135  POWER_HR_PROCESS,
136  POWER_HR_END,
137  POWER_HR_WAIT_STATE
138 } power_hr_state_t;
139 
140 /*********************************************************************
141 * GLOBAL VARIABLE
142 *********************************************************************/
143 
144 #if (ENABLE_SDCARD_LOGGING)
149 SdFat SD;
150 
155 File logFile;
156 
161 WriteLoggingStream loggingStream(logFile,Serial);
162 #endif
163 
169 
175 
181 
187 
193 
199 
205 
211 
216 volatile uint8_t readable_data_address;
217 
222 volatile uint8_t readable_data_length;
223 
228 volatile uint8_t i2c_rx_data[I2C_MAX_DATA_LENGTH];
229 
234 volatile uint8_t i2c_error;
235 
240 volatile uint8_t ready_tasks_count;
241 
247 
252 volatile bool inside_transaction;
253 
258 volatile uint16_t transaction_time;
259 
264 volatile uint8_t lastcommand;
265 
270 bool is_start;
271 
276 bool is_stop;
277 
282 bool is_test_read;
283 
288 bool is_oneshot;
289 
294 bool is_continuous;
295 
300 bool is_test;
301 
302 int16_t sample_panel;
303 int16_t sample_battery;
304 int16_t average_panel;
305 int16_t average_battery;
306 
307 ADS1115 adc1(ADC_I2C_ADDRESS);
308 
313 uint16_t samples_count_panel;
314 
319 uint16_t samples_error_count_panel;
320 
325 uint16_t samples_count_battery;
326 
331 uint16_t samples_error_count_battery;
332 
337 volatile uint16_t timer_counter_ms;
338 volatile uint16_t timer_counter_s;
339 
344 state_t state;
345 
350 power_state_t power_state;
351 
352 //power_hr_state_t power_hr_state;
353 
354 /*********************************************************************
355 * FUNCTIONS
356 *********************************************************************/
357 
363 void init_logging();
364 
372 void init_power_down(uint32_t *time_ms, uint32_t debouncing_ms);
373 
380 void init_wdt(uint8_t wdt_timer);
381 
387 void init_system(void);
388 
394 void init_buffers(void);
395 
401 void init_tasks(void);
402 
408 void init_pins(void);
409 
415 void init_wire(void);
416 
422 void init_adc(void);
423 
429 void init_spi(void);
430 
436 void init_rtc(void);
437 
438 #if (USE_TIMER_1)
444 void init_timer1(void);
445 
451 void start_timer(void);
452 
458 void stop_timer(void);
459 #endif
460 
466 void init_sensors(void);
467 
473 void print_configuration(void);
474 
480 void load_configuration(void);
481 
488 void save_configuration(bool);
489 
495 void commands(void);
496 
502 void tests(void);
503 
510 void reset_buffer(void);
511 
517 void exchange_buffers(void);
518 
524 void make_report (bool init=false);
525 
526 
527 #if (USE_SENSOR_PWR)
528 
529 uint16_t powerRead(uint8_t analog);
530 uint16_t powerMean(uint8_t analog, uint8_t count=3, uint8_t delay_ms=10);
531 uint16_t getPowerVoltage (uint8_t analog, uint16_t voltage_max);
532 
533 #endif
534 
535 /*********************************************************************
536 * TASKS
537 *********************************************************************/
538 
543 volatile bool is_event_power_task;
544 
551 void power_task(void);
552 
560 void power_task_hr(void);
561 
566 volatile bool is_event_command_task;
567 
574 void command_task(void);
575 
576 /*********************************************************************
577 * INTERRUPTS HANDLER
578 *********************************************************************/
585 
592 
593 #endif
#define I2C_MAX_DATA_LENGTH
Max length in bytes for i2c bus data buffer.
Definition: i2c_config.h:36
volatile bool is_event_command_task
Enable or disable the Command task.
Definition: i2c-leaf.h:502
volatile bool inside_transaction
Status of command transaction.
Definition: i2c-leaf.h:295
void load_configuration(void)
Load configuration from EEPROM.
Definition: i2c-leaf.ino:335
volatile uint8_t readable_data_length
Number of bytes to read at readable_data_address.
Definition: i2c-leaf.h:202
volatile uint8_t lastcommand
last command received.
Definition: i2c-leaf.h:214
bool is_start
Execute start command.
Definition: i2c-leaf.h:244
void init_tasks(void)
Init tasks variable and state.
Definition: i2c-leaf.ino:225
configuration_t configuration
Configuration data.
Definition: i2c-leaf.h:148
void init_system(void)
Init system.
Definition: i2c-leaf.ino:290
volatile uint8_t i2c_error
Number of i2c error.
Definition: i2c-leaf.h:220
void init_spi(void)
Init SPI library.
Definition: i2c-leaf.ino:262
writable_data_t writable_data
Writable i2c register.
Definition: i2c-leaf.h:184
writable_data_t * writable_data_ptr
Pointer for read and write data in i2c writable register.
Definition: i2c-leaf.h:190
void init_wire(void)
Init wire (i2c) library and performs checks on the bus.
Definition: i2c-leaf.ino:251
void i2c_receive_interrupt_handler(void)
I2C receive interrupt handler.
uint32_t awakened_event_occurred_time_ms
System time (in millisecond) when the system has awakened from power down.
Definition: i2c-leaf.h:238
void save_configuration(bool)
Save configuration to EEPROM.
Definition: i2c-leaf.ino:312
void init_rtc(void)
Init RTC module.
Definition: i2c-leaf.ino:266
volatile uint16_t transaction_time
Timer counter variable for compute command transaction timeout.
Definition: i2c-leaf.h:301
void init_wdt(uint8_t wdt_timer)
Init watchdog.
Definition: i2c-leaf.ino:202
void command_task(void)
Command Task. Execute the command received on i2c bus by reading i2c received data buffer.
Definition: i2c-leaf.ino:557
state_t
Main loop finite state machine.
Definition: i2c-leaf.h:100
@ INIT
init tasks and sensors
Definition: i2c-leaf.h:101
@ TASKS_EXECUTION
execute active tasks
Definition: i2c-leaf.h:105
@ END
go to ENTER_POWER_DOWN or TASKS_EXECUTION
Definition: i2c-leaf.h:106
void init_pins(void)
Init hardware pins.
Definition: i2c-leaf.ino:244
void commands(void)
Performs specific operations based on the received command.
Definition: i2c-leaf.ino:649
void exchange_buffers(void)
Exchange reader and writer pointer to buffer.
Definition: i2c-leaf.ino:535
void print_configuration(void)
Print current configuration.
Definition: i2c-leaf.ino:301
volatile readable_data_t readable_data_1
First readable i2c register.
Definition: i2c-leaf.h:154
volatile readable_data_t * readable_data_write_ptr
Pointer for write data in i2c readable register.
Definition: i2c-leaf.h:172
volatile uint16_t timer_counter_ms
Timer counter variable for execute timed task with time multiple of base Timer1 time.
Definition: i2c-leaf.h:277
void i2c_request_interrupt_handler(void)
I2C request interrupt handler.
Definition: i2c-leaf.ino:395
bool is_stop
Execute stop command.
Definition: i2c-leaf.h:250
void init_buffers(void)
Init buffers.
Definition: i2c-leaf.ino:208
volatile uint8_t ready_tasks_count
Number of tasks ready to execute.
Definition: i2c-leaf.h:232
void init_sensors(void)
Create and setup sensors.
Definition: i2c-leaf.ino:353
void init_logging()
Init logging system.
Definition: i2c-leaf.ino:141
state_t state
Current main loop state.
Definition: i2c-leaf.h:283
volatile uint8_t i2c_rx_data[I2C_MAX_DATA_LENGTH]
Buffer for i2c received data.
Definition: i2c-leaf.h:208
volatile uint8_t readable_data_address
Address of readable i2c register.
Definition: i2c-leaf.h:196
volatile readable_data_t * readable_data_temp_ptr
Temporary pointer for exchange read and write pointer for i2c readable register.
Definition: i2c-leaf.h:178
volatile readable_data_t * readable_data_read_ptr
Pointer for read data in i2c readable register.
Definition: i2c-leaf.h:166
volatile readable_data_t readable_data_2
Second readable i2c register.
Definition: i2c-leaf.h:160
void reset_buffer(void)
Reset sample and observations buffers to default value.
Definition: i2c-thr.ino:1252
bool is_test_read
Received command is in continuous mode.
Definition: i2c-leaf.h:256
void init_power_down(uint32_t *time_ms, uint32_t debouncing_ms)
Enter power down mode.
Definition: i2c-leaf.ino:173
bool is_oneshot
Received command is in oneshot mode.
Definition: i2c-opc.h:340
bool is_continuous
Received command is in continuous mode.
Definition: i2c-opc.h:346
void tests()
Performs specific operations based on the received command.
Definition: i2c-opc.ino:1400
void init_timer1(void)
Init Timer1 module.
Definition: stima.ino:737
void start_timer(void)
Start Timer1 module.
Definition: stima.ino:741
void stop_timer(void)
Stop Timer1 module.
Definition: stima.ino:749
EEPROM saved configuration.
Definition: i2c-leaf.h:55
Definition: i2c-power.h:68
Readable data through i2c bus.
Definition: i2c-leaf.h:76
Writable data through i2c bus.
Definition: i2c-leaf.h:87