Nordic Semiconductor nRF5 AirFuel SDK  version 2.2.0
ptu_beacons.c
Go to the documentation of this file.
1 /* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
2  *
3  * The information contained herein is property of Nordic Semiconductor ASA.
4  * Terms and conditions of usage are described in detail in NORDIC
5  * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
6  *
7  * Licensees are granted free, non-transferable use of the information. NO
8  * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
9  * the file.
10  *
11  */
12 
15 #include "ptu_beacons.h"
16 #include "ptu_sensors.h"
17 #include "ptu_conn_man.h"
19 #include "ptu_power_ctl.h"
20 #include "ptu_test_mux.h"
21 
22 
23 /******************************************************************************/
26 /******************************************************************************/
27 
29 typedef enum
30 {
36 
38 typedef struct
39 {
40  uint32_t period;
41  ptu_beacon_status_t status;
42 } ptu_beacon_ctl_t;
43 
44 
45 static ptu_beacon_ctl_t m_beacon_ctl;
46 APP_TIMER_DEF(m_beacon_timer_id);
47 APP_TIMER_DEF(m_extended_beacon_load_var_timer_id);
48 static bool long_beacon_extension = false;
53 static void m_extended_beacon_load_var_handler(void * p_context)
54 {
55  uint32_t err_code;
56 
58  {
60  {
61  long_beacon_extension = true;
62  }
63  }
64 
65  // If PTU is not in Power Save state, stop the repeated extended beacon load variation timer
66  if(PTU_SM_CURRENT_STATE() != PTU_SM_STATE_POWER_SAVE)
67  {
68  err_code = app_timer_stop(m_extended_beacon_load_var_timer_id);
69  APP_ERROR_CHECK(err_code);
70  }
71 }
72 
76 static void m_beacon_timer_handler(void * context)
77 {
78  uint32_t err_code;
79 
80  // Ensure beacon is only switched on/off in power save state
81  if(PTU_SM_CURRENT_STATE() == PTU_SM_STATE_POWER_SAVE)
82  {
83  switch(m_beacon_ctl.status)
84  {
85  const ptu_sensor_data_t * sensor_data;
86 
87  case PTU_BEACON_STATUS_OFF: // Start of beacon period
88 
90  APP_ERROR_CHECK(err_code);
91 
92  err_code = ptu_tmux_poweramp_enable_set(true);
93  APP_ERROR_CHECK(err_code);
94 
95  err_code = ptu_sensors_read();
96  APP_ERROR_CHECK(err_code);
97 
98  err_code = ptu_sensors_data_get(&sensor_data);
99  APP_ERROR_CHECK(err_code);
100 
101  err_code = TIMER_START(m_beacon_timer_id, PTU_BEACON_DURATION_SHORT_MS, NULL);
102  APP_ERROR_CHECK(err_code);
103 
105  break;
106 
107  case PTU_BEACON_STATUS_SHORT: // Short beacon end
108  m_beacon_ctl.period++;
109 
110  err_code = ptu_sensors_data_get(&sensor_data);
111  APP_ERROR_CHECK(err_code);
112 
113  if((m_beacon_ctl.period < PTU_BEACON_CYCLES_LONG) && !sensor_data->load_var_detected)
114  {
115  err_code = ptu_tmux_poweramp_enable_set(false); // Switch coil off
116  APP_ERROR_CHECK(err_code);
117  err_code = TIMER_START(m_beacon_timer_id, (PTU_BEACON_CYCLE_PERIOD_MS - PTU_BEACON_DURATION_SHORT_MS), NULL);
118  APP_ERROR_CHECK(err_code);
120  }
121  else // Start long beacon
122  {
125  APP_ERROR_CHECK(err_code);
126  err_code = TIMER_START(m_beacon_timer_id, PTU_BEACON_DURATION_LONG_MS, NULL);
127  APP_ERROR_CHECK(err_code);
128  err_code = TIMER_START( m_extended_beacon_load_var_timer_id, PTU_POWER_SAVE_LONG_BEACON_PTX_READ_INTERVAL_MS, NULL);
129  APP_ERROR_CHECK(err_code);
131  m_beacon_ctl.period = 0;
132  }
133  break;
134 
135  case PTU_BEACON_STATUS_LONG: // Long beacon end
136  err_code = ptu_sensors_data_get(&sensor_data);
137  APP_ERROR_CHECK(err_code);
138 
139  err_code = app_timer_stop(m_extended_beacon_load_var_timer_id);
140  APP_ERROR_CHECK(err_code);
141 
143 
145  {
146  // Start extended beacon
147  long_beacon_extension = false;
148  err_code = TIMER_START(m_beacon_timer_id,(PTU_BEACON_DURATION_EXTENDED_MS - PTU_BEACON_DURATION_LONG_MS), NULL);
149  APP_ERROR_CHECK(err_code);
151  }
152 
153  else
154  {
156  err_code = ptu_tmux_poweramp_enable_set(false);
157  APP_ERROR_CHECK(err_code);
158  err_code = TIMER_START(m_beacon_timer_id,
160  NULL);
161  APP_ERROR_CHECK(err_code);
163  }
164  break;
165 
166  case PTU_BEACON_STATUS_EXTENDED: // Extended Long Beacon end
168  err_code = ptu_tmux_poweramp_enable_set(false);
169  APP_ERROR_CHECK(err_code);
171  m_beacon_timer_handler(NULL); // As we have executed extended beacon, we know that the cycle time has passed anyway, so execute beacon state function
172  break;
173 
174  default:
175  APP_ERROR_HANDLER(NRF_ERROR_INVALID_STATE);
176  break;
177  }
178  }
179 }
182 /******************************************************************************/
185 /******************************************************************************/
186 
188 {
190 }
191 
193 {
194  uint32_t err_code;
195 
196  err_code = app_timer_create(&m_beacon_timer_id, APP_TIMER_MODE_SINGLE_SHOT, m_beacon_timer_handler);
197  APP_ERROR_CHECK(err_code);
198 
199  err_code = app_timer_create(&m_extended_beacon_load_var_timer_id, APP_TIMER_MODE_REPEATED, m_extended_beacon_load_var_handler);
200  APP_ERROR_CHECK(err_code);
201 
202  m_beacon_ctl.period = 0;
204 }
205 
#define PTU_BEACON_DURATION_SHORT_MS
Definition: ptu_config.h:184
uint32_t ptu_sensors_read(void)
Read sensors. This function should typically be called regularly by a timer and can generate events b...
Definition: ptu_sensors.c:303
#define PTU_BEACON_CYCLE_PERIOD_MS
Definition: ptu_config.h:182
#define PTU_POWERAMP_INPUT_BEACON_LONG
Definition: ptu_hw_config.h:60
#define PTU_BEACON_DURATION_LONG_MS
Definition: ptu_config.h:234
bool ptu_sensors_valid_long_beacon_extension_load_variation_found(void)
Check if a valid PTX load variation has occured.
Definition: ptu_sensors.c:417
static void m_beacon_timer_handler(void *context)
Function for controlling beacon behaviour.
Definition: ptu_beacons.c:76
APP_TIMER_DEF(m_beacon_timer_id)
#define PTU_POWERAMP_INPUT_BEACON_SHORT
Definition: ptu_hw_config.h:59
#define PTU_BEACON_CYCLES_LONG
Definition: ptu_config.h:183
uint32_t ptu_tmux_poweramp_enable_set(bool enable)
Test wrapper for ptu_hal_poweramp_enable_set().
Definition: ptu_test_mux.c:69
uint32_t ptu_power_ctrl_set_poweramp_input(uint16_t level)
Perform power control adjustments.
void ptu_beacons_start(void)
Start PTU Beacons.
Definition: ptu_beacons.c:187
static bool long_beacon_extension
Definition: ptu_beacons.c:48
void ptu_dlh_notify_beacon_active(void)
Notify distant list handler that the beacon is now active.
static ptu_beacon_ctl_t m_beacon_ctl
Definition: ptu_beacons.c:45
#define TIMER_START(timer_id, ms, p_ctx)
Definition: wpt.h:32
uint32_t ptu_sensors_data_get(const ptu_sensor_data_t **sensors_data)
Get the latest data read from the PTU sensors.
Definition: ptu_sensors.c:404
void ptu_dlh_notify_beacon_disabled(void)
Notify distant list handler that the beacon is now disabled.
static void m_extended_beacon_load_var_handler(void *p_context)
Handler for extended beacon load variation timer.
Definition: ptu_beacons.c:53
void ptu_sensors_clear_long_beacon_extension_load_variation_buffer(void)
Empty buffer containing load variation sample data for Long Beacon Extension.
Definition: ptu_sensors.c:412
#define PTU_BEACON_DURATION_EXTENDED_MS
Definition: ptu_config.h:235
#define PTU_SM_CURRENT_STATE()
Definition: ptu.h:36
ptu_beacon_status_t
Beacon status.
Definition: ptu_beacons.c:29
#define PTU_POWER_SAVE_LONG_BEACON_PTX_READ_INTERVAL_MS
Definition: ptu_config.h:236
void ptu_beacons_init(void)
Initialize beacons handling.
Definition: ptu_beacons.c:192
Definition of PTU sensor data.
Definition: ptu_hw_config.h:99