Pre/Post?Mid trigger added

master
erikkaashoek 5 years ago
parent 5901b61126
commit 7024300315

@ -805,6 +805,7 @@ typedef struct setting
int fast_speedup;
float normalize_level; // Level to set normalize to, zero if not doing anything
int modulation_frequency;
int trigger_mode;
uint32_t checksum;
}setting_t;
@ -1064,6 +1065,7 @@ typedef int16_t pureRSSI_t;
// External programm zero level settings (need decrease on this value -)
#define EXT_ZERO_LEVEL (128)
#define DEVICE_TO_PURE_RSSI(rssi) ((rssi)<<4)
#define PURE_TO_DEVICE_RSSI(rssi) ((rssi)>>4)
#define float_TO_PURE_RSSI(rssi) ((rssi)*32)
#define PURE_TO_float(rssi) ((rssi)/32.0)
@ -1097,6 +1099,7 @@ enum {
};
enum {
T_AUTO, T_NORMAL, T_SINGLE, T_DONE, T_UP, T_DOWN
T_AUTO, T_NORMAL, T_SINGLE, T_DONE, T_UP, T_DOWN, T_MODE, T_PRE, T_POST, T_MID
};
/*EOF*/

@ -117,6 +117,7 @@ void reset_settings(int m)
setting.offset = 0.0;
setting.trigger = T_AUTO;
setting.trigger_direction = T_UP;
setting.trigger_mode = T_MID;
setting.fast_speedup = 0;
setting.level_sweep = 0.0;
setting.level = -15.0;
@ -912,7 +913,9 @@ void set_trigger_level(float trigger_level)
void set_trigger(int trigger)
{
if (trigger == T_UP || trigger == T_DOWN){
if (trigger == T_PRE || trigger == T_POST || trigger == T_MID) {
setting.trigger_mode = trigger;
} else if (trigger == T_UP || trigger == T_DOWN){
setting.trigger_direction = trigger;
} else if (trigger == T_DONE) {
pause_sweep(); // Trigger once so pause after this sweep has completed!!!!!!!
@ -1906,6 +1909,11 @@ modulation_again:
#define T_LEVEL_CLEAN ~(1<<T_POINTS) // cleanup old trigger data
if (i == 0 && setting.frequency_step == 0 && setting.trigger != T_AUTO) { // if in zero span mode and wait for trigger to happen and NOT in trigger mode
#if 1
volatile uint8_t trigger_lvl = PURE_TO_DEVICE_RSSI((int16_t)((float_TO_PURE_RSSI(setting.trigger_level) - correct_RSSI - correct_RSSI_freq)));
SI4432_trigger_fill(MODE_SELECT(setting.mode), trigger_lvl, (setting.trigger_direction == T_UP), setting.trigger_mode);
#else
register uint16_t t_mode;
pureRSSI_t trigger_lvl;
uint16_t data_level = T_LEVEL_UNDEF;
@ -1942,13 +1950,16 @@ modulation_again:
SI4432_Fill(MODE_SELECT(setting.mode), 1); // fast mode possible to pre-fill RSSI buffer
}
#endif
#endif
#endif
if (setting.trigger == T_SINGLE) {
set_trigger(T_DONE);
}
start_of_sweep_timestamp = chVTGetSystemTimeX();
}
else {
//else
{
#ifdef __SI4432__
pureRSSI = SI4432_RSSI(lf, MODE_SELECT(setting.mode)); // Get RSSI, either from pre-filled buffer
#endif
@ -2121,7 +2132,7 @@ sweep_again: // stay in sweep loop when output mo
}
#endif
if (scandirty || setting.average == AV_OFF) { // Level calculations
age[i] = 0;
if (setting.average == AV_MAX_DECAY) age[i] = 0;
actual_t[i] = RSSI;
} else {
switch(setting.average) {

@ -415,6 +415,7 @@ int SI4432_step_delay = 1500;
#ifdef __FAST_SWEEP__
extern deviceRSSI_t age[POINTS_COUNT];
static int buf_index = 0;
static int buf_end = 0;
static bool buf_read = false;
#if 0
@ -424,6 +425,106 @@ int SI4432_is_fast_mode(void)
}
#endif
//--------------------------- Trigger -------------------
// ************** trigger mode if need
// trigger on measure 4 point
#define T_POINTS 4
#define T_LEVEL_UNDEF (1<<(16-T_POINTS)) // should drop after 4 shifts left
#define T_LEVEL_BELOW 1
#define T_LEVEL_ABOVE 0
// Trigger mask, should have width T_POINTS bit
#define T_DOWN_MASK (0b0011) // 2 from up 2 to bottom
#define T_UP_MASK (0b1100) // 2 from bottom 2 to up
#define T_LEVEL_CLEAN ~(1<<T_POINTS) // cleanup old trigger data
enum { ST_ARMING, ST_WAITING, ST_FILLING };
void SI4432_trigger_fill(int s, uint8_t trigger_lvl, int up_direction, int trigger_mode)
{
SI4432_Sel = s;
uint8_t rssi;
uint16_t sel = SI_nSEL[SI4432_Sel];
uint32_t t = setting.additional_step_delay_us;
systime_t measure = chVTGetSystemTimeX();
int waiting = ST_ARMING;
// __disable_irq();
SPI2_CLK_LOW;
int i = 0;
register uint16_t t_mode;
uint16_t data_level = T_LEVEL_UNDEF;
if (up_direction)
t_mode = T_UP_MASK;
else
t_mode = T_DOWN_MASK;
do {
palClearPad(GPIOC, sel);
shiftOut(SI4432_REG_RSSI);
if (operation_requested) // allow aborting a wait for trigger
return; // abort
// Store data level bitfield (remember only last 2 states)
// T_LEVEL_UNDEF mode bit drop after 2 shifts
rssi = shiftIn();
palSetPad(GPIOC, sel);
age[i] = rssi;
switch (waiting) {
case ST_ARMING:
if (i == sweep_points-1) {
waiting = ST_WAITING;
setting.measure_sweep_time_us = (chVTGetSystemTimeX() - measure)*100;
}
break;
case ST_WAITING:
#if 1
if (rssi < trigger_lvl) {
data_level = ((data_level<<1) | (T_LEVEL_BELOW))&(T_LEVEL_CLEAN);
} else {
data_level = ((data_level<<1) | (T_LEVEL_ABOVE))&(T_LEVEL_CLEAN);
}
#else
data_level = ((data_level<<1) | (rssi < trigger_lvl ? T_LEVEL_BELOW : T_LEVEL_ABOVE))&(T_LEVEL_CLEAN);
#endif
if (data_level == t_mode) { // wait trigger
// if (i == 128) { // wait trigger
waiting = ST_FILLING;
switch (trigger_mode) {
case T_PRE: // Trigger at the begin of the scan
buf_index = i - 1;
if (buf_index < 0)
buf_index += sweep_points;
break;
case T_POST: // Trigger at the end of the scan
buf_index = i;
if (buf_index >= sweep_points)
buf_index -= sweep_points;
goto store;
break;
case T_MID: // Trigger in the middle of the scan
buf_index = i + sweep_points/2;
if (buf_index >= sweep_points)
buf_index -= sweep_points;
break;
}
}
break;
case ST_FILLING:
store:
if (i == buf_index)
goto done;
}
i++;
if (i >= sweep_points)
i = 0;
if (t)
my_microsecond_delay(t);
}while(1);
done:
buf_end = buf_index;
buf_read = true;
}
void SI4432_Fill(int s, int start)
{
SI4432_Sel = s;
@ -440,7 +541,7 @@ void SI4432_Fill(int s, int start)
uint32_t t = setting.additional_step_delay_us;
systime_t measure = chVTGetSystemTimeX();
// __disable_irq();
#if 0
#if 1
SPI2_CLK_LOW;
int i = start;
do {
@ -458,6 +559,7 @@ void SI4432_Fill(int s, int start)
// __enable_irq();
setting.measure_sweep_time_us = (chVTGetSystemTimeX() - measure)*100;
buf_index = start; // Is used to skip 1st entry during level triggering
buf_end = sweep_points - 1;
buf_read = true;
}
#endif
@ -483,9 +585,12 @@ pureRSSI_t SI4432_RSSI(uint32_t i, int s)
//START_PROFILE
#ifdef __FAST_SWEEP__
if (buf_read) {
if (buf_index == sweep_points-1)
pureRSSI_t val = DEVICE_TO_PURE_RSSI(age[buf_index++]);
if (buf_index >= sweep_points)
buf_index = 0;
if (buf_index == buf_end)
buf_read = false;
return DEVICE_TO_PURE_RSSI(age[buf_index++]);
return val;
}
#endif
SI4432_Sel = s;

@ -137,6 +137,7 @@ extern const int SI4432_RBW_count;
void set_calibration_freq(int freq);
#ifdef __FAST_SWEEP__
void SI4432_Fill(int s, int start);
void SI4432_trigger_fill(int s, uint8_t trigger_lvl, int up_direction, int trigger_mode);
#if 0
int SI4432_is_fast_mode(void);
#endif

@ -1125,20 +1125,33 @@ static UI_FUNCTION_ADV_CALLBACK(menu_scale_per_acb)
}
#endif
const char *mode_text[] = {"PRE","POST","MID"};
static UI_FUNCTION_ADV_CALLBACK(menu_trigger_acb)
{
(void)item;
if(b){
if (data == T_UP || data == T_DOWN)
if (data == T_MODE) {
b->param_1.text = mode_text[setting.trigger_mode - T_PRE];
} else if (data == T_UP || data == T_DOWN)
b->icon = setting.trigger_direction == data ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP;
else
b->icon = setting.trigger == data ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP;
return;
}
if (data == T_MODE) {
setting.trigger_mode += 1;
if (setting.trigger_mode > T_MID)
setting.trigger_mode = T_PRE;
data = setting.trigger_mode;
goto done;
} else
if (data != T_DONE) {
done:
set_trigger(data);
// menu_move_back();
ui_mode_normal();
draw_menu();
completed = true;
}
}
@ -1856,6 +1869,7 @@ static const menuitem_t menu_trigger[] = {
{ MT_KEYPAD, KM_TRIGGER, "TRIGGER\nLEVEL", NULL},
{ MT_ADV_CALLBACK, T_UP, "UP\nEDGE", menu_trigger_acb},
{ MT_ADV_CALLBACK, T_DOWN, "DOWN\nEDGE", menu_trigger_acb},
{ MT_ADV_CALLBACK, T_MODE, "%s\nTRIGGER", menu_trigger_acb},
{ MT_CANCEL, 0, S_LARROW" BACK", NULL },
{ MT_NONE, 0, NULL, NULL } // sentinel
};

Loading…
Cancel
Save

Powered by TurnKey Linux.