STIMA  3
i2c-leaf.h
Go to the documentation of this file.
1 
3 /*********************************************************************
4 Copyright (C) 2017 Marco Baldinetti <m.baldinetti@digiteco.it>
5 authors:
6 Paolo patruno <p.patruno@iperbole.bologna.it>
7 Marco Baldinetti <m.baldinetti@digiteco.it>
8 
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License as
11 published by the Free Software Foundation; either version 2 of
12 the License, or (at your option) any later version.
13 
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 **********************************************************************/
22 
23 #ifndef _I2C_LEAF_H
24 #define _I2C_LEAF_H
25 
26 #include "i2c-leaf-config.h"
27 #include <debug.h>
28 #include <i2c_config.h>
29 #include <avr/sleep.h>
30 #include <avr/power.h>
31 #include <avr/wdt.h>
32 #include <i2c_utility.h>
33 #include <rmap_utility.h>
34 #if (USE_JSON)
35 #include <json_utility.h>
36 #endif
37 #include <eeprom_utility.h>
38 #include <Wire.h>
39 #include <TimeLib.h>
40 #include <typedef.h>
41 #include <registers-leaf.h>
42 #include <debug_config.h>
43 #include <SdFat.h>
44 #include <StreamUtils.h>
45 #include <ArduinoLog.h>
46 
47 
48 /*********************************************************************
49 * TYPEDEF
50 *********************************************************************/
55 typedef struct {
58  uint8_t module_type;
59  uint8_t i2c_address;
60  bool is_oneshot;
61  uint16_t leaf_calibration_threshold;
63 
68 typedef struct {
69  uint32_t time;
71 
76 typedef struct {
77  uint8_t module_type;
82 
87 typedef struct {
88  uint8_t i2c_address;
89  bool is_oneshot;
90  uint16_t leaf_calibration_threshold;
92 
93 /*********************************************************************
94 * TYPEDEF for Finite State Machine
95 *********************************************************************/
100 typedef enum {
102  #if (USE_POWER_DOWN)
103  ENTER_POWER_DOWN,
104  #endif
106  END
108 
113 typedef enum {
115  LEAF_READING_READ,
119 
120 /*********************************************************************
121 * GLOBAL VARIABLE
122 *********************************************************************/
123 
124 #if (ENABLE_SDCARD_LOGGING)
129 SdFat SD;
130 
135 File logFile;
136 
141 WriteLoggingStream loggingStream(logFile,Serial);
142 #endif
143 
149 
155 
161 
167 
173 
179 
185 
191 
196 volatile uint8_t readable_data_address;
197 
202 volatile uint8_t readable_data_length;
203 
209 
214 volatile uint8_t lastcommand;
215 
220 volatile uint8_t i2c_error;
221 
226 volatile uint8_t i2c_time;
227 
232 volatile uint8_t ready_tasks_count;
233 
239 
244 bool is_start;
245 
250 bool is_stop;
251 
257 
258 bool is_leaf_init;
259 bool is_leaf_wet;
260 
266 
272 
277 volatile uint16_t timer_counter_ms;
278 
284 
289 leaf_reading_state_t leaf_reading_state;
290 
295 volatile bool inside_transaction;
296 
301 volatile uint16_t transaction_time;
302 
303 /*********************************************************************
304 * FUNCTIONS
305 *********************************************************************/
306 
312 void init_logging();
313 
321 void init_power_down(uint32_t *time_ms, uint32_t debouncing_ms);
322 
329 void init_wdt(uint8_t wdt_timer);
330 
336 void init_system(void);
337 
343 void init_buffers(void);
344 
350 void init_tasks(void);
351 
357 void init_pins(void);
358 
364 void init_wire(void);
365 
371 void init_spi(void);
372 
378 void init_rtc(void);
379 
380 #if (USE_TIMER_1)
386 void init_timer1(void);
387 
393 void start_timer(void);
394 
400 void stop_timer(void);
401 #endif
402 
408 void init_sensors(void);
409 
415 void print_configuration(void);
416 
422 void load_configuration(void);
423 
430 void save_configuration(bool);
431 
437 void commands(void);
438 
444 void reset_samples_buffer(void);
445 void reset_report_buffer(void);
446 void reset_buffer(void);
447 
453 // void reset_observations_buffer(void);
454 
460 void exchange_buffers(void);
461 
462 template<typename sample_g, typename observation_g, typename value_v> void addSample(sample_g *sample, observation_g *observation, value_v value);
463 
464 template<typename observation_g, typename value_v> value_v readCurrentObservation(observation_g *buffer);
465 template<typename observation_g, typename value_v> void writeCurrentObservation(observation_g *buffer, value_v value);
466 template<typename observation_g, typename length_v> void resetObservation(observation_g *buffer, length_v length);
467 template<typename observation_g, typename length_v> void resetBackPmObservation(observation_g *buffer, length_v length);
468 template<typename observation_g, typename length_v> void incrementObservation(observation_g *buffer, length_v length);
469 template<typename observation_g, typename length_v, typename value_v> void addObservation(observation_g *buffer, length_v length, value_v value);
470 template<typename observation_g, typename length_v, typename value_v> value_v readBackObservation(observation_g *buffer, length_v length);
471 
472 
479 void samples_processing(bool is_force_processing);
480 
481 /*********************************************************************
482 * TASKS
483 *********************************************************************/
488 volatile bool is_event_leaf_reading;
489 
496 void leaf_reading_task(void);
497 
502 volatile bool is_event_command_task;
503 
510 void command_task(void);
511 
512 /*********************************************************************
513 * INTERRUPTS HANDLER
514 *********************************************************************/
521 
528 
529 #endif
#define I2C_MAX_DATA_LENGTH
Max length in bytes for i2c bus data buffer.
Definition: i2c_config.h:36
void leaf_reading_task(void)
Sensors reading Task. Read data from sensors.
Definition: i2c-leaf.ino:469
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
bool do_buffers_reset
Force a buffers reset.
Definition: i2c-leaf.h:271
volatile uint8_t i2c_time
Time in seconds from last I2C reset.
Definition: i2c-leaf.h:226
void reset_samples_buffer(void)
Reset samples buffers to default value.
Definition: i2c-leaf.ino:549
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
volatile bool is_event_leaf_reading
Enable or disable the Sensors reading task.
Definition: i2c-leaf.h:488
void init_wdt(uint8_t wdt_timer)
Init watchdog.
Definition: i2c-leaf.ino:202
leaf_reading_state_t
Definition: i2c-leaf.h:113
@ LEAF_READING_WAIT_STATE
non-blocking waiting time
Definition: i2c-leaf.h:117
@ LEAF_READING_INIT
init task variables
Definition: i2c-leaf.h:114
@ LEAF_READING_END
performs end operations and deactivate task
Definition: i2c-leaf.h:116
uint8_t samples_count
Number of samples to be acquired for make one observation.
Definition: i2c-leaf.h:265
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
void samples_processing(bool is_force_processing)
Main routine for processing the samples to calculate an observation.
Definition: i2c-opc.ino:560
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
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
uint8_t i2c_address
i2c address
Definition: i2c-leaf.h:59
bool is_oneshot
enable or disable oneshot mode
Definition: i2c-leaf.h:60
uint8_t module_configuration_version
module configuration version
Definition: i2c-leaf.h:57
uint8_t module_type
module type
Definition: i2c-leaf.h:58
uint8_t module_main_version
module main version
Definition: i2c-leaf.h:56
Leaf wetness data.
Definition: i2c-leaf.h:68
uint32_t time
time in seconds that indicates wet leaf
Definition: i2c-leaf.h:69
Readable data through i2c bus.
Definition: i2c-leaf.h:76
uint8_t module_main_version
module main version
Definition: i2c-leaf.h:78
uint8_t module_type
module type
Definition: i2c-leaf.h:77
leaf_wetness_t leaf_wetness
leaf wetness data for report
Definition: i2c-leaf.h:80
uint8_t module_minor_version
module minor version
Definition: i2c-leaf.h:79
Writable data through i2c bus.
Definition: i2c-leaf.h:87
uint8_t i2c_address
i2c address
Definition: i2c-leaf.h:88
bool is_oneshot
enable or disable oneshot mode
Definition: i2c-leaf.h:89