From: Gerhard Sittig Date: Sun, 13 May 2018 17:45:46 +0000 (+0200) Subject: demo: introduce graycode generator mode X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=03733430464abbc8eb23d50c8bef822dcd2ee20b;p=libsigrok.git 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. --- diff --git a/src/hardware/demo/api.c b/src/hardware/demo/api.c index 7f2971db..d0abe4ff 100644 --- a/src/hardware/demo/api.c +++ b/src/hardware/demo/api.c @@ -44,6 +44,7 @@ static const char *logic_pattern_str[] = { "all-low", "all-high", "squid", + "graycode", }; static const uint32_t scanopts[] = { diff --git a/src/hardware/demo/protocol.c b/src/hardware/demo/protocol.c index 53ae2477..05f3f9d3 100644 --- a/src/hardware/demo/protocol.c +++ b/src/hardware/demo/protocol.c @@ -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; diff --git a/src/hardware/demo/protocol.h b/src/hardware/demo/protocol.h index c35ea2d4..285a127d 100644 --- a/src/hardware/demo/protocol.h +++ b/src/hardware/demo/protocol.h @@ -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. */