Files
microchip-application-bmd38…/cpg11_dev_mode.c
T

1364 lines
46 KiB
C

#include "cpg11_dev_mode.h"
#include "tw1508.h"
#include "nrf_gpio.h"
#include "nrf_log.h"
#if (DEF_ELITE_MODEL == DEF_CURRENT_PULSE_GANERATOR_11)
// The GPIO corresponding to the pin
const uint32_t pin_to_gpio_table[] = {
[6] = NRF_GPIO_PIN_MAP(0, 22),
[8] = NRF_GPIO_PIN_MAP(0, 25),
[9] = NRF_GPIO_PIN_MAP(0, 19),
[10] = NRF_GPIO_PIN_MAP(0, 21),
[11] = NRF_GPIO_PIN_MAP(1, 0),
[12] = NRF_GPIO_PIN_MAP(0, 18),
[13] = NRF_GPIO_PIN_MAP(0, 17),
[14] = NRF_GPIO_PIN_MAP(0, 20),
[16] = NRF_GPIO_PIN_MAP(0, 14),
[17] = NRF_GPIO_PIN_MAP(0, 13),
[18] = NRF_GPIO_PIN_MAP(0, 11),
[20] = NRF_GPIO_PIN_MAP(0, 15),
[25] = NRF_GPIO_PIN_MAP(1, 8),
[26] = NRF_GPIO_PIN_MAP(0, 12),
[27] = NRF_GPIO_PIN_MAP(0, 7),
[28] = NRF_GPIO_PIN_MAP(1, 9),
[29] = NRF_GPIO_PIN_MAP(0, 8),
[30] = NRF_GPIO_PIN_MAP(0, 6),
[31] = NRF_GPIO_PIN_MAP(0, 5),
[32] = NRF_GPIO_PIN_MAP(0, 27),
[33] = NRF_GPIO_PIN_MAP(0, 26),
[34] = NRF_GPIO_PIN_MAP(0, 4),
[36] = NRF_GPIO_PIN_MAP(0, 1),
[37] = NRF_GPIO_PIN_MAP(0, 29),
[38] = NRF_GPIO_PIN_MAP(0, 0),
[39] = NRF_GPIO_PIN_MAP(0, 31),
[40] = NRF_GPIO_PIN_MAP(1, 15),
[41] = NRF_GPIO_PIN_MAP(0, 2),
[42] = NRF_GPIO_PIN_MAP(0, 30),
[43] = NRF_GPIO_PIN_MAP(0, 28),
[44] = NRF_GPIO_PIN_MAP(1, 12),
[45] = NRF_GPIO_PIN_MAP(1, 14),
[46] = NRF_GPIO_PIN_MAP(0, 3),
[47] = NRF_GPIO_PIN_MAP(1, 13),
[48] = NRF_GPIO_PIN_MAP(1, 3),
[49] = NRF_GPIO_PIN_MAP(1, 10),
[50] = NRF_GPIO_PIN_MAP(1, 6),
[51] = NRF_GPIO_PIN_MAP(1, 11),
[52] = NRF_GPIO_PIN_MAP(0, 10),
[53] = NRF_GPIO_PIN_MAP(0, 9),
[59] = NRF_GPIO_PIN_MAP(1, 2),
[60] = NRF_GPIO_PIN_MAP(0, 24),
[61] = NRF_GPIO_PIN_MAP(0, 23),
[62] = NRF_GPIO_PIN_MAP(0, 16),
};
#define PULSE_GEN_A_NUMB 2
#define PULSE_GEN_B_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)
{
uint32_t gpio;
switch (pin)
{
case 6:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 16:
case 17:
case 18:
case 20:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 59:
case 60:
case 61:
case 62:
gpio = pin_to_gpio_table[pin];
break;
default:
gpio = UNDEF_GPIO;
NRF_LOG_INFO("UNDEF_GPIO: pin number %02d can't convert to gpio number", pin);
break;
}
return gpio;
}
static void set_bmd380_pin_signal(uint32_t pin, uint32_t high_low)
{
uint32_t gpio = bmd380pins_convert_to_gpio(pin);
if (gpio != UNDEF_GPIO)
{
nrf_gpio_pin_write(gpio, high_low);
NRF_LOG_INFO("set pin number %02d (gpio %02d) = %d", pin, gpio, high_low);
}
}
#define ELECTRODE_A1B1_IDLE 0x09
#define ELECTRODE_A2B2_IDLE 0x0A
#define ELECTRODE_A3B3_IDLE 0x0B
#define ELECTRODE_A4B4_IDLE 0x0C
#define ELECTRODE_ALL_HIGHZ 0x0D
#define ELECTRODE_E1P_ENABLE 0x0E
#define ELECTRODE_E1P_DISABLE 0x0F
#define ELECTRODE_E1N_ENABLE 0x10
#define ELECTRODE_E1N_DISABLE 0x11
#define ELECTRODE_E2P_ENABLE 0x12
#define ELECTRODE_E2P_DISABLE 0x13
#define ELECTRODE_E2N_ENABLE 0x14
#define ELECTRODE_E2N_DISABLE 0x15
#define ELECTRODE_E3P_ENABLE 0x16
#define ELECTRODE_E3P_DISABLE 0x17
#define ELECTRODE_E3N_ENABLE 0x18
#define ELECTRODE_E3N_DISABLE 0x19
#define ELECTRODE_E4P_ENABLE 0x1A
#define ELECTRODE_E4P_DISABLE 0x1B
#define ELECTRODE_E4N_ENABLE 0x1C
#define ELECTRODE_E4N_DISABLE 0x1D
static void cpg11_electrodes(uint32_t electrodes_mode)
{
switch (electrodes_mode)
{
case ELECTRODE_A1B1_IDLE:
NRF_LOG_INFO("ELECTRODE_A1B1_IDLE()");
nrf_gpio_pin_write(VB1L_PIN, 0);
nrf_gpio_pin_write(VB1H_PIN, 1);
nrf_gpio_pin_write(VA1L_PIN, 0);
nrf_gpio_pin_write(VA1H_PIN, 1);
break;
case ELECTRODE_A2B2_IDLE:
NRF_LOG_INFO("ELECTRODE_A2B2_IDLE()");
nrf_gpio_pin_write(VB2L_PIN, 0);
nrf_gpio_pin_write(VB2H_PIN, 1);
nrf_gpio_pin_write(VA2L_PIN, 0);
nrf_gpio_pin_write(VA2H_PIN, 1);
break;
case ELECTRODE_A3B3_IDLE:
NRF_LOG_INFO("ELECTRODE_A3B3_IDLE()");
nrf_gpio_pin_write(VB3L_PIN, 0);
nrf_gpio_pin_write(VB3H_PIN, 1);
nrf_gpio_pin_write(VA3L_PIN, 0);
nrf_gpio_pin_write(VA3H_PIN, 1);
break;
case ELECTRODE_A4B4_IDLE:
NRF_LOG_INFO("ELECTRODE_A4B4_IDLE()");
nrf_gpio_pin_write(VB4L_PIN, 0);
nrf_gpio_pin_write(VB4H_PIN, 1);
nrf_gpio_pin_write(VA4L_PIN, 0);
nrf_gpio_pin_write(VA4H_PIN, 1);
break;
case ELECTRODE_ALL_HIGHZ:
NRF_LOG_INFO("ELECTRODE_ALL_HIGHZ()");
nrf_gpio_pin_write(VB1L_PIN, 0);
nrf_gpio_pin_write(VB1H_PIN, 0);
nrf_gpio_pin_write(VA1L_PIN, 0);
nrf_gpio_pin_write(VA1H_PIN, 0);
nrf_gpio_pin_write(VB2L_PIN, 0);
nrf_gpio_pin_write(VB2H_PIN, 0);
nrf_gpio_pin_write(VA2L_PIN, 0);
nrf_gpio_pin_write(VA2H_PIN, 0);
nrf_gpio_pin_write(VB3L_PIN, 0);
nrf_gpio_pin_write(VB3H_PIN, 0);
nrf_gpio_pin_write(VA3L_PIN, 0);
nrf_gpio_pin_write(VA3H_PIN, 0);
nrf_gpio_pin_write(VB4L_PIN, 0);
nrf_gpio_pin_write(VB4H_PIN, 0);
nrf_gpio_pin_write(VA4L_PIN, 0);
nrf_gpio_pin_write(VA4H_PIN, 0);
break;
case ELECTRODE_E1P_ENABLE:
NRF_LOG_INFO("ELECTRODE_E1P_ENABLE()");
nrf_gpio_pin_write(VB1H_PIN, 0);
nrf_gpio_pin_write(VB1L_PIN, 1);
break;
case ELECTRODE_E1P_DISABLE:
NRF_LOG_INFO("ELECTRODE_E1P_DISABLE()");
nrf_gpio_pin_write(VB1L_PIN, 0);
nrf_gpio_pin_write(VB1H_PIN, 1);
break;
case ELECTRODE_E1N_ENABLE:
NRF_LOG_INFO("ELECTRODE_E1N_ENABLE()");
nrf_gpio_pin_write(VA1H_PIN, 0);
nrf_gpio_pin_write(VA1L_PIN, 1);
break;
case ELECTRODE_E1N_DISABLE:
NRF_LOG_INFO("ELECTRODE_E1N_DISABLE()");
nrf_gpio_pin_write(VA1L_PIN, 0);
nrf_gpio_pin_write(VA1H_PIN, 1);
break;
case ELECTRODE_E2P_ENABLE:
NRF_LOG_INFO("ELECTRODE_E2P_ENABLE()");
nrf_gpio_pin_write(VB2H_PIN, 0);
nrf_gpio_pin_write(VB2L_PIN, 1);
break;
case ELECTRODE_E2P_DISABLE:
NRF_LOG_INFO("ELECTRODE_E2P_DISABLE()");
nrf_gpio_pin_write(VB2L_PIN, 0);
nrf_gpio_pin_write(VB2H_PIN, 1);
break;
case ELECTRODE_E2N_ENABLE:
NRF_LOG_INFO("ELECTRODE_E2N_ENABLE()");
nrf_gpio_pin_write(VA2H_PIN, 0);
nrf_gpio_pin_write(VA2L_PIN, 1);
break;
case ELECTRODE_E2N_DISABLE:
NRF_LOG_INFO("ELECTRODE_E2N_DISABLE()");
nrf_gpio_pin_write(VA2L_PIN, 0);
nrf_gpio_pin_write(VA2H_PIN, 1);
break;
case ELECTRODE_E3P_ENABLE:
NRF_LOG_INFO("ELECTRODE_E3P_ENABLE()");
nrf_gpio_pin_write(VB3H_PIN, 0);
nrf_gpio_pin_write(VB3L_PIN, 1);
break;
case ELECTRODE_E3P_DISABLE:
NRF_LOG_INFO("ELECTRODE_E3P_DISABLE()");
nrf_gpio_pin_write(VB3L_PIN, 0);
nrf_gpio_pin_write(VB3H_PIN, 1);
break;
case ELECTRODE_E3N_ENABLE:
NRF_LOG_INFO("ELECTRODE_E3N_ENABLE()");
nrf_gpio_pin_write(VA3H_PIN, 0);
nrf_gpio_pin_write(VA3L_PIN, 1);
break;
case ELECTRODE_E3N_DISABLE:
NRF_LOG_INFO("ELECTRODE_E3N_DISABLE()");
nrf_gpio_pin_write(VA3L_PIN, 0);
nrf_gpio_pin_write(VA3H_PIN, 1);
break;
case ELECTRODE_E4P_ENABLE:
NRF_LOG_INFO("ELECTRODE_E4P_ENABLE()");
nrf_gpio_pin_write(VB4H_PIN, 0);
nrf_gpio_pin_write(VB4L_PIN, 1);
break;
case ELECTRODE_E4P_DISABLE:
NRF_LOG_INFO("ELECTRODE_E4P_DISABLE()");
nrf_gpio_pin_write(VB4L_PIN, 0);
nrf_gpio_pin_write(VB4H_PIN, 1);
break;
case ELECTRODE_E4N_ENABLE:
NRF_LOG_INFO("ELECTRODE_E4N_ENABLE()");
nrf_gpio_pin_write(VA4H_PIN, 0);
nrf_gpio_pin_write(VA4L_PIN, 1);
break;
case ELECTRODE_E4N_DISABLE:
NRF_LOG_INFO("ELECTRODE_E4N_DISABLE()");
nrf_gpio_pin_write(VA4L_PIN, 0);
nrf_gpio_pin_write(VA4H_PIN, 1);
break;
}
}
void set_cpg_pulse_parameter(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
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 = ins[6] << 24 | ins[7] << 16 | ins[8] << 8 | ins[9];
uint32_t freq_hz = ins[10] << 24 | ins[11] << 16 | ins[12] << 8 | ins[13];
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] = pulse_width_us,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = pulse_width_us,
.point_us[6] = 1,
.idle_us = 0,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[0].idle_us = 1000000 / freq_hz - (pusle_gen[0].point_us[0] + pusle_gen[0].point_us[1] + pusle_gen[0].point_us[2] +
pusle_gen[0].point_us[3] + pusle_gen[0].point_us[4] + pusle_gen[0].point_us[5] +
pusle_gen[0].point_us[6]);
}
NRF_LOG_INFO("[%d]user pulse_width = %u us", 1, pulse_width_us);
NRF_LOG_INFO("[%d]user freq_hz = %u Hz", 1, freq_hz);
NRF_LOG_INFO("[%d]user idle = %u us", 1, pusle_gen[0].idle_us);
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[0].idle_us = (1000000 / freq_hz - (pusle_gen[0].point_us[0] + pusle_gen[0].point_us[1] + pusle_gen[0].point_us[2] +
pusle_gen[0].point_us[3] + pusle_gen[0].point_us[4] + pusle_gen[0].point_us[5] +
pusle_gen[0].point_us[6]) *
2) /
2;
}
NRF_LOG_INFO("[%d]a = %u us", 1, pusle_gen[0].point_us[0]);
NRF_LOG_INFO("[%d]b = %u us", 1, pusle_gen[0].point_us[1]);
NRF_LOG_INFO("[%d]c = %u us", 1, pusle_gen[0].point_us[2]);
NRF_LOG_INFO("[%d]d = %u us", 1, pusle_gen[0].point_us[3]);
NRF_LOG_INFO("[%d]e = %u us", 1, pusle_gen[0].point_us[4]);
NRF_LOG_INFO("[%d]f = %u us", 1, pusle_gen[0].point_us[5]);
NRF_LOG_INFO("[%d]g = %u us", 1, pusle_gen[0].point_us[6]);
NRF_LOG_INFO("[%d]idle = %u us", 1, pusle_gen[0].idle_us);
}
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] = pulse_width_us,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = pulse_width_us,
.point_us[6] = 1,
.idle_us = 0,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[1].idle_us = (1000000 / freq_hz) - (pusle_gen[1].point_us[0] + pusle_gen[1].point_us[1] + pusle_gen[1].point_us[2] +
pusle_gen[1].point_us[3] + pusle_gen[1].point_us[4] + pusle_gen[1].point_us[5] +
pusle_gen[1].point_us[6]);
}
NRF_LOG_INFO("[%d]user pulse_width = %u us", 2, pulse_width_us);
NRF_LOG_INFO("[%d]user freq_hz = %u Hz", 2, freq_hz);
NRF_LOG_INFO("[%d]user idle = %u us", 2, pusle_gen[1].idle_us);
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[1].idle_us = (1000000 / freq_hz - (pusle_gen[1].point_us[0] + pusle_gen[1].point_us[1] + pusle_gen[1].point_us[2] +
pusle_gen[1].point_us[3] + pusle_gen[1].point_us[4] + pusle_gen[1].point_us[5] +
pusle_gen[1].point_us[6]) *
2) /
2;
}
NRF_LOG_INFO("[%d]a = %u us", 2, pusle_gen[1].point_us[0]);
NRF_LOG_INFO("[%d]b = %u us", 2, pusle_gen[1].point_us[1]);
NRF_LOG_INFO("[%d]c = %u us", 2, pusle_gen[1].point_us[2]);
NRF_LOG_INFO("[%d]d = %u us", 2, pusle_gen[1].point_us[3]);
NRF_LOG_INFO("[%d]e = %u us", 2, pusle_gen[1].point_us[4]);
NRF_LOG_INFO("[%d]f = %u us", 2, pusle_gen[1].point_us[5]);
NRF_LOG_INFO("[%d]g = %u us", 2, pusle_gen[1].point_us[6]);
NRF_LOG_INFO("[%d]idle = %u us", 2, pusle_gen[1].idle_us);
}
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] = pulse_width_us,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = pulse_width_us,
.point_us[6] = 1,
.idle_us = 0,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[2].idle_us = 1000000 / freq_hz - (pusle_gen[2].point_us[0] + pusle_gen[2].point_us[1] + pusle_gen[2].point_us[2] +
pusle_gen[2].point_us[3] + pusle_gen[2].point_us[4] + pusle_gen[2].point_us[5] +
pusle_gen[2].point_us[6]);
}
NRF_LOG_INFO("[%d]user pulse_width = %u us", 3, pulse_width_us);
NRF_LOG_INFO("[%d]user freq_hz = %u Hz", 3, freq_hz);
NRF_LOG_INFO("[%d]user idle = %u us", 3, pusle_gen[2].idle_us);
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[2].idle_us = (1000000 / freq_hz - (pusle_gen[2].point_us[0] + pusle_gen[2].point_us[1] + pusle_gen[2].point_us[2] +
pusle_gen[2].point_us[3] + pusle_gen[2].point_us[4] + pusle_gen[2].point_us[5] +
pusle_gen[2].point_us[6]) *
2) /
2;
}
NRF_LOG_INFO("[%d]a = %u us", 3, pusle_gen[2].point_us[0]);
NRF_LOG_INFO("[%d]b = %u us", 3, pusle_gen[2].point_us[1]);
NRF_LOG_INFO("[%d]c = %u us", 3, pusle_gen[2].point_us[2]);
NRF_LOG_INFO("[%d]d = %u us", 3, pusle_gen[2].point_us[3]);
NRF_LOG_INFO("[%d]e = %u us", 3, pusle_gen[2].point_us[4]);
NRF_LOG_INFO("[%d]f = %u us", 3, pusle_gen[2].point_us[5]);
NRF_LOG_INFO("[%d]g = %u us", 3, pusle_gen[2].point_us[6]);
NRF_LOG_INFO("[%d]idle = %u us", 3, pusle_gen[2].idle_us);
}
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] = pulse_width_us,
.point_us[2] = 1,
.point_us[3] = 0,
.point_us[4] = 1,
.point_us[5] = pulse_width_us,
.point_us[6] = 1,
.idle_us = 0,
.pulse_cnt = UINT32_MAX,
.pulse_id = PULSE_ID_NULL,
};
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[3].idle_us = (1000000 / freq_hz) - (pusle_gen[3].point_us[0] + pusle_gen[3].point_us[1] + pusle_gen[3].point_us[2] +
pusle_gen[3].point_us[3] + pusle_gen[3].point_us[4] + pusle_gen[3].point_us[5] +
pusle_gen[3].point_us[6]);
}
NRF_LOG_INFO("[%d]user pulse_width = %u us", 4, pulse_width_us);
NRF_LOG_INFO("[%d]user freq_hz = %u Hz", 4, freq_hz);
NRF_LOG_INFO("[%d]user idle = %u us", 4, pusle_gen[3].idle_us);
if (freq_hz == 0)
{
pusle_gen[0].idle_us = 0;
}
else
{
pusle_gen[3].idle_us = (1000000 / freq_hz - (pusle_gen[3].point_us[0] + pusle_gen[3].point_us[1] + pusle_gen[3].point_us[2] +
pusle_gen[3].point_us[3] + pusle_gen[3].point_us[4] + pusle_gen[3].point_us[5] +
pusle_gen[3].point_us[6]) *
2) /
2;
}
NRF_LOG_INFO("[%d]a = %u us", 4, pusle_gen[3].point_us[0]);
NRF_LOG_INFO("[%d]b = %u us", 4, pusle_gen[3].point_us[1]);
NRF_LOG_INFO("[%d]c = %u us", 4, pusle_gen[3].point_us[2]);
NRF_LOG_INFO("[%d]d = %u us", 4, pusle_gen[3].point_us[3]);
NRF_LOG_INFO("[%d]e = %u us", 4, pusle_gen[3].point_us[4]);
NRF_LOG_INFO("[%d]f = %u us", 4, pusle_gen[3].point_us[5]);
NRF_LOG_INFO("[%d]g = %u us", 4, pusle_gen[3].point_us[6]);
NRF_LOG_INFO("[%d]idle = %u us", 4, pusle_gen[3].idle_us);
}
NRF_LOG_INFO("set ok......");
}
static void start_which_electrodes(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
uint8_t electrodes1_pulse_gen_en = (ins[5] & 0b10000000) >> 7;
uint8_t electrodes2_pulse_gen_en = (ins[5] & 0b01000000) >> 6;
uint8_t electrodes3_pulse_gen_en = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_en = (ins[5] & 0b00010000) >> 4;
uint32_t inum = 0;
inum = 0;
if (electrodes1_pulse_gen_en)
{
p_pusle_genA[inum] = pusle_gen[0];
p_pusle_genA[inum].pulse_id = PULSE_ID_A;
nrf_gpio_pin_clear(p_pusle_genA[inum].VBxL);
nrf_gpio_pin_set(p_pusle_genA[inum].VBxH);
nrf_gpio_pin_clear(p_pusle_genA[inum].VAxL);
nrf_gpio_pin_set(p_pusle_genA[inum].VAxH);
NRF_LOG_INFO("start electrodes1_pulse_gen");
}
else
{
p_pusle_genA[inum].VBxL = 0xFFFFFFFF;
p_pusle_genA[inum].VBxH = 0xFFFFFFFF;
p_pusle_genA[inum].VAxL = 0xFFFFFFFF;
p_pusle_genA[inum].VAxH = 0xFFFFFFFF;
}
inum = 1;
if (electrodes2_pulse_gen_en)
{
p_pusle_genA[inum] = pusle_gen[1];
p_pusle_genA[inum].pulse_id = PULSE_ID_B;
nrf_gpio_pin_clear(p_pusle_genA[inum].VBxL);
nrf_gpio_pin_set(p_pusle_genA[inum].VBxH);
nrf_gpio_pin_clear(p_pusle_genA[inum].VAxL);
nrf_gpio_pin_set(p_pusle_genA[inum].VAxH);
NRF_LOG_INFO("start electrodes2_pulse_gen");
}
else
{
p_pusle_genA[inum].VBxL = 0xFFFFFFFF;
p_pusle_genA[inum].VBxH = 0xFFFFFFFF;
p_pusle_genA[inum].VAxL = 0xFFFFFFFF;
p_pusle_genA[inum].VAxH = 0xFFFFFFFF;
}
if (electrodes1_pulse_gen_en || electrodes2_pulse_gen_en)
{
cpg11_pulse_init(0, &p_pusle_genA[0], 2);
cpg11_pulse_start(0, &p_pusle_genA[0]);
}
inum = 0;
if (electrodes3_pulse_gen_en)
{
p_pusle_genB[inum] = pusle_gen[2];
p_pusle_genB[inum].pulse_id = PULSE_ID_C;
nrf_gpio_pin_clear(p_pusle_genB[inum].VBxL);
nrf_gpio_pin_set(p_pusle_genB[inum].VBxH);
nrf_gpio_pin_clear(p_pusle_genB[inum].VAxL);
nrf_gpio_pin_set(p_pusle_genB[inum].VAxH);
NRF_LOG_INFO("start electrodes3_pulse_gen");
}
else
{
p_pusle_genB[inum].VBxL = 0xFFFFFFFF;
p_pusle_genB[inum].VBxH = 0xFFFFFFFF;
p_pusle_genB[inum].VAxL = 0xFFFFFFFF;
p_pusle_genB[inum].VAxH = 0xFFFFFFFF;
}
inum = 1;
if (electrodes4_pulse_gen_en)
{
p_pusle_genB[inum] = pusle_gen[3];
p_pusle_genB[inum].pulse_id = PULSE_ID_D;
nrf_gpio_pin_clear(p_pusle_genB[inum].VBxL);
nrf_gpio_pin_set(p_pusle_genB[inum].VBxH);
nrf_gpio_pin_clear(p_pusle_genB[inum].VAxL);
nrf_gpio_pin_set(p_pusle_genB[inum].VAxH);
NRF_LOG_INFO("start electrodes4_pulse_gen");
}
else
{
p_pusle_genB[inum].VBxL = 0xFFFFFFFF;
p_pusle_genB[inum].VBxH = 0xFFFFFFFF;
p_pusle_genB[inum].VAxL = 0xFFFFFFFF;
p_pusle_genB[inum].VAxH = 0xFFFFFFFF;
}
if (electrodes3_pulse_gen_en || electrodes4_pulse_gen_en)
{
cpg11_pulse_init(1, &p_pusle_genB[0], 2);
cpg11_pulse_start(1, &p_pusle_genB[0]);
}
for (int i = 0; i < 2; i++)
{
NRF_LOG_INFO("p_pusle_genA[%d]VAxH = %d", i, p_pusle_genA[i].VAxH);
NRF_LOG_INFO("p_pusle_genA[%d]VAxL = %d", i, p_pusle_genA[i].VAxL);
NRF_LOG_INFO("p_pusle_genA[%d]VBxH = %d", i, p_pusle_genA[i].VBxH);
NRF_LOG_INFO("p_pusle_genA[%d]VBxL = %d", i, p_pusle_genA[i].VBxL);
NRF_LOG_INFO("p_pusle_genA[%d]a = %u us", i, p_pusle_genA[i].point_us[0]);
NRF_LOG_INFO("p_pusle_genA[%d]b = %u us", i, p_pusle_genA[i].point_us[1]);
NRF_LOG_INFO("p_pusle_genA[%d]c = %u us", i, p_pusle_genA[i].point_us[2]);
NRF_LOG_INFO("p_pusle_genA[%d]d = %u us", i, p_pusle_genA[i].point_us[3]);
NRF_LOG_INFO("p_pusle_genA[%d]e = %u us", i, p_pusle_genA[i].point_us[4]);
NRF_LOG_INFO("p_pusle_genA[%d]f = %u us", i, p_pusle_genA[i].point_us[5]);
NRF_LOG_INFO("p_pusle_genA[%d]g = %u us", i, p_pusle_genA[i].point_us[6]);
NRF_LOG_INFO("p_pusle_genA[%d]idle = %u us", i, p_pusle_genA[i].idle_us);
NRF_LOG_INFO("p_pusle_genA[%d]pulse_cnt = 0x%08X cnt", i, p_pusle_genA[i].pulse_cnt);
NRF_LOG_INFO("p_pusle_genA[%d]pulse_id = %u", i, p_pusle_genA[i].pulse_id);
}
for (int i = 0; i < 2; i++)
{
NRF_LOG_INFO("p_pusle_genB[%d]VAxH = %d", i, p_pusle_genB[i].VAxH);
NRF_LOG_INFO("p_pusle_genB[%d]VAxL = %d", i, p_pusle_genB[i].VAxL);
NRF_LOG_INFO("p_pusle_genB[%d]VBxH = %d", i, p_pusle_genB[i].VBxH);
NRF_LOG_INFO("p_pusle_genB[%d]VBxL = %d", i, p_pusle_genB[i].VBxL);
NRF_LOG_INFO("p_pusle_genB[%d]a = %u us", i, p_pusle_genB[i].point_us[0]);
NRF_LOG_INFO("p_pusle_genB[%d]b = %u us", i, p_pusle_genB[i].point_us[1]);
NRF_LOG_INFO("p_pusle_genB[%d]c = %u us", i, p_pusle_genB[i].point_us[2]);
NRF_LOG_INFO("p_pusle_genB[%d]d = %u us", i, p_pusle_genB[i].point_us[3]);
NRF_LOG_INFO("p_pusle_genB[%d]e = %u us", i, p_pusle_genB[i].point_us[4]);
NRF_LOG_INFO("p_pusle_genB[%d]f = %u us", i, p_pusle_genB[i].point_us[5]);
NRF_LOG_INFO("p_pusle_genB[%d]g = %u us", i, p_pusle_genB[i].point_us[6]);
NRF_LOG_INFO("p_pusle_genB[%d]idle = %u us", i, p_pusle_genB[i].idle_us);
NRF_LOG_INFO("p_pusle_genB[%d]pulse_cnt = 0x%08X cnt", i, p_pusle_genB[i].pulse_cnt);
NRF_LOG_INFO("p_pusle_genB[%d]pulse_id = %u", i, p_pusle_genB[i].pulse_id);
}
}
static void stop_which_electrodes(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
uint8_t electrodes1_pulse_gen_dis = (ins[5] & 0b10000000) >> 7;
uint8_t electrodes2_pulse_gen_dis = (ins[5] & 0b01000000) >> 6;
uint8_t electrodes3_pulse_gen_dis = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_dis = (ins[5] & 0b00010000) >> 4;
if (electrodes1_pulse_gen_dis || electrodes2_pulse_gen_dis)
{
cpg11_pulse_stop(0);
NRF_LOG_INFO("stop electrodes1_pulse_gen");
NRF_LOG_INFO("stop electrodes2_pulse_gen");
p_pusle_genA[0].pulse_id = PULSE_ID_NULL;
p_pusle_genA[1].pulse_id = PULSE_ID_NULL;
}
if (electrodes3_pulse_gen_dis || electrodes4_pulse_gen_dis)
{
cpg11_pulse_stop(1);
NRF_LOG_INFO("stop electrodes3_pulse_gen");
NRF_LOG_INFO("stop electrodes4_pulse_gen");
p_pusle_genB[0].pulse_id = PULSE_ID_NULL;
p_pusle_genB[1].pulse_id = PULSE_ID_NULL;
}
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 suspend_which_electrodes(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
uint8_t electrodes1_pulse_gen_dis = (ins[5] & 0b10000000) >> 7;
uint8_t electrodes2_pulse_gen_dis = (ins[5] & 0b01000000) >> 6;
uint8_t electrodes3_pulse_gen_dis = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_dis = (ins[5] & 0b00010000) >> 4;
if (electrodes1_pulse_gen_dis)
{
cpg11_pulse_suspend_by_pulse_id(p_pusle_genA[0].pulse_id);
NRF_LOG_INFO("suspend electrodes1_pulse_gen");
}
if (electrodes2_pulse_gen_dis)
{
cpg11_pulse_suspend_by_pulse_id(p_pusle_genA[1].pulse_id);
NRF_LOG_INFO("suspend electrodes2_pulse_gen");
}
if (electrodes3_pulse_gen_dis)
{
cpg11_pulse_suspend_by_pulse_id(p_pusle_genB[0].pulse_id);
NRF_LOG_INFO("suspend electrodes3_pulse_gen");
}
if (electrodes4_pulse_gen_dis)
{
cpg11_pulse_suspend_by_pulse_id(p_pusle_genB[1].pulse_id);
NRF_LOG_INFO("suspend electrodes4_pulse_gen");
}
}
static void resume_which_electrodes(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
uint8_t electrodes1_pulse_gen_dis = (ins[5] & 0b10000000) >> 7;
uint8_t electrodes2_pulse_gen_dis = (ins[5] & 0b01000000) >> 6;
uint8_t electrodes3_pulse_gen_dis = (ins[5] & 0b00100000) >> 5;
uint8_t electrodes4_pulse_gen_dis = (ins[5] & 0b00010000) >> 4;
if (electrodes1_pulse_gen_dis)
{
cpg11_pulse_resume_by_pulse_id(p_pusle_genA[0].pulse_id);
NRF_LOG_INFO("resume electrodes1_pulse_gen");
}
if (electrodes2_pulse_gen_dis)
{
cpg11_pulse_resume_by_pulse_id(p_pusle_genA[1].pulse_id);
NRF_LOG_INFO("resume electrodes2_pulse_gen");
}
if (electrodes3_pulse_gen_dis)
{
cpg11_pulse_resume_by_pulse_id(p_pusle_genB[0].pulse_id);
NRF_LOG_INFO("resume electrodes3_pulse_gen");
}
if (electrodes4_pulse_gen_dis)
{
cpg11_pulse_resume_by_pulse_id(p_pusle_genB[1].pulse_id);
NRF_LOG_INFO("resume electrodes4_pulse_gen");
}
}
static void set_cpg_pulse_cnt(uint8_t *ins)
{
NRF_LOG_INFO("%s", __FUNCTION__);
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];
if (electrodes1_pulse_gen_sel)
{
pusle_gen[0].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[1] pulse_cnt = %u cnt", pusle_gen[0].pulse_cnt);
}
if (electrodes2_pulse_gen_sel)
{
pusle_gen[1].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[2] pulse_cnt = %u cnt", pusle_gen[1].pulse_cnt);
}
if (electrodes3_pulse_gen_sel)
{
pusle_gen[2].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[3] pulse_cnt = %u cnt", pusle_gen[2].pulse_cnt);
}
if (electrodes4_pulse_gen_sel)
{
pusle_gen[3].pulse_cnt = pulse_cnt;
NRF_LOG_INFO("[4] pulse_cnt = %u cnt", pusle_gen[3].pulse_cnt);
}
}
#define TW1508_REXR 1.5 // 1.5kohm
#define TW1508_BOUNDARY_GAIN0 13.3
#define TW1508_BOUNDARY_GAIN1 26.6
#define TW1508_BOUNDARY_GAIN2 39.9
#define TW1508_BOUNDARY_GAIN3 53.3
#define TW1508_BOUNDARY_GAIN4 66.6
#define TW1508_BOUNDARY_GAIN5 79.9
#define TW1508_BOUNDARY_GAIN6 93.3
#define TW1508_BOUNDARY_GAIN7 106.6
uint32_t current_convert_tw1508(float current_mA)
{
uint32_t tw1508_value;
uint32_t dac_7bit;
uint8_t dac_3bit;
float rext;
if (current_mA > TW1508_BOUNDARY_GAIN7)
{
current_mA = TW1508_BOUNDARY_GAIN7;
NRF_LOG_INFO("current is too large");
}
if (current_mA <= TW1508_BOUNDARY_GAIN0)
{
dac_3bit = 0b000;
rext = TW1508_REXR;
}
else if (current_mA <= TW1508_BOUNDARY_GAIN1)
{
dac_3bit = 0b001;
rext = TW1508_REXR;
}
else if (current_mA <= TW1508_BOUNDARY_GAIN2)
{
dac_3bit = 0b010;
rext = TW1508_REXR;
}
else if (current_mA <= TW1508_BOUNDARY_GAIN3)
{
dac_3bit = 0b011;
rext = TW1508_REXR;
}
else if (current_mA <= TW1508_BOUNDARY_GAIN4)
{
dac_3bit = 0b100;
rext = TW1508_REXR;
}
else if (current_mA <= TW1508_BOUNDARY_GAIN5)
{
dac_3bit = 0b101;
rext = TW1508_REXR;
}
else if (current_mA <= TW1508_BOUNDARY_GAIN6)
{
dac_3bit = 0b110;
rext = TW1508_REXR;
}
else if (current_mA <= TW1508_BOUNDARY_GAIN7)
{
dac_3bit = 0b111;
rext = TW1508_REXR;
}
dac_7bit = current_mA * 8 * TW1508_REXR / 1.25 / (dac_3bit + 1);
tw1508_value = dac_3bit << 7 | dac_7bit;
NRF_LOG_INFO("dac_3bit = %u", dac_3bit);
NRF_LOG_INFO("dac_7bit = %u", dac_7bit);
NRF_LOG_INFO("tw1508_value = %u", tw1508_value);
return tw1508_value;
}
/*
dev_mode_set_cpg11_electrodes
(1) 0x3000FF0009
- func: ELECTRODE_A1B1_IDLE
(2) 0x3000FF000A
- func: ELECTRODE_A2B2_IDLE
(3) 0x3000FF000B
- func: ELECTRODE_A3B3_IDLE
(4) 0x3000FF000C
- func: ELECTRODE_A4B4_IDLE
(5) 0x3000FF000D
- func: ELECTRODE_ALL_HIGHZ
(6) 0x3000FF000E
- func: ELECTRODE_E1P_ENABLE (electrode 1 positive)
(7) 0x3000FF000F
- func: ELECTRODE_E1P_DISABLE (electrode 1 positive)
(8) 0x3000FF0010
- func: ELECTRODE_E1N_ENABLE (electrode 1 negative)
(9) 0x3000FF0011
- func: ELECTRODE_E1N_DISABLE (electrode 1 negative)
(10) 0x3000FF0012
- func: ELECTRODE_E2P_ENABLE (electrode 2 positive)
(11) 0x3000FF0013
- func: ELECTRODE_E2P_DISABLE (electrode 2 positive)
(12) 0x3000FF0014
- func: ELECTRODE_E2N_ENABLE (electrode 2 negative)
(13) 0x3000FF0015
- func: ELECTRODE_E2N_DISABLE (electrode 2 negative)
(14) 0x3000FF0016
- func: ELECTRODE_E3P_ENABLE (electrode 3 positive)
(15) 0x3000FF0017
- func: ELECTRODE_E3P_DISABLE (electrode 3 positive)
(16) 0x3000FF0018
- func: ELECTRODE_E3N_ENABLE (electrode 3 negative)
(17) 0x3000FF0019
- func: ELECTRODE_E3N_DISABLE (electrode 3 negative)
(18) 0x3000FF001A
- func: ELECTRODE_E4P_ENABLE (electrode 4 positive)
(19) 0x3000FF001B
- func: ELECTRODE_E4P_DISABLE (electrode 4 positive)
(20) 0x3000FF001C
- func: ELECTRODE_E4N_ENABLE (electrode 4 negative)
(21) 0x3000FF001D
- func: ELECTRODE_E4N_DISABLE (electrode 4 negative)
*/
void dev_mode_set_cpg11_electrodes(uint8_t *ins)
{
struct __PACKED
{
uint8_t id : 4;
uint8_t : 4;
uint16_t magic : 16;
uint8_t dev_opcode;
uint8_t electrodes_opcode;
} *p_ins = (void *)ins;
cpg11_electrodes(p_ins->electrodes_opcode);
}
/*
dev_mode_set_cpg11_tw1508
(1) 0x3000FF0100
- func: tw1508_init() out_0 = 0, out_1 = 0
(2) 0x3000FF0101aaaabbbb
- func: tw1508_set()
- aaaa: out_0 value (0x0000 to 0x03FF [LSB])
- bbbb: out_1 value (0x0000 to 0x03FF [LSB])
(3) 0x3000FF0102aaaaaaaabbbbbbbb
- func: set and output current(mA)(float)
- aaaaaaaa: out_0 current (0x00000000 to 0xFFFFFFFF)
- bbbbbbbb: out_1 current (0x00000000 to 0xFFFFFFFF)
*/
void dev_mode_set_cpg11_tw1508(uint8_t *ins)
{
struct __PACKED
{
uint8_t id : 4;
uint8_t : 4;
uint16_t magic : 16;
uint8_t dev_opcode;
uint8_t tw1508_opcode;
uint8_t param[];
} *p_ins = (void *)ins;
switch (p_ins->tw1508_opcode)
{
case 0x00: {
tw1508_init();
NRF_LOG_INFO("tw1508_init()");
break;
}
case 0x01: {
uint16_t out_0;
uint16_t out_1;
memcpy(&out_0, &p_ins->param[0], sizeof(out_0));
memcpy(&out_1, &p_ins->param[2], sizeof(out_1));
NRF_LOG_INFO("tw1508_set(%d, %d)", out_0, out_1);
tw1508_set(out_0, out_1);
break;
}
case 0x02: {
float out_0_current_mA;
float out_1_current_mA;
uint16_t out_0;
uint16_t out_1;
uint32_t out_0_u32 = (ins[5] << 24) | (ins[6] << 16) | (ins[7] << 8) | (ins[8]);
uint32_t out_1_u32 = (ins[9] << 24) | (ins[10] << 16) | (ins[11] << 8) | (ins[12]);
memcpy(&out_0_current_mA, &out_0_u32, sizeof(out_0_current_mA));
memcpy(&out_1_current_mA, &out_1_u32, sizeof(out_1_current_mA));
{
char str[128];
snprintf(str, sizeof(str), "%s: 0x%08lX, %.3f", "out_0 float", out_0_u32, out_0_current_mA);
NRF_LOG_INFO("%s", str);
}
out_0 = current_convert_tw1508(out_0_current_mA);
{
char str[128];
snprintf(str, sizeof(str), "%s: 0x%08lX, %.3f", "out_1 float", out_1_u32, out_1_current_mA);
NRF_LOG_INFO("%s", str);
}
out_1 = current_convert_tw1508(out_1_current_mA);
NRF_LOG_INFO("tw1508_set(%d, %d)", out_0, out_1);
tw1508_set(out_0, out_1);
break;
}
}
}
void start_electrodes_api(uint8_t *ins)
{
struct __PACKED
{
uint8_t dev_opcode;
uint8_t item_opcode;
uint8_t e1_e2_which_to_set;
uint32_t e1_e2_amplitude_mA;
uint32_t e1_e2_pulse_width_us;
uint32_t e1_e2_freq_hz;
uint8_t e3_e4_which_to_set;
uint32_t e3_e4_amplitude_mA;
uint32_t e3_e4_pulse_width_us;
uint32_t e3_e4_freq_hz;
uint32_t countdown_timer_seconds;
uint8_t enable_which_electrode;
} params;
// parse start_electrodes_api_params
params.e1_e2_which_to_set = ins[5];
params.e1_e2_amplitude_mA = (ins[6] << 24) | (ins[7] << 16) | (ins[8] << 8) | ins[9];
params.e1_e2_pulse_width_us = (ins[10] << 24) | (ins[11] << 16) | (ins[12] << 8) | ins[13];
params.e1_e2_freq_hz = (ins[14] << 24) | (ins[15] << 16) | (ins[16] << 8) | ins[17];
params.e3_e4_which_to_set = ins[18];
params.e3_e4_amplitude_mA = (ins[19] << 24) | (ins[20] << 16) | (ins[21] << 8) | ins[22];
params.e3_e4_pulse_width_us = (ins[23] << 24) | (ins[24] << 16) | (ins[25] << 8) | ins[26];
params.e3_e4_freq_hz = (ins[27] << 24) | (ins[28] << 16) | (ins[29] << 8) | ins[30];
params.countdown_timer_seconds = (ins[31] << 24) | (ins[32] << 16) | (ins[33] << 8) | ins[34];
params.enable_which_electrode = ins[35];
uint8_t ins_temp[14];
ins_temp[0] = 0x30;
ins_temp[1] = 0x00;
ins_temp[2] = 0xFF;
params.dev_opcode = 0x01;
params.item_opcode = 0x02;
ins_temp[3] = params.dev_opcode;
ins_temp[4] = params.item_opcode;
ins_temp[5] = params.e1_e2_amplitude_mA >> 24;
ins_temp[6] = params.e1_e2_amplitude_mA >> 16;
ins_temp[7] = params.e1_e2_amplitude_mA >> 8;
ins_temp[8] = params.e1_e2_amplitude_mA;
ins_temp[9] = params.e3_e4_amplitude_mA >> 24;
ins_temp[10] = params.e3_e4_amplitude_mA >> 16;
ins_temp[11] = params.e3_e4_amplitude_mA >> 8;
ins_temp[12] = params.e3_e4_amplitude_mA;
NRF_LOG_INFO("parse:");
NRF_LOG_HEXDUMP_INFO(ins_temp, 13);
dev_mode_set_cpg11_tw1508(ins_temp);
NRF_LOG_INFO("...........................");
params.dev_opcode = 0x02;
params.item_opcode = 0x01;
ins_temp[3] = params.dev_opcode;
ins_temp[4] = params.item_opcode;
ins_temp[5] = params.e1_e2_which_to_set;
ins_temp[6] = params.e1_e2_pulse_width_us >> 24;
ins_temp[7] = params.e1_e2_pulse_width_us >> 16;
ins_temp[8] = params.e1_e2_pulse_width_us >> 8;
ins_temp[9] = params.e1_e2_pulse_width_us;
ins_temp[10] = params.e1_e2_freq_hz >> 24;
ins_temp[11] = params.e1_e2_freq_hz >> 16;
ins_temp[12] = params.e1_e2_freq_hz >> 8;
ins_temp[13] = params.e1_e2_freq_hz;
NRF_LOG_INFO("parse:");
NRF_LOG_HEXDUMP_INFO(ins_temp, 14);
set_cpg_pulse_parameter(ins_temp);
NRF_LOG_INFO("...........................");
params.dev_opcode = 0x02;
params.item_opcode = 0x01;
ins_temp[3] = params.dev_opcode;
ins_temp[4] = params.item_opcode;
ins_temp[5] = params.e3_e4_which_to_set;
ins_temp[6] = params.e3_e4_pulse_width_us >> 24;
ins_temp[7] = params.e3_e4_pulse_width_us >> 16;
ins_temp[8] = params.e3_e4_pulse_width_us >> 8;
ins_temp[9] = params.e3_e4_pulse_width_us;
ins_temp[10] = params.e3_e4_freq_hz >> 24;
ins_temp[11] = params.e3_e4_freq_hz >> 16;
ins_temp[12] = params.e3_e4_freq_hz >> 8;
ins_temp[13] = params.e3_e4_freq_hz;
NRF_LOG_INFO("parse:");
NRF_LOG_HEXDUMP_INFO(ins_temp, 14);
set_cpg_pulse_parameter(ins_temp);
NRF_LOG_INFO("...........................");
params.dev_opcode = 0xA0;
params.item_opcode = 0x00;
ins_temp[3] = params.dev_opcode;
ins_temp[4] = params.item_opcode;
ins_temp[5] = 0x19;
ins_temp[6] = 0x01;
NRF_LOG_INFO("parse:");
NRF_LOG_HEXDUMP_INFO(ins_temp, 7);
dev_mode_gpio_function(ins_temp);
NRF_LOG_INFO("...........................");
params.dev_opcode = 0x02;
params.item_opcode = 0x03;
ins_temp[3] = params.dev_opcode;
ins_temp[4] = params.item_opcode;
ins_temp[5] = params.enable_which_electrode;
NRF_LOG_INFO("parse:");
NRF_LOG_HEXDUMP_INFO(ins_temp, 6);
start_which_electrodes(ins_temp);
NRF_LOG_INFO("...........................");
}
void stop_electrodes_api(uint8_t *ins)
{
struct __PACKED
{
uint8_t dev_opcode;
uint8_t item_opcode;
uint8_t disable_which_electrode;
} params;
uint8_t ins_temp[14];
ins_temp[0] = 0x30;
ins_temp[1] = 0x00;
ins_temp[2] = 0xFF;
params.dev_opcode = 0x02;
params.item_opcode = 0x04;
params.disable_which_electrode = ins[5];
ins_temp[3] = params.dev_opcode;
ins_temp[4] = params.item_opcode;
ins_temp[5] = params.disable_which_electrode;
NRF_LOG_INFO("parse:");
NRF_LOG_HEXDUMP_INFO(ins_temp, 6);
stop_which_electrodes(ins_temp);
NRF_LOG_INFO("...........................");
params.dev_opcode = 0xA0;
params.item_opcode = 0x00;
ins_temp[3] = params.dev_opcode;
ins_temp[4] = params.item_opcode;
ins_temp[5] = 0x19;
ins_temp[6] = 0x00;
NRF_LOG_INFO("parse:");
NRF_LOG_HEXDUMP_INFO(ins_temp, 7);
dev_mode_gpio_function(ins_temp);
NRF_LOG_INFO("...........................");
}
/*
dev_mode_ctrl_cpg11_electrodes_task
(1) 0x3000FF0201nnwwwwwwwwffffffff
- func: set_cpg_pulse_parameter value
- nn: set which group of electrodes (0x00 to 0xF0)
0x80 = 0b10000000: select electrode 1
0x40 = 0b01000000: select electrode 2
0x20 = 0b00100000: select electrode 3
0x10 = 0b00010000: select electrode 4
......
0xF0 = 0b11110000: select electrode 1~4
- wwwwwwww: pulse_width_us (0x00000000 to 0xFFFFFFFF)
- ffffffff: freq_hz (0x00000000 to 0xFFFFFFFF)
(2) 0x3000FF0202nncccccccc
- func: set_cpg_pulse_cnt
- nn: set which group of electrodes (0x00 to 0xF0)
0x80 = 0b10000000: select electrode 1
0x40 = 0b01000000: select electrode 2
0x20 = 0b00100000: select electrode 3
0x10 = 0b00010000: select electrode 4
......
0xF0 = 0b11110000: select electrode 1~4
- cccccccc: pulse_cnt (0x00000001 to 0xFFFFFFFF)
(3) 0x3000FF0203nn
- func: select which electrode's pulse to enable
- nn: which electrodes (0x00 to 0xF0)
0x80 = 0b10000000: electrode 1 enable pulse
0x40 = 0b01000000: electrode 2 enable pulse
0x20 = 0b00100000: electrode 3 enable pulse
0x10 = 0b00010000: electrode 4 enable pulse
......
0xF0 = 0b11110000: electrode 1~4 enable pulse
(4) 0x3000FF0204nn
- func: select which electrode's pulse to stop
- nn: which electrodes (0x00 to 0xF0)
0x80 = 0b10000000: electrode 1 stops pulsing
0x40 = 0b01000000: electrode 2 stops pulsing
0x20 = 0b00100000: electrode 3 stops pulsing
0x10 = 0b00010000: electrode 4 stops pulsing
......
0xF0 = 0b11110000: electrode 1~4 stops pulsing
(5) 0x3000FF0205nn
- func: select which electrode's pulse to suspend
- nn: which electrodes (0x00 to 0xF0)
0x80 = 0b10000000: electrode 1 suspend pulsing
0x40 = 0b01000000: electrode 2 suspend pulsing
0x20 = 0b00100000: electrode 3 suspend pulsing
0x10 = 0b00010000: electrode 4 suspend pulsing
......
0xF0 = 0b11110000: electrode 1~4 suspend pulsing
(6) 0x3000FF0206nn
- func: select which electrode's pulse to resume
- nn: which electrodes (0x00 to 0xF0)
0x80 = 0b10000000: electrode 1 resume pulsing
0x40 = 0b01000000: electrode 2 resume pulsing
0x20 = 0b00100000: electrode 3 resume pulsing
0x10 = 0b00010000: electrode 4 resume pulsing
......
0xF0 = 0b11110000: electrode 1~4 resume pulsing
*/
void dev_mode_ctrl_cpg11_electrodes_task(uint8_t *ins)
{
struct __PACKED
{
uint8_t id : 4;
uint8_t : 4;
uint16_t magic : 16;
uint8_t dev_opcode;
uint8_t electrodes_task_opcode;
uint8_t param[];
} *p_ins = (void *)ins;
switch (p_ins->electrodes_task_opcode)
{
case 0x01:
set_cpg_pulse_parameter(ins);
break;
case 0x02:
set_cpg_pulse_cnt(ins);
break;
case 0x03:
start_which_electrodes(ins);
break;
case 0x04:
stop_which_electrodes(ins);
break;
case 0x05:
suspend_which_electrodes(ins);
break;
case 0x06:
resume_which_electrodes(ins);
break;
case 0xA0:
start_electrodes_api(ins);
break;
case 0xA1:
stop_electrodes_api(ins);
break;
}
}
/*
dev_mode_gpio_function
(1) 0x3000FFA000ppss
- func: set_bmd380_pin_signal
- pp: pin number (0x06 to 0x3E)
0x06: P0.22_GPIO
0x08: P0.25_GPIO
......
0x3E: P0.16_GPIO
- ss: signal (0x00 or 0x01)
0x00: low
0x01: high
(2) 0x3000FFA001ss
- func: set all BMD380 PINs to high or low (except for HV_EN, SPI, and input GPIOs)
- pin_number[] = {
6, 8, 9, 10, 13, 14, 29, 30, 31, 32, 33, 34, 36, 38, 39,
40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 59, 60, 61
}
- ss: signal (0x00 or 0x01)
0x00: low
0x01: high
*/
void dev_mode_gpio_function(uint8_t *ins)
{
struct __PACKED
{
uint8_t id : 4;
uint8_t : 4;
uint16_t magic : 16;
uint8_t dev_opcode;
uint8_t gpio_function_opcode;
uint8_t param[];
} *p_ins = (void *)ins;
switch (p_ins->gpio_function_opcode)
{
case 0x00: {
uint32_t pin = p_ins->param[0];
uint32_t high_low = p_ins->param[1];
set_bmd380_pin_signal(pin, high_low);
break;
}
case 0x01: {
uint32_t high_low = p_ins->param[0];
uint32_t pin_number[] = { 6, 8, 9, 10, 13, 14, 29, 30, 31, 32, 33, 34, 36, 38, 39, 40, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 59, 60, 61 };
for (int i = 0; i < sizeof(pin_number) / sizeof(pin_number[0]); i++)
{
set_bmd380_pin_signal(pin_number[i], high_low);
}
break;
}
}
}
#endif