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:
Charles Kwon
2026-01-25 17:26:39 +09:00
commit a8ba31871e
2561 changed files with 1594625 additions and 0 deletions

View 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));
}