Implemented SPI decoding.

merge-requests/1/head
Teuniz 2016-12-08 17:48:26 +01:00
rodzic 8993906034
commit 151de99792
6 zmienionych plików z 587 dodań i 174 usunięć

Wyświetl plik

@ -152,7 +152,10 @@ UI_decoder_window::UI_decoder_window(QWidget *w_parent)
spi_cs_src_combobox->addItem("Ch. 3");
spi_cs_src_combobox->addItem("Ch. 4");
}
if(devparms->math_decode_spi_mode)
{
spi_cs_src_combobox->setCurrentIndex(devparms->math_decode_spi_cs);
}
threshold_4_label = new QLabel(this);
threshold_4_label->setGeometry(270, 147, 100, 25);
@ -226,6 +229,7 @@ UI_decoder_window::UI_decoder_window(QWidget *w_parent)
spi_polarity_combobox->setGeometry(130, 265, 100, 25);
spi_polarity_combobox->addItem("Negative");
spi_polarity_combobox->addItem("Positive");
spi_polarity_combobox->setCurrentIndex(devparms->math_decode_spi_pol);
spi_edge_label = new QLabel(tab_spi);
spi_edge_label->setGeometry(10, 300, 100, 25);
@ -689,22 +693,22 @@ void UI_decoder_window::spi_select_combobox_clicked(int idx)
{
if(idx == 0)
{
mainwindow->set_cue_cmd(":BUS1:SPI:SS:POL NCS");
mainwindow->set_cue_cmd(":BUS1:SPI:SS:POL NEG");
}
else
{
mainwindow->set_cue_cmd(":BUS1:SPI:SS:POL CS");
mainwindow->set_cue_cmd(":BUS1:SPI:SS:POL POS");
}
}
else
{
if(idx == 0)
{
mainwindow->set_cue_cmd(":DEC1:SPI:SEL NEG");
mainwindow->set_cue_cmd(":DEC1:SPI:SEL NCS");
}
else
{
mainwindow->set_cue_cmd(":DEC1:SPI:SEL POS");
mainwindow->set_cue_cmd(":DEC1:SPI:SEL CS");
}
}
}
@ -712,6 +716,8 @@ void UI_decoder_window::spi_select_combobox_clicked(int idx)
void UI_decoder_window::spi_mode_combobox_clicked(int idx)
{
char str[256];
devparms->math_decode_spi_mode = idx;
if(devparms->modelserie != 6)
@ -719,10 +725,21 @@ void UI_decoder_window::spi_mode_combobox_clicked(int idx)
if(idx == 0)
{
mainwindow->set_cue_cmd(":DEC1:SPI:MODE TIM");
spi_cs_src_combobox->setCurrentIndex(0);
devparms->math_decode_spi_cs = 0;
}
else
{
mainwindow->set_cue_cmd(":DEC1:SPI:MODE CS");
if(spi_cs_src_combobox->currentIndex() > 0)
{
sprintf(str, ":DEC1:SPI:CS CHAN%i", spi_cs_src_combobox->currentIndex());
mainwindow->set_cue_cmd(str);
}
}
}
}
@ -749,11 +766,11 @@ void UI_decoder_window::spi_polarity_combobox_clicked(int idx)
{
if(idx == 0)
{
mainwindow->set_cue_cmd(":DEC1:SPI:EDGE NEG");
mainwindow->set_cue_cmd(":DEC1:SPI:POL NEG");
}
else
{
mainwindow->set_cue_cmd(":DEC1:SPI:EDGE POS");
mainwindow->set_cue_cmd(":DEC1:SPI:POL POS");
}
}
}
@ -778,11 +795,11 @@ void UI_decoder_window::spi_edge_combobox_clicked(int idx)
{
if(idx == 0)
{
mainwindow->set_cue_cmd(":DEC1:SPI:EDGE NEG");
mainwindow->set_cue_cmd(":DEC1:SPI:EDGE FALL");
}
else
{
mainwindow->set_cue_cmd(":DEC1:SPI:EDGE POS");
mainwindow->set_cue_cmd(":DEC1:SPI:EDGE RISE");
}
}
}
@ -1083,6 +1100,8 @@ void UI_decoder_window::src_combobox_clicked(int)
devparms->math_decode_spi_cs = spi_cs_src_combobox->currentIndex();
devparms->math_decode_uart_tx = uart_tx_src_combobox->currentIndex();
devparms->math_decode_uart_rx = uart_rx_src_combobox->currentIndex();
devparms->math_decode_spi_mode = spi_mode_combobox->currentIndex();
devparms->math_decode_spi_select = spi_select_combobox->currentIndex();
threshold_auto_clicked(devparms->math_decode_threshold_auto);
}
@ -1266,6 +1285,18 @@ void UI_decoder_window::threshold_auto_clicked(int thr_auto)
}
}
if(devparms->modelserie != 6)
{
if(spi_mode_combobox->currentIndex() == 0)
{
mainwindow->set_cue_cmd(":DEC1:SPI:MODE TIM");
}
else
{
mainwindow->set_cue_cmd(":DEC1:SPI:MODE CS");
}
}
if(spi_cs_src_combobox->currentIndex() > 0)
{
if(devparms->modelserie == 6)
@ -1275,21 +1306,46 @@ void UI_decoder_window::threshold_auto_clicked(int thr_auto)
mainwindow->set_cue_cmd(str);
}
else
{
if(devparms->math_decode_spi_mode)
{
sprintf(str, ":DEC1:SPI:CS CHAN%i", spi_cs_src_combobox->currentIndex());
mainwindow->set_cue_cmd(str);
}
}
}
else
{
if(devparms->modelserie == 6)
{
mainwindow->set_cue_cmd(":BUS1:SPI:SS:SOUR OFF");
}
}
if(spi_select_combobox->currentIndex() == 0)
{
if(devparms->modelserie == 6)
{
mainwindow->set_cue_cmd(":BUS1:SPI:SS:POL NEG");
}
else
{
mainwindow->set_cue_cmd(":DEC1:SPI:SS OFF");
if(devparms->math_decode_spi_mode)
{
mainwindow->set_cue_cmd(":DEC1:SPI:SEL NCS");
}
}
}
else
{
if(devparms->modelserie == 6)
{
mainwindow->set_cue_cmd(":BUS1:SPI:SS:POL POS");
}
else
{
mainwindow->set_cue_cmd(":DEC1:SPI:SEL CS");
}
}

Wyświetl plik

@ -35,7 +35,7 @@
#define PROGRAM_NAME "DSRemote"
#define PROGRAM_VERSION "0.33_1612062050"
#define PROGRAM_VERSION "0.33_1612081745"
#define MAX_PATHLEN 4096
@ -206,10 +206,10 @@ struct device_settings
int math_decode_spi_end; // endian, 0=lsb, 1=msb
int math_decode_spi_width; // databits, 8-32
int math_decode_spi_mosi_nval; // number of decoded characters
unsigned char math_decode_spi_mosi_val[DECODE_MAX_CHARS]; // array with decoded characters
unsigned int math_decode_spi_mosi_val[DECODE_MAX_CHARS]; // array with decoded characters
int math_decode_spi_mosi_val_pos[DECODE_MAX_CHARS]; // array with position of the decoded characters
int math_decode_spi_miso_nval; // number of decoded characters
unsigned char math_decode_spi_miso_val[DECODE_MAX_CHARS]; // array with decoded characters
unsigned int math_decode_spi_miso_val[DECODE_MAX_CHARS]; // array with decoded characters
int math_decode_spi_miso_val_pos[DECODE_MAX_CHARS]; // array with position of the decoded characters
int math_decode_uart_tx; // channel (0=off)

Wyświetl plik

@ -237,7 +237,8 @@ private:
void get_device_model(const char *);
double get_stepsize_divide_by_1000(double);
void serial_decoder(void);
inline unsigned char reverse_bitorder(unsigned char);
inline unsigned char reverse_bitorder_8(unsigned char);
inline unsigned int reverse_bitorder_32(unsigned int);
private slots:

Wyświetl plik

@ -2504,6 +2504,40 @@ void read_settings_thread::run()
devparms->math_decode_spi_width = atoi(device->buf);
usleep(TMC_GDS_DELAY);
if(devparms->modelserie == 6)
{
if(tmc_write(":BUS1:SPI:END?") != 14)
{
line = __LINE__;
goto GDS_OUT_ERROR;
}
}
else
{
if(tmc_write(":DEC1:SPI:END?") != 14)
{
line = __LINE__;
goto GDS_OUT_ERROR;
}
}
if(tmc_read() < 1)
{
line = __LINE__;
goto GDS_OUT_ERROR;
}
if(!strcmp(device->buf, "LSB"))
{
devparms->math_decode_spi_end = 0;
}
else if(!strcmp(device->buf, "MSB"))
{
devparms->math_decode_spi_end = 1;
}
err_num = 0;
return;

Wyświetl plik

@ -63,20 +63,24 @@ void UI_Mainwindow::serial_decoder(void)
uart_tx_start,
uart_tx_data_bit,
uart_rx_start,
uart_rx_data_bit;
// spi_mosi_start,
// spi_data_mosi_bit,
// spi_miso_start,
// spi_data_miso_bit;
uart_rx_data_bit,
spi_data_mosi_bit,
spi_data_miso_bit,
spi_mosi_bit0_pos=0,
spi_miso_bit0_pos=0,
spi_clk_new,
spi_clk_old,
spi_chars=1;
unsigned int val=0;
unsigned int uart_val=0,
spi_mosi_val=0,
spi_miso_val=0;
short s_max, s_min;
double uart_sample_per_bit,
uart_tx_x_pos,
uart_rx_x_pos,
// spi_clk_x_pos,
bit_per_volt;
devparms.math_decode_uart_tx_nval = 0;
@ -312,7 +316,7 @@ void UI_Mainwindow::serial_decoder(void)
{
uart_tx_start = 1;
val = 0;
uart_val = 0;
uart_tx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -328,7 +332,7 @@ void UI_Mainwindow::serial_decoder(void)
{
uart_tx_start = 1;
val = 0;
uart_val = 0;
uart_tx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -347,7 +351,7 @@ void UI_Mainwindow::serial_decoder(void)
{
uart_tx_start = 1;
val = 0;
uart_val = 0;
uart_tx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -363,7 +367,7 @@ void UI_Mainwindow::serial_decoder(void)
{
uart_tx_start = 1;
val = 0;
uart_val = 0;
uart_tx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -379,14 +383,14 @@ void UI_Mainwindow::serial_decoder(void)
{
if(devparms.wavebuf[devparms.math_decode_uart_tx - 1][i] >= devparms.math_decode_threshold_uart_tx)
{
val += (1 << uart_tx_data_bit);
uart_val += (1 << uart_tx_data_bit);
}
}
else // modelserie = 1, 2 or 4
{
if(devparms.wavebuf[devparms.math_decode_uart_tx - 1][i] >= threshold[devparms.math_decode_uart_tx - 1])
{
val += (1 << uart_tx_data_bit);
uart_val += (1 << uart_tx_data_bit);
}
}
@ -394,17 +398,17 @@ void UI_Mainwindow::serial_decoder(void)
{
if((devparms.math_decode_uart_end) && (devparms.math_decode_format != 4)) // big endian?
{
val = reverse_bitorder(val);
uart_val = reverse_bitorder_8(uart_val);
val >>= (8 - uart_tx_data_bit);
uart_val >>= (8 - uart_tx_data_bit);
}
if(!devparms.math_decode_uart_pol) // positive, line level RS-232 or negative, cpu level TTL/CMOS?
{
val = ~val;
uart_val = ~uart_val;
}
devparms.math_decode_uart_tx_val[devparms.math_decode_uart_tx_nval] = val;
devparms.math_decode_uart_tx_val[devparms.math_decode_uart_tx_nval] =uart_val;
devparms.math_decode_uart_tx_val_pos[devparms.math_decode_uart_tx_nval++] = i - (uart_tx_data_bit * uart_sample_per_bit);
@ -465,7 +469,7 @@ void UI_Mainwindow::serial_decoder(void)
uart_rx_start = 1;
val = 0;
uart_val = 0;
uart_rx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -481,7 +485,7 @@ void UI_Mainwindow::serial_decoder(void)
{
uart_rx_start = 1;
val = 0;
uart_val = 0;
uart_rx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -501,7 +505,7 @@ void UI_Mainwindow::serial_decoder(void)
uart_rx_start = 1;
val = 0;
uart_val = 0;
uart_rx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -517,7 +521,7 @@ void UI_Mainwindow::serial_decoder(void)
{
uart_rx_start = 1;
val = 0;
uart_val = 0;
uart_rx_x_pos = (uart_sample_per_bit * 1.5) + i;
@ -533,14 +537,14 @@ void UI_Mainwindow::serial_decoder(void)
{
if(devparms.wavebuf[devparms.math_decode_uart_rx - 1][i] >= devparms.math_decode_threshold_uart_rx)
{
val += (1 << uart_rx_data_bit);
uart_val += (1 << uart_rx_data_bit);
}
}
else // modelserie = 1, 2 or 4
{
if(devparms.wavebuf[devparms.math_decode_uart_rx - 1][i] >= threshold[devparms.math_decode_uart_rx - 1])
{
val += (1 << uart_rx_data_bit);
uart_val += (1 << uart_rx_data_bit);
}
}
@ -548,17 +552,17 @@ void UI_Mainwindow::serial_decoder(void)
{
if((devparms.math_decode_uart_end) && (devparms.math_decode_format != 4)) // big endian?
{
val = reverse_bitorder(val);
uart_val = reverse_bitorder_8(uart_val);
val >>= (8 - uart_rx_data_bit);
uart_val >>= (8 - uart_rx_data_bit);
}
if(!devparms.math_decode_uart_pol) // positive, line level RS-232 or negative, cpu level TTL/CMOS?
{
val = ~val;
uart_val = ~uart_val;
}
devparms.math_decode_uart_rx_val[devparms.math_decode_uart_rx_nval] = val;
devparms.math_decode_uart_rx_val[devparms.math_decode_uart_rx_nval] =uart_val;
devparms.math_decode_uart_rx_val_pos[devparms.math_decode_uart_rx_nval++] = i - (uart_rx_data_bit * uart_sample_per_bit);
@ -596,144 +600,246 @@ void UI_Mainwindow::serial_decoder(void)
}
}
// if(devparms.math_decode_mode == DECODE_MODE_SPI)
// {
// devparms.math_decode_spi_mosi_nval = 0;
//
// devparms.math_decode_spi_miso_nval = 0;
//
// spi_mosi_start = 0;
//
// spi_data_mosi_bit = 0;
//
// spi_clk_x_pos = 1;
//
// spi_miso_start = 0;
//
// spi_data_miso_bit = 0;
//
// if(devparms.math_decode_spi_mosi)
// {
// if(devparms.chandisplay[devparms.math_decode_spi_mosi - 1]) // don't try to decode if channel isn't enabled...
// {
// for(i=1; i<devparms.wavebufsz; i++)
// {
// if(devparms.math_decode_spi_mosi_nval >= DECODE_MAX_CHARS)
// {
// break;
// }
//
// if(!spi_mosi_start)
// {
// if(devparms.math_decode_uart_pol)
// {
// if(devparms.wavebuf[devparms.math_decode_spi_mosi - 1][i-1] >= threshold[devparms.math_decode_spi_mosi - 1])
// {
// if(devparms.wavebuf[devparms.math_decode_spi_mosi - 1][i] < threshold[devparms.math_decode_spi_mosi - 1])
// {
// spi_mosi_start = 1;
//
// val = 0;
//
// spi_clk_x_pos = (uart_sample_per_bit * 1.5) + i;
//
// i = spi_clk_x_pos - 1;
// }
// }
// }
// else
// {
// if(devparms.wavebuf[devparms.math_decode_spi_mosi - 1][i-1] < threshold[devparms.math_decode_spi_mosi - 1])
// {
// if(devparms.wavebuf[devparms.math_decode_spi_mosi - 1][i] >= threshold[devparms.math_decode_spi_mosi - 1])
// {
// spi_mosi_start = 1;
//
// val = 0;
//
// spi_clk_x_pos = (uart_sample_per_bit * 1.5) + i;
//
// i = spi_clk_x_pos - 1;
// }
// }
// }
// }
// else
// {
// if(devparms.math_decode_uart_pol)
// {
// if(devparms.wavebuf[devparms.math_decode_spi_mosi - 1][i] >= threshold[devparms.math_decode_spi_mosi - 1])
// {
// val += (1 << spi_data_mosi_bit);
// }
// }
// else
// {
// if(devparms.wavebuf[devparms.math_decode_spi_mosi - 1][i] < threshold[devparms.math_decode_spi_mosi - 1])
// {
// val += (1 << spi_data_mosi_bit);
// }
// }
//
// if(++spi_data_mosi_bit == devparms.math_decode_uart_width)
// {
// if((devparms.math_decode_uart_end) && (devparms.math_decode_format != 4)) // little endian?
// {
// val = reverse_bitorder(val);
//
// val >>= (8 - spi_data_mosi_bit);
// }
//
// devparms.math_decode_spi_mosi_val[devparms.math_decode_spi_mosi_nval] = val;
//
// devparms.math_decode_spi_mosi_val_pos[devparms.math_decode_spi_mosi_nval++] = i - (spi_data_mosi_bit * uart_sample_per_bit);
//
// spi_data_mosi_bit = 0;
//
// spi_mosi_start = 0;
//
// spi_clk_x_pos += uart_sample_per_bit;
//
// if(devparms.math_decode_uart_stop == 1)
// {
// spi_clk_x_pos += uart_sample_per_bit / 2;
// }
// else if(devparms.math_decode_uart_stop == 2)
// {
// spi_clk_x_pos += uart_sample_per_bit;
// }
//
// if(devparms.math_decode_uart_par)
// {
// spi_clk_x_pos += uart_sample_per_bit;
// }
//
// i = spi_clk_x_pos - 1;
// }
// else
// {
// spi_clk_x_pos += uart_sample_per_bit;
//
// i = spi_clk_x_pos - 1;
// }
// }
// }
// }
// }
// }
if(devparms.math_decode_mode == DECODE_MODE_SPI)
{
devparms.math_decode_spi_mosi_nval = 0;
devparms.math_decode_spi_miso_nval = 0;
spi_data_mosi_bit = 0;
spi_data_miso_bit = 0;
spi_mosi_val = 0;
spi_miso_val = 0;
if(devparms.math_decode_spi_width > 24)
{
spi_chars = 4;
}
else if(devparms.math_decode_spi_width > 16)
{
spi_chars = 3;
}
else if(devparms.math_decode_spi_width > 8)
{
spi_chars = 2;
}
else
{
spi_chars = 1;
}
if(devparms.math_decode_spi_edge) // sample at rising edge of spi clock?
{
spi_clk_old = 1;
}
else
{
spi_clk_old = 0;
}
if(!devparms.chandisplay[devparms.math_decode_spi_clk]) // without a clock we can't do much...
{
goto SPI_DECODE_OUT;
}
if(devparms.math_decode_spi_mode) // use chip select line?
{
if(devparms.math_decode_spi_cs) // is chip select channel selected?
{
if(!devparms.chandisplay[devparms.math_decode_spi_cs]) // is selected channel for CS enabled?
{
goto SPI_DECODE_OUT;
}
}
else
{
goto SPI_DECODE_OUT;
}
}
else
{
// FIXME use time out
}
for(i=0; i<devparms.wavebufsz; i++)
{
if(devparms.math_decode_spi_mosi_nval >= DECODE_MAX_CHARS)
{
break;
}
if(devparms.math_decode_spi_mode) // use chip select line?
{
if(devparms.math_decode_spi_select) // use positive chip select?
{
if(devparms.wavebuf[devparms.math_decode_spi_cs - 1][i] < threshold[devparms.math_decode_spi_cs - 1])
{
spi_data_mosi_bit = 0;
spi_data_miso_bit = 0;
continue; // chip select is not active
}
}
else // use negative chip select?
{
if(devparms.wavebuf[devparms.math_decode_spi_cs - 1][1] >= threshold[devparms.math_decode_spi_cs - 1])
{
spi_data_mosi_bit = 0;
spi_data_miso_bit = 0;
continue; // chip select is not active
}
}
}
if(devparms.wavebuf[devparms.math_decode_spi_clk][i] >= threshold[devparms.math_decode_spi_clk])
{
spi_clk_new = 1;
}
else
{
spi_clk_new = 0;
}
if(spi_clk_old == spi_clk_new)
{
continue; // no clock change
}
if(devparms.math_decode_spi_edge != spi_clk_new) // wrong clock edge?
{
spi_clk_old = spi_clk_new;
continue;
}
spi_clk_old = spi_clk_new;
if(devparms.math_decode_spi_mosi)
{
if(devparms.chandisplay[devparms.math_decode_spi_mosi - 1]) // don't try to decode if channel isn't enabled...
{
if(devparms.wavebuf[devparms.math_decode_spi_mosi - 1][i] >= threshold[devparms.math_decode_spi_mosi - 1])
{
spi_mosi_val += (1 << spi_data_mosi_bit);
}
if(!spi_data_mosi_bit) spi_mosi_bit0_pos = i;
if(++spi_data_mosi_bit == devparms.math_decode_spi_width)
{
if((devparms.math_decode_spi_end) && (devparms.math_decode_format != 4)) // big endian?
{
spi_mosi_val = reverse_bitorder_32(spi_mosi_val);
spi_mosi_val >>= (32 - spi_data_mosi_bit);
}
if(!devparms.math_decode_spi_pol)
{
spi_mosi_val = ~spi_mosi_val;
switch(spi_chars)
{
case 1: spi_mosi_val &= 0xff;
break;
case 2: spi_mosi_val &= 0xffff;
break;
case 3: spi_mosi_val &= 0xffffff;
break;
}
}
devparms.math_decode_spi_mosi_val[devparms.math_decode_spi_mosi_nval] = spi_mosi_val;
devparms.math_decode_spi_mosi_val_pos[devparms.math_decode_spi_mosi_nval++] = spi_mosi_bit0_pos;
spi_data_mosi_bit = 0;
spi_mosi_val = 0;
}
}
}
if(devparms.math_decode_spi_miso)
{
if(devparms.chandisplay[devparms.math_decode_spi_miso - 1]) // don't try to decode if channel isn't enabled...
{
if(devparms.wavebuf[devparms.math_decode_spi_miso - 1][i] >= threshold[devparms.math_decode_spi_miso - 1])
{
spi_miso_val += (1 << spi_data_miso_bit);
}
if(!spi_data_miso_bit) spi_miso_bit0_pos = i;
if(++spi_data_miso_bit == devparms.math_decode_spi_width)
{
if((devparms.math_decode_spi_end) && (devparms.math_decode_format != 4)) // big endian?
{
spi_miso_val = reverse_bitorder_32(spi_miso_val);
spi_miso_val >>= (32 - spi_data_miso_bit);
}
if(!devparms.math_decode_spi_pol)
{
spi_miso_val = ~spi_miso_val;
}
devparms.math_decode_spi_miso_val[devparms.math_decode_spi_miso_nval] = spi_miso_val;
devparms.math_decode_spi_miso_val_pos[devparms.math_decode_spi_miso_nval++] = spi_miso_bit0_pos;
spi_data_miso_bit = 0;
spi_miso_val = 0;
}
}
}
}
SPI_DECODE_OUT:
i = 0; // FIXME
}
}
inline unsigned char UI_Mainwindow::reverse_bitorder(unsigned char byte)
inline unsigned char UI_Mainwindow::reverse_bitorder_8(unsigned char byte)
{
byte = (byte & 0xF0) >> 4 | (byte & 0x0F) << 4;
byte = (byte & 0xCC) >> 2 | (byte & 0x33) << 2;
byte = (byte & 0xAA) >> 1 | (byte & 0x55) << 1;
byte = (byte & 0xf0) >> 4 | (byte & 0x0f) << 4;
byte = (byte & 0xcc) >> 2 | (byte & 0x33) << 2;
byte = (byte & 0xaa) >> 1 | (byte & 0x55) << 1;
return byte;
}
inline unsigned int UI_Mainwindow::reverse_bitorder_32(unsigned int val)
{
val = (val & 0xffff0000) >> 16 | (val & 0x0000ffff) << 16;
val = (val & 0xff00ff00) >> 8 | (val & 0x00ff00ff) << 8;
val = (val & 0xf0f0f0f0) >> 4 | (val & 0x0f0f0f0f) << 4;
val = (val & 0xcccccccc) >> 2 | (val & 0x33333333) << 2;
val = (val & 0xaaaaaaaa) >> 1 | (val & 0x55555555) << 1;
return val;
}

Wyświetl plik

@ -2255,11 +2255,14 @@ bool SignalCurve::hasMoveEvent(void)
void SignalCurve::draw_decoder(QPainter *painter, int dw, int dh)
{
int i, j,
int i, j, k,
cell_width,
base_line,
line_h_uart_tx=0,
line_h_uart_rx=0;
line_h_uart_rx=0,
line_h_spi_mosi=0,
line_h_spi_miso=0,
spi_chars=1;
double pix_per_smpl;
@ -2462,6 +2465,219 @@ void SignalCurve::draw_decoder(QPainter *painter, int dw, int dh)
}
}
}
if(devparms->math_decode_mode == DECODE_MODE_SPI)
{
painter->setPen(Qt::green);
if(devparms->math_decode_spi_width > 24)
{
spi_chars = 4;
}
else if(devparms->math_decode_spi_width > 16)
{
spi_chars = 3;
}
else if(devparms->math_decode_spi_width > 8)
{
spi_chars = 2;
}
else
{
spi_chars = 1;
}
cell_width *= spi_chars;
if(devparms->math_decode_spi_mosi && devparms->math_decode_spi_miso)
{
line_h_spi_mosi = base_line - 5;
line_h_spi_miso = base_line + 45;
painter->drawLine(0, line_h_spi_mosi, dw, line_h_spi_mosi);
painter->drawLine(0, line_h_spi_miso, dw, line_h_spi_miso);
}
else if(devparms->math_decode_spi_mosi)
{
line_h_spi_mosi = base_line;
painter->drawLine(0, line_h_spi_mosi, dw, line_h_spi_mosi);
}
else if(devparms->math_decode_spi_miso)
{
line_h_spi_miso = base_line;
painter->drawLine(0, line_h_spi_miso, dw, line_h_spi_miso);
}
if(devparms->math_decode_spi_mosi)
{
for(i=0; i<devparms->math_decode_spi_mosi_nval; i++)
{
painter->fillRect(devparms->math_decode_spi_mosi_val_pos[i] * pix_per_smpl, line_h_spi_mosi - 13, cell_width, 26, Qt::black);
painter->drawRect(devparms->math_decode_spi_mosi_val_pos[i] * pix_per_smpl, line_h_spi_mosi - 13, cell_width, 26);
}
}
if(devparms->math_decode_spi_miso)
{
for(i=0; i<devparms->math_decode_spi_miso_nval; i++)
{
painter->fillRect(devparms->math_decode_spi_miso_val_pos[i] * pix_per_smpl, line_h_spi_miso - 13, cell_width, 26, Qt::black);
painter->drawRect(devparms->math_decode_spi_miso_val_pos[i] * pix_per_smpl, line_h_spi_miso - 13, cell_width, 26);
}
}
painter->setPen(Qt::white);
if(devparms->math_decode_spi_mosi)
{
painter->drawText(5, line_h_spi_mosi - 35, 40, 30, Qt::AlignCenter, "MOSI");
for(i=0; i<devparms->math_decode_spi_mosi_nval; i++)
{
if(devparms->math_decode_format == 0) // hex
{
switch(spi_chars)
{
case 1: sprintf(str, "0x%02X", devparms->math_decode_spi_mosi_val[i]);
break;
case 2: sprintf(str, "0x%04X", devparms->math_decode_spi_mosi_val[i]);
break;
case 3: sprintf(str, "0x%06X", devparms->math_decode_spi_mosi_val[i]);
break;
case 4: sprintf(str, "0x%08X", devparms->math_decode_spi_mosi_val[i]);
break;
}
painter->drawText(devparms->math_decode_spi_mosi_val_pos[i] * pix_per_smpl, line_h_spi_mosi - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 1) // ASCII
{
for(k=0; k<spi_chars; k++)
{
str[k]= devparms->math_decode_spi_mosi_val[i] >> (k * 8);
if((str[k] < 33) || (str[k] > 126))
{
str[k] = '.';
}
}
str[k] = 0;
painter->drawText(devparms->math_decode_spi_mosi_val_pos[i] * pix_per_smpl, line_h_spi_mosi - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 2) // decimal
{
sprintf(str, "%u", devparms->math_decode_spi_mosi_val[i]);
painter->drawText(devparms->math_decode_spi_mosi_val_pos[i] * pix_per_smpl, line_h_spi_mosi - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 3) // binary
{
str[0] = '0';
str[1] = 'b';
for(j=0; j<devparms->math_decode_spi_width; j++)
{
str[devparms->math_decode_spi_width + 1 - j] = ((devparms->math_decode_spi_mosi_val[i] >> j) & 1) + '0';
}
str[j + 2] = 0;
painter->drawText(devparms->math_decode_spi_mosi_val_pos[i] * pix_per_smpl, line_h_spi_mosi - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 4) // line
{
for(j=0; j<devparms->math_decode_spi_width; j++)
{
str[j] = ((devparms->math_decode_spi_mosi_val[i] >> j) & 1) + '0';
}
str[devparms->math_decode_spi_width] = 0;
painter->drawText(devparms->math_decode_spi_mosi_val_pos[i] * pix_per_smpl, line_h_spi_mosi - 13, cell_width, 30, Qt::AlignCenter, str);
}
}
}
if(devparms->math_decode_spi_miso)
{
painter->drawText(5, line_h_spi_miso - 35, 40, 30, Qt::AlignCenter, "MISO");
for(i=0; i<devparms->math_decode_spi_miso_nval; i++)
{
if(devparms->math_decode_format == 0) // hex
{
switch(spi_chars)
{
case 1: sprintf(str, "0x%02X", devparms->math_decode_spi_miso_val[i]);
break;
case 2: sprintf(str, "0x%04X", devparms->math_decode_spi_miso_val[i]);
break;
case 3: sprintf(str, "0x%06X", devparms->math_decode_spi_miso_val[i]);
break;
case 4: sprintf(str, "0x%08X", devparms->math_decode_spi_miso_val[i]);
break;
}
painter->drawText(devparms->math_decode_spi_miso_val_pos[i] * pix_per_smpl, line_h_spi_miso - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 1) // ASCII
{
for(k=0; k<spi_chars; k++)
{
str[k]= devparms->math_decode_spi_miso_val[i] >> (k * 8);
if((str[k] < 33) || (str[k] > 126))
{
str[k] = '.';
}
}
str[k] = 0;
painter->drawText(devparms->math_decode_spi_miso_val_pos[i] * pix_per_smpl, line_h_spi_miso - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 2) // decimal
{
sprintf(str, "%u", devparms->math_decode_spi_miso_val[i]);
painter->drawText(devparms->math_decode_spi_miso_val_pos[i] * pix_per_smpl, line_h_spi_miso - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 3) // binary
{
str[0] = '0';
str[1] = 'b';
for(j=0; j<devparms->math_decode_spi_width; j++)
{
str[devparms->math_decode_spi_width + 1 - j] = ((devparms->math_decode_spi_miso_val[i] >> j) & 1) + '0';
}
str[j + 2] = 0;
painter->drawText(devparms->math_decode_spi_miso_val_pos[i] * pix_per_smpl, line_h_spi_miso - 13, cell_width, 30, Qt::AlignCenter, str);
}
else if(devparms->math_decode_format == 4) // line
{
for(j=0; j<devparms->math_decode_spi_width; j++)
{
str[j] = ((devparms->math_decode_spi_miso_val[i] >> j) & 1) + '0';
}
str[devparms->math_decode_spi_width] = 0;
painter->drawText(devparms->math_decode_spi_miso_val_pos[i] * pix_per_smpl, line_h_spi_miso - 13, cell_width, 30, Qt::AlignCenter, str);
}
}
}
}
}