Initial commit: MT firmware project
- BLE peripheral applications - dr_piezo and bladder_patch projects Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
305
project/ble_peripheral/ble_app_bladder_patch/power_control.c
Normal file
305
project/ble_peripheral/ble_app_bladder_patch/power_control.c
Normal file
@@ -0,0 +1,305 @@
|
||||
/*******************************************************************************
|
||||
TEST medi50 Dec 23
|
||||
//=========power_control.c====================
|
||||
******************************************************************************/
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "main.h"
|
||||
#include "power_control.h"
|
||||
#include "nrf_delay.h"
|
||||
#include "measurements.h"
|
||||
|
||||
#include "meas_pd_voltage_simple.h"
|
||||
|
||||
//#include "inv_imu_driver.h"
|
||||
//#include "app_raw_main.h"
|
||||
#include "mcp4725_i2c.h"
|
||||
#include "ada2200_spi.h"
|
||||
#include "ad5272_i2c.h"
|
||||
#include "nrf_log.h"
|
||||
#include "app_timer.h"
|
||||
#include "debug_print.h"
|
||||
#include "cat_interface.h"
|
||||
#include "i2c_manager.h"
|
||||
#define IR_POWER_HOLD NRF_GPIO_PIN_MAP(0, 11)
|
||||
//#define RCV_POWER_HOLD NRF_GPIO_PIN_MAP(1, 9)
|
||||
#define EEP_WP NRF_GPIO_PIN_MAP(0, 24)
|
||||
APP_TIMER_DEF(m_power_timer_id);
|
||||
|
||||
//#define POWER_LOOP_INTERVAL 30
|
||||
|
||||
// 2025-12-08 change to #define POWER_LOOP_INTERVAL 30 -> 20
|
||||
#define POWER_LOOP_INTERVAL 20
|
||||
|
||||
|
||||
|
||||
|
||||
static uint8_t p_order;
|
||||
extern uint8_t simple_samples_in_buffer;
|
||||
extern volatile bool processing;
|
||||
bool lock_check = false;
|
||||
void power_gpio_init(void)
|
||||
{
|
||||
nrf_gpio_cfg_output(IR_POWER_HOLD);
|
||||
//nrf_gpio_cfg_output(RCV_POWER_HOLD);
|
||||
nrf_gpio_cfg_output(EEP_WP);
|
||||
}
|
||||
|
||||
|
||||
void ir_power_control(on_off_cont_t ir_power_st)
|
||||
{
|
||||
if(ir_power_st == OFF) {
|
||||
nrf_gpio_pin_clear(IR_POWER_HOLD);
|
||||
}else if(ir_power_st == ON){
|
||||
nrf_gpio_pin_set(IR_POWER_HOLD);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void eeprom_control(on_off_cont_t eeprom_st)
|
||||
{
|
||||
if(eeprom_st == OFF) {
|
||||
nrf_gpio_pin_clear(EEP_WP);
|
||||
}else if(eeprom_st == ON){
|
||||
nrf_gpio_pin_set(EEP_WP);
|
||||
}
|
||||
}
|
||||
|
||||
//void rcv_power_control(on_off_cont_t rcv_power_st)
|
||||
//{
|
||||
// if(rcv_power_st == OFF) {
|
||||
// nrf_gpio_pin_clear(RCV_POWER_HOLD);
|
||||
// }else if(rcv_power_st == ON){
|
||||
// nrf_gpio_pin_set(RCV_POWER_HOLD);
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
int device_sleep_mode(void){
|
||||
int rc = 0;
|
||||
eeprom_control(OFF);
|
||||
mcp4725_PowerDownMode();
|
||||
|
||||
nrf_delay_ms(2);
|
||||
ada2200_stop();
|
||||
nrf_delay_ms(2);
|
||||
// ada2200_uninit();
|
||||
|
||||
nrf_delay_ms(2);
|
||||
|
||||
nrf_delay_ms(2);
|
||||
// ad5272_i2c_uninit();
|
||||
|
||||
nrf_delay_ms(2);
|
||||
// rcv_power_control(OFF);
|
||||
nrf_delay_ms(2);
|
||||
ir_power_control(OFF);
|
||||
nrf_delay_ms(2);
|
||||
DBG_PRINTF("Device_Sleep_Mode OK!\r\n");
|
||||
if(rc == 0) {
|
||||
// DBG_PRINTF("Device_Sleep_Mode OK!\r\n");
|
||||
} else {
|
||||
DBG_PRINTF("ERR!!! Device_Sleep_Mode Failed!\r\n");
|
||||
}
|
||||
|
||||
nrf_delay_ms(10);
|
||||
processing = false;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
int device_activated(void){
|
||||
int rc = 0;
|
||||
p_order = 0;
|
||||
lock_check =true;
|
||||
power_timer_start();
|
||||
eeprom_control(OFF);
|
||||
// nrf_delay_ms(1);
|
||||
// ir_power_control(ON);
|
||||
// nrf_delay_ms(1);
|
||||
// rcv_power_control(ON);
|
||||
|
||||
// // nrf_delay_ms(5);
|
||||
//// ada2200_start();
|
||||
// nrf_delay_ms(100);
|
||||
// ada2200_init();
|
||||
// nrf_delay_ms(50);
|
||||
// mcp4725_init();
|
||||
// nrf_delay_ms(50);
|
||||
// ad5272_i2c_init();
|
||||
// nrf_delay_ms(50);
|
||||
// mcp4725_powerOnWakeUp();
|
||||
//
|
||||
// nrf_delay_ms(10);
|
||||
//
|
||||
//
|
||||
// ad5272_normal_mode();
|
||||
// nrf_delay_ms(50);
|
||||
// ada2200_start();
|
||||
|
||||
|
||||
|
||||
|
||||
// if( rc == 0) {
|
||||
// DBG_PRINTF("Device_Activate_Mode OK!\r\n");
|
||||
// } else {
|
||||
// DBG_PRINTF("ERR!!! Device_Activated Failed!\r\n");
|
||||
// }
|
||||
// nrf_delay_ms(1000);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Power-up sequence state machine
|
||||
*
|
||||
* Executes hardware initialization in 9 steps (case 0-8)
|
||||
* Called by app_timer at POWER_LOOP_INTERVAL (20ms)
|
||||
*
|
||||
* Sequence:
|
||||
* 0: LED off, IR power on
|
||||
* 1: (reserved)
|
||||
* 2: I2C init
|
||||
* 3: (reserved)
|
||||
* 4: DAC wake-up
|
||||
* 5: LED-PD modulation set
|
||||
* 6: ADA2200 lock-in amp start
|
||||
* 7: PD channel select
|
||||
* 8: Complete
|
||||
*/
|
||||
void power_loop(void *p_context)
|
||||
{
|
||||
UNUSED_PARAMETER(p_context);
|
||||
|
||||
power_timer_stop();
|
||||
|
||||
#if DEBUG_MINIMAL_BOOT
|
||||
/* Minimal Boot: Skip sensor initialization */
|
||||
DBG_PRINTF("[PWR] Minimal mode - skipping sensor init\r\n");
|
||||
p_order = 8; // Jump to complete
|
||||
#else
|
||||
/* Full Boot: Execute power sequence */
|
||||
switch (p_order) {
|
||||
/* Step 0: Power On */
|
||||
case 0:
|
||||
LED_ALLOFF();
|
||||
ir_power_control(ON);
|
||||
nrf_delay_ms(20);
|
||||
DBG_PRINTF("[PWR] Step %d: IR Power ON\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 1: Reserved */
|
||||
case 1:
|
||||
DBG_PRINTF("[PWR] Step %d: (reserved)\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 2: I2C Initialize */
|
||||
case 2:
|
||||
sw_i2c_init_once();
|
||||
nrf_delay_ms(10);
|
||||
DBG_PRINTF("[PWR] Step %d: I2C Init\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 3: Reserved */
|
||||
case 3:
|
||||
DBG_PRINTF("[PWR] Step %d: (reserved)\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 4: DAC Wake-up */
|
||||
case 4:
|
||||
nrf_delay_ms(10);
|
||||
mcp4725_powerOnWakeUp();
|
||||
nrf_delay_ms(20);
|
||||
DBG_PRINTF("[PWR] Step %d: MCP4725 Wake-up\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 5: LED-PD Modulation Set */
|
||||
case 5:
|
||||
led_pd_mod_set(1000);
|
||||
nrf_delay_ms(10);
|
||||
led_pd_mod_set(1000);
|
||||
nrf_delay_ms(10);
|
||||
DBG_PRINTF("[PWR] Step %d: LED-PD Mod Set (1000)\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 6: ADA2200 Lock-in Amplifier Start */
|
||||
case 6:
|
||||
ada2200_start();
|
||||
nrf_delay_ms(100);
|
||||
DBG_PRINTF("[PWR] Step %d: ADA2200 Start\r\n", p_order);
|
||||
break;
|
||||
|
||||
/* Step 7: PD Channel Select */
|
||||
case 7:
|
||||
if (NRF_SUCCESS == pd_on(2)) {
|
||||
DBG_PRINTF("[PWR] Step %d: PD Channel ON\r\n", p_order);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Step 8: Complete */
|
||||
case 8:
|
||||
DBG_PRINTF("[PWR] Step %d: Sequence Complete\r\n", p_order);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Advance to next step or finish */
|
||||
if (p_order < 8) {
|
||||
p_order++;
|
||||
power_timer_start();
|
||||
} else {
|
||||
DBG_PRINTF("[PWR] Device Activated OK!\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int device_reactivated(void){
|
||||
|
||||
int rc = 0;
|
||||
sw_i2c_init_once();
|
||||
mcp4725_PowerDownMode();
|
||||
DBG_PRINTF("LOCKIN!!\r\n");
|
||||
nrf_delay_ms(10);
|
||||
ada2200_stop();
|
||||
|
||||
|
||||
nrf_delay_ms(10);
|
||||
|
||||
ir_power_control(OFF);
|
||||
nrf_delay_ms(10);
|
||||
lock_check = true;
|
||||
p_order = 0;
|
||||
power_timer_start();
|
||||
return rc;
|
||||
}
|
||||
|
||||
void power_timer_start(void)
|
||||
{
|
||||
APP_ERROR_CHECK(app_timer_start(m_power_timer_id, APP_TIMER_TICKS(POWER_LOOP_INTERVAL), NULL));
|
||||
}
|
||||
|
||||
|
||||
void power_timer_stop(void)
|
||||
{
|
||||
APP_ERROR_CHECK(app_timer_stop(m_power_timer_id));
|
||||
|
||||
}
|
||||
|
||||
|
||||
void power_timer_init(void) //active start
|
||||
{
|
||||
APP_ERROR_CHECK(app_timer_create(&m_power_timer_id, APP_TIMER_MODE_SINGLE_SHOT, power_loop));
|
||||
|
||||
// 2025-12-08 change to APP_TIMER_MODE_REPEATED mode
|
||||
//APP_ERROR_CHECK(app_timer_create(&m_power_timer_id, APP_TIMER_MODE_REPEATED, power_loop));
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user