demo: introduce graycode generator mode

Introduce support for the "graycode" logic pattern. Generate up to
64 bits of graycode output (all logic lines, no repetition, not limited
by the generator's internal pattern buffer). The implementation was
tested with 16 channels.
This commit is contained in:
Gerhard Sittig 2018-05-13 19:45:46 +02:00
parent 015f09702a
commit 0373343046
3 changed files with 27 additions and 0 deletions

View File

@ -44,6 +44,7 @@ static const char *logic_pattern_str[] = {
"all-low",
"all-high",
"squid",
"graycode",
};
static const uint32_t scanopts[] = {

View File

@ -245,6 +245,19 @@ SR_PRIV void demo_generate_analog_pattern(struct analog_gen *ag, uint64_t sample
}
}
static uint64_t encode_number_to_gray(uint64_t nr)
{
return nr ^ (nr >> 1);
}
static void set_logic_data(uint64_t bits, uint8_t *data, size_t len)
{
while (len--) {
*data++ = bits & 0xff;
bits >>= 8;
}
}
static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
{
struct dev_context *devc;
@ -253,6 +266,7 @@ static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
uint8_t *sample;
const uint8_t *image_col;
size_t col_count, col_height;
uint64_t gray;
devc = sdi->priv;
@ -326,6 +340,15 @@ static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
devc->step %= col_count;
}
break;
case PATTERN_GRAYCODE:
for (i = 0; i < size; i += devc->logic_unitsize) {
devc->step++;
devc->step &= devc->all_logic_channels_mask;
gray = encode_number_to_gray(devc->step);
gray &= devc->all_logic_channels_mask;
set_logic_data(gray, &devc->logic_data[i], devc->logic_unitsize);
}
break;
default:
sr_err("Unknown pattern: %d.", devc->logic_pattern);
break;

View File

@ -77,6 +77,9 @@ enum logic_pattern_type {
* something that can get recognized.
*/
PATTERN_SQUID,
/** Gray encoded data, like rotary encoder signals. */
PATTERN_GRAYCODE,
};
/* Analog patterns we can generate. */