fix: cpg_pulse_default_demo & output pulse functions

This commit is contained in:
Roy_01
2024-08-28 17:11:37 +08:00
parent 5bac6e7eab
commit 2ed330dece
2 changed files with 200 additions and 214 deletions
+199 -213
View File
@@ -54,72 +54,12 @@ const uint32_t pin_to_gpio_table[] = {
[62] = NRF_GPIO_PIN_MAP(0, 16),
};
static pusle_gen_t dev_mode_pusle_gen[4] = {
{
.VBxH = VB1H_PIN,
.VBxL = VB1L_PIN,
.VAxH = VA1H_PIN,
.VAxL = VA1L_PIN,
.idle_us = 1000,
.point_us[0] = 1,
.point_us[1] = 250,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 250,
.point_us[6] = 1,
.pulse_cnt = 0xFFFFFFFF,
.pulse_id = PULSE_ID_NULL,
},
{
.VBxH = VB2H_PIN,
.VBxL = VB2L_PIN,
.VAxH = VA2H_PIN,
.VAxL = VA2L_PIN,
.idle_us = 1000,
.point_us[0] = 1,
.point_us[1] = 250,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 250,
.point_us[6] = 1,
.pulse_cnt = 0xFFFFFFFF,
.pulse_id = PULSE_ID_NULL,
},
{
.VBxH = VB3H_PIN,
.VBxL = VB3L_PIN,
.VAxH = VA3H_PIN,
.VAxL = VA3L_PIN,
.idle_us = 1000,
.point_us[0] = 1,
.point_us[1] = 250,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 250,
.point_us[6] = 1,
.pulse_cnt = 0xFFFFFFFF,
.pulse_id = PULSE_ID_NULL,
},
{
.VBxH = VB4H_PIN,
.VBxL = VB4L_PIN,
.VAxH = VA4H_PIN,
.VAxL = VA4L_PIN,
.idle_us = 1000,
.point_us[0] = 1,
.point_us[1] = 250,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 250,
.point_us[6] = 1,
.pulse_cnt = 0xFFFFFFFF,
.pulse_id = PULSE_ID_NULL,
}
};
#define PULSE_GEN_A_NUMB 2
#define PULSE_GEN_B_NUMB 2
uint32_t pusle_genB_numb = 2;
static pusle_gen_t p_pusle_genA[PULSE_GEN_A_NUMB];
static pusle_gen_t p_pusle_genB[PULSE_GEN_B_NUMB];
static pusle_gen_t pusle_gen[PULSE_GEN_A_NUMB+PULSE_GEN_B_NUMB];
static uint32_t bmd380pins_convert_to_gpio(uint32_t pin)
{
@@ -374,38 +314,91 @@ static void cpg11_electrodes(uint32_t electrodes_mode)
static void set_cpg_pulse_parameter(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
uint8_t electrodes_pulse_gen_sel[] = {
(ins[5] & 0b10000000) >> 7,
(ins[5] & 0b01000000) >> 6,
(ins[5] & 0b00100000) >> 5,
(ins[5] & 0b00010000) >> 4
};
uint8_t electrodes1_pulse_gen_sel = (ins[5] & 0b10000000) >> 7;
uint8_t electrodes2_pulse_gen_sel = (ins[5] & 0b01000000) >> 6;
uint8_t electrodes3_pulse_gen_sel = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_sel = (ins[5] & 0b00010000) >> 4;
uint32_t pulse_width_us = (uint32_t)ins[6] << 24 | (uint32_t)ins[7] << 16 | (uint32_t)ins[8] << 8 | (uint32_t)ins[9];
uint32_t freq_hz = (uint32_t)ins[10] << 24 | (uint32_t)ins[11] << 16 | (uint32_t)ins[12] << 8 | (uint32_t)ins[13];
for (int i = 0; i < 4; i++)
{
if (electrodes_pulse_gen_sel[i])
{
dev_mode_pusle_gen[i].point_us[1] = pulse_width_us;
dev_mode_pusle_gen[i].point_us[5] = pulse_width_us;
dev_mode_pusle_gen[i].idle_us = (1000000 / freq_hz) - (dev_mode_pusle_gen[i].point_us[0] +
dev_mode_pusle_gen[i].point_us[1] +
dev_mode_pusle_gen[i].point_us[2] +
dev_mode_pusle_gen[i].point_us[3] +
dev_mode_pusle_gen[i].point_us[4] +
dev_mode_pusle_gen[i].point_us[5] +
dev_mode_pusle_gen[i].point_us[6]);
NRF_LOG_INFO("[%d]a = %d us", i + 1, dev_mode_pusle_gen[0].point_us[0]);
NRF_LOG_INFO("[%d]b = %d us", i + 1, dev_mode_pusle_gen[i].point_us[1]);
NRF_LOG_INFO("[%d]c = %d us", i + 1, dev_mode_pusle_gen[i].point_us[2]);
NRF_LOG_INFO("[%d]d = %d us", i + 1, dev_mode_pusle_gen[i].point_us[3]);
NRF_LOG_INFO("[%d]e = %d us", i + 1, dev_mode_pusle_gen[i].point_us[4]);
NRF_LOG_INFO("[%d]f = %d us", i + 1, dev_mode_pusle_gen[i].point_us[5]);
NRF_LOG_INFO("[%d]g = %d us", i + 1, dev_mode_pusle_gen[i].point_us[6]);
NRF_LOG_INFO("[%d]idle = %d us", i + 1, dev_mode_pusle_gen[i].idle_us);
}
if (electrodes1_pulse_gen_sel) {
pusle_gen[0] = (pusle_gen_t) {
.VBxH = VB1H_PIN,
.VBxL = VB1L_PIN,
.VAxH = VA1H_PIN,
.VAxL = VA1L_PIN,
.point_us[0] = 1,
.point_us[1] = 50,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 50,
.point_us[6] = 1,
.idle_us = 500,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
}
if (electrodes2_pulse_gen_sel) {
pusle_gen[1] = (pusle_gen_t) {
.VBxH = VB2H_PIN,
.VBxL = VB2L_PIN,
.VAxH = VA2H_PIN,
.VAxL = VA2L_PIN,
.point_us[0] = 1,
.point_us[1] = 50,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 50,
.point_us[6] = 1,
.idle_us = 500,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
}
if (electrodes3_pulse_gen_sel) {
pusle_gen[2] = (pusle_gen_t) {
.VBxH = VB3H_PIN,
.VBxL = VB3L_PIN,
.VAxH = VA3H_PIN,
.VAxL = VA3L_PIN,
.point_us[0] = 1,
.point_us[1] = 50,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 50,
.point_us[6] = 1,
.idle_us = 500,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
}
if (electrodes4_pulse_gen_sel) {
pusle_gen[3] = (pusle_gen_t) {
.VBxH = VB4H_PIN,
.VBxL = VB4L_PIN,
.VAxH = VA4H_PIN,
.VAxL = VA4L_PIN,
.point_us[0] = 1,
.point_us[1] = 50,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 50,
.point_us[6] = 1,
.idle_us = 500,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
}
NRF_LOG_INFO("set ok......");
}
static void start_which_electrodes(uint8_t *ins)
@@ -416,63 +409,46 @@ static void start_which_electrodes(uint8_t *ins)
uint8_t electrodes3_pulse_gen_en = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_en = (ins[5] & 0b00010000) >> 4;
bool timer1_IRQ_running = is_pulse_gen_running(0);
bool timer2_IRQ_running = is_pulse_gen_running(1);
NRF_LOG_INFO("timer1_IRQ_running = %d", timer1_IRQ_running);
NRF_LOG_INFO("timer2_IRQ_running = %d", timer2_IRQ_running);
NRF_LOG_INFO("[1] pulse_id = %02X", dev_mode_pusle_gen[0].pulse_id);
NRF_LOG_INFO("[2] pulse_id = %02X", dev_mode_pusle_gen[1].pulse_id);
NRF_LOG_INFO("[3] pulse_id = %02X", dev_mode_pusle_gen[2].pulse_id);
NRF_LOG_INFO("[4] pulse_id = %02X", dev_mode_pusle_gen[3].pulse_id);
if (timer1_IRQ_running && timer2_IRQ_running)
if (electrodes1_pulse_gen_en)
{
NRF_LOG_INFO("TIMER1_IRQ & TIMER2_IRQ are already running, so they cannot generate the waveform for electrodes 1~4");
return;
p_pusle_genA[0] = pusle_gen[0];
p_pusle_genA[0].pulse_id = PULSE_ID_A;
cpg11_pulse_init(0, &p_pusle_genA[0], 1);
cpg11_pulse_start(0, &p_pusle_genA[0]);
NRF_LOG_INFO("start electrodes1_pulse_gen");
}
else if (electrodes2_pulse_gen_en)
{
p_pusle_genA[1] = pusle_gen[1];
p_pusle_genA[1].pulse_id = PULSE_ID_B;
cpg11_pulse_init(0, &p_pusle_genA[1], 1);
cpg11_pulse_start(0, &p_pusle_genA[1]);
NRF_LOG_INFO("start electrodes2_pulse_gen");
}
if (!timer1_IRQ_running)
if (electrodes3_pulse_gen_en)
{
if (electrodes1_pulse_gen_en)
{
dev_mode_pusle_gen[0].pulse_id = PULSE_ID_A;
cpg11_pulse_init(0, &dev_mode_pusle_gen[0], 1);
cpg11_pulse_start(0, &dev_mode_pusle_gen[0]);
NRF_LOG_INFO("start electrodes1_pulse_gen");
}
else if (electrodes2_pulse_gen_en)
{
dev_mode_pusle_gen[1].pulse_id = PULSE_ID_B;
cpg11_pulse_init(0, &dev_mode_pusle_gen[1], 1);
cpg11_pulse_start(0, &dev_mode_pusle_gen[1]);
NRF_LOG_INFO("start electrodes2_pulse_gen");
}
p_pusle_genB[0] = pusle_gen[2];
p_pusle_genB[0].pulse_id = PULSE_ID_C;
cpg11_pulse_init(1, &p_pusle_genB[0], 1);
cpg11_pulse_start(1, &p_pusle_genB[0]);
NRF_LOG_INFO("start electrodes3_pulse_gen");
}
else if (electrodes4_pulse_gen_en)
{
p_pusle_genB[1] = pusle_gen[3];
p_pusle_genB[1].pulse_id = PULSE_ID_D;
cpg11_pulse_init(1, &p_pusle_genB[1], 1);
cpg11_pulse_start(1, &p_pusle_genB[1]);
NRF_LOG_INFO("start electrodes4_pulse_gen");
}
if (!timer2_IRQ_running)
{
if (electrodes3_pulse_gen_en)
{
dev_mode_pusle_gen[2].pulse_id = PULSE_ID_C;
cpg11_pulse_init(1, &dev_mode_pusle_gen[2], 1);
cpg11_pulse_start(1, &dev_mode_pusle_gen[2]);
NRF_LOG_INFO("start electrodes3_pulse_gen");
}
else if (electrodes4_pulse_gen_en)
{
dev_mode_pusle_gen[3].pulse_id = PULSE_ID_D;
cpg11_pulse_init(1, &dev_mode_pusle_gen[3], 1);
cpg11_pulse_start(1, &dev_mode_pusle_gen[3]);
NRF_LOG_INFO("start electrodes4_pulse_gen");
}
for (int i=0; i<2; i++) {
NRF_LOG_INFO("pusle_genA[%d]pulse_id: %d", i, p_pusle_genA[i].pulse_id);
}
for (int i=0; i<2; i++) {
NRF_LOG_INFO("pusle_genB[%d]pulse_id: %d", i, p_pusle_genB[i].pulse_id);
}
NRF_LOG_INFO("after...");
NRF_LOG_INFO("[1] pulse_id = %02X", dev_mode_pusle_gen[0].pulse_id);
NRF_LOG_INFO("[2] pulse_id = %02X", dev_mode_pusle_gen[1].pulse_id);
NRF_LOG_INFO("[3] pulse_id = %02X", dev_mode_pusle_gen[2].pulse_id);
NRF_LOG_INFO("[4] pulse_id = %02X", dev_mode_pusle_gen[3].pulse_id);
}
static void stop_which_electrodes(uint8_t *ins)
@@ -483,111 +459,121 @@ static void stop_which_electrodes(uint8_t *ins)
uint8_t electrodes3_pulse_gen_dis = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_dis = (ins[5] & 0b00010000) >> 4;
bool timer1_IRQ_running = is_pulse_gen_running(0);
bool timer2_IRQ_running = is_pulse_gen_running(1);
NRF_LOG_INFO("timer1_IRQ_running = %d", timer1_IRQ_running);
NRF_LOG_INFO("timer2_IRQ_running = %d", timer2_IRQ_running);
NRF_LOG_INFO("[1] pulse_id = %02X", dev_mode_pusle_gen[0].pulse_id);
NRF_LOG_INFO("[2] pulse_id = %02X", dev_mode_pusle_gen[1].pulse_id);
NRF_LOG_INFO("[3] pulse_id = %02X", dev_mode_pusle_gen[2].pulse_id);
NRF_LOG_INFO("[4] pulse_id = %02X", dev_mode_pusle_gen[3].pulse_id);
if (!timer1_IRQ_running && !timer2_IRQ_running)
{
NRF_LOG_INFO("TIMER1_IRQ and TIMER2_IRQ have already stopped, so they cannot stop the waveform for electrodes 1~4");
return;
}
if (electrodes1_pulse_gen_dis)
{
cpg11_pulse_stop_by_pulse_id(dev_mode_pusle_gen[0].pulse_id);
dev_mode_pusle_gen[0].pulse_id = PULSE_ID_NULL;
cpg11_pulse_stop_by_pulse_id(p_pusle_genA[0].pulse_id);
p_pusle_genA[0].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes1_pulse_gen");
}
if (electrodes2_pulse_gen_dis)
{
cpg11_pulse_stop_by_pulse_id(dev_mode_pusle_gen[1].pulse_id);
dev_mode_pusle_gen[1].pulse_id = PULSE_ID_NULL;
cpg11_pulse_stop_by_pulse_id(p_pusle_genA[1].pulse_id);
p_pusle_genA[1].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes2_pulse_gen");
}
if (electrodes3_pulse_gen_dis)
{
cpg11_pulse_stop_by_pulse_id(dev_mode_pusle_gen[2].pulse_id);
dev_mode_pusle_gen[2].pulse_id = PULSE_ID_NULL;
cpg11_pulse_stop_by_pulse_id(p_pusle_genB[0].pulse_id);
p_pusle_genB[0].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes3_pulse_gen");
}
if (electrodes4_pulse_gen_dis)
{
cpg11_pulse_stop_by_pulse_id(dev_mode_pusle_gen[3].pulse_id);
dev_mode_pusle_gen[3].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes3_pulse_gen");
cpg11_pulse_stop_by_pulse_id(p_pusle_genB[1].pulse_id);
p_pusle_genB[1].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes4_pulse_gen");
}
NRF_LOG_INFO("after");
NRF_LOG_INFO("[1] pulse_id = %02X", dev_mode_pusle_gen[0].pulse_id);
NRF_LOG_INFO("[2] pulse_id = %02X", dev_mode_pusle_gen[1].pulse_id);
NRF_LOG_INFO("[3] pulse_id = %02X", dev_mode_pusle_gen[2].pulse_id);
NRF_LOG_INFO("[4] pulse_id = %02X", dev_mode_pusle_gen[3].pulse_id);
for (int i=0; i<2; i++) {
NRF_LOG_INFO("pusle_genA[%d]pulse_id: %d", i, p_pusle_genA[i].pulse_id);
}
for (int i=0; i<2; i++) {
NRF_LOG_INFO("pusle_genB[%d]pulse_id: %d", i, p_pusle_genB[i].pulse_id);
}
NRF_LOG_INFO("\n\n")
}
static void set_cpg_pulse_cnt(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
uint8_t electrodes_pulse_gen_sel[] = {
(ins[5] & 0b10000000) >> 7,
(ins[5] & 0b01000000) >> 6,
(ins[5] & 0b00100000) >> 5,
(ins[5] & 0b00010000) >> 4
};
uint8_t electrodes1_pulse_gen_sel = (ins[5] & 0b10000000) >> 7;
uint8_t electrodes2_pulse_gen_sel = (ins[5] & 0b01000000) >> 6;
uint8_t electrodes3_pulse_gen_sel = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_sel = (ins[5] & 0b00010000) >> 4;
uint32_t pulse_cnt = (uint32_t)ins[6] << 24 | (uint32_t)ins[7] << 16 | (uint32_t)ins[8] << 8 | (uint32_t)ins[9];
for (int i = 0; i < 4; i++)
if (electrodes1_pulse_gen_sel)
{
if (electrodes_pulse_gen_sel[i])
{
dev_mode_pusle_gen[i].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[%d]pulse_cnt = %d cnt", i + 1, dev_mode_pusle_gen[i].pulse_cnt);
}
p_pusle_genA[0].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[1] pulse_cnt = %d cnt", p_pusle_genA[0].pulse_cnt);
}
if (electrodes2_pulse_gen_sel)
{
p_pusle_genA[1].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[2] pulse_cnt = %d cnt", p_pusle_genA[1].pulse_cnt);
}
if (electrodes3_pulse_gen_sel)
{
p_pusle_genB[0].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[3] pulse_cnt = %d cnt", p_pusle_genB[0].pulse_cnt);
}
if (electrodes1_pulse_gen_sel)
{
p_pusle_genB[1].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[4] pulse_cnt = %d cnt", p_pusle_genB[1].pulse_cnt);
}
}
void cpg_pulse_default_demo(void)
{
NRF_LOG_INFO("%s", __FUNCTION__);
bool timer1_IRQ_running = is_pulse_gen_running(0);
bool timer2_IRQ_running = is_pulse_gen_running(1);
pusle_gen_t pusle_gen_demo[PULSE_GEN_A_NUMB+PULSE_GEN_B_NUMB];
NRF_LOG_INFO("timer1_IRQ_running = %d", timer1_IRQ_running);
NRF_LOG_INFO("timer2_IRQ_running = %d", timer2_IRQ_running);
cpg11_pulse_stop_by_pulse_id(p_pusle_genA[0].pulse_id);
p_pusle_genA[0].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes1_pulse_gen");
if (timer1_IRQ_running || timer2_IRQ_running)
{
NRF_LOG_INFO("please stop running pulse");
return;
}
cpg11_pulse_stop_by_pulse_id(p_pusle_genA[1].pulse_id);
p_pusle_genA[1].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes2_pulse_gen");
dev_mode_pusle_gen[2].VBxH = VB3H_PIN;
dev_mode_pusle_gen[2].VBxL = VB3L_PIN;
dev_mode_pusle_gen[2].VAxH = VA3H_PIN;
dev_mode_pusle_gen[2].VAxL = VA3L_PIN;
dev_mode_pusle_gen[2].idle_us = 1000;
dev_mode_pusle_gen[2].point_us[0] = 1;
dev_mode_pusle_gen[2].point_us[1] = 250;
dev_mode_pusle_gen[2].point_us[2] = 1;
dev_mode_pusle_gen[2].point_us[3] = 0;
dev_mode_pusle_gen[2].point_us[4] = 1;
dev_mode_pusle_gen[2].point_us[5] = 250;
dev_mode_pusle_gen[2].point_us[6] = 1;
dev_mode_pusle_gen[2].pulse_cnt = 0xFFFFFFFF;
dev_mode_pusle_gen[2].pulse_id = PULSE_ID_B;
cpg11_pulse_stop_by_pulse_id(p_pusle_genB[0].pulse_id);
p_pusle_genB[0].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes3_pulse_gen");
cpg11_pulse_init(0, &dev_mode_pusle_gen[2], 1);
cpg11_pulse_start(0, &dev_mode_pusle_gen[2]);
NRF_LOG_INFO("cpg_pulse_default_demo: start electrodes3_pulse_gen");
cpg11_pulse_stop_by_pulse_id(p_pusle_genB[1].pulse_id);
p_pusle_genB[1].pulse_id = PULSE_ID_NULL;
NRF_LOG_INFO("stop electrodes4_pulse_gen");
pusle_gen_demo[2] = (pusle_gen_t) {
.VBxH = VB3H_PIN,
.VBxL = VB3L_PIN,
.VAxH = VA3H_PIN,
.VAxL = VA3L_PIN,
.point_us[0] = 1,
.point_us[1] = 250,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = 250,
.point_us[6] = 1,
.idle_us = 1000,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
p_pusle_genB[0] = pusle_gen_demo[2];
p_pusle_genB[0].pulse_id = PULSE_ID_C;
cpg11_pulse_init(1, &p_pusle_genB[0], 1);
cpg11_pulse_start(1, &p_pusle_genB[0]);
NRF_LOG_INFO("start electrodes3_pulse_gen");
}
/*
+1 -1
View File
@@ -407,7 +407,7 @@ void cpg11_io_init(void)
sd_nvic_SetPriority(pusle_gen_hw[i].IRQn, _PRIO_APP_HIGH);
}
cpg_pulse_default_demo_ext();
//cpg_pulse_default_demo_ext();
}
#endif