This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:

Subject: keytable: add missing protocols
Author:  Sean Young <s...@mess.org>
Date:    Tue Dec 12 10:01:53 2017 +0000

Signed-off-by: Sean Young <s...@mess.org>

 utils/common/ir-encode.c | 32 ++++++++++++++++++++++----------
 utils/common/ir-encode.h |  1 +
 utils/ir-ctl/ir-ctl.c    | 10 ++++++++++
 3 files changed, 33 insertions(+), 10 deletions(-)

---

http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=01f2ec0f420543e61e96bc398b2a25852378f566
diff --git a/utils/common/ir-encode.c b/utils/common/ir-encode.c
index 8f486dacfa3b..0ddae91c4576 100644
--- a/utils/common/ir-encode.c
+++ b/utils/common/ir-encode.c
@@ -352,7 +352,7 @@ static const struct {
        unsigned max_edges;
        unsigned carrier;
        int (*encode)(enum rc_proto proto, unsigned scancode, unsigned *buf);
-} encoders[] = {
+} protocols[] = {
        [RC_PROTO_RC5] = { "rc5", 0x1f7f, 24, 36000, rc5_encode },
        [RC_PROTO_RC5X_20] = { "rc5x_20", 0x1f7f3f, 40, 36000, rc5_encode },
        [RC_PROTO_RC5_SZ] = { "rc5_sz", 0x2fff, 26, 36000, rc5_encode },
@@ -370,6 +370,10 @@ static const struct {
        [RC_PROTO_RC6_6A_32] = { "rc6_6a_32", 0xffffffff, 76, 36000, rc6_encode 
},
        [RC_PROTO_RC6_MCE] = { "rc6_mce", 0xffff7fff, 76, 36000, rc6_encode },
        [RC_PROTO_SHARP] = { "sharp", 0x1fff, 63, 38000, sharp_encode },
+       [RC_PROTO_MCIR2_KBD] = { "mcir2-kbd" },
+       [RC_PROTO_MCIR2_MSE] = { "mcir2-mse" },
+       [RC_PROTO_XMP] = { "xmp" },
+       [RC_PROTO_CEC] = { "cec" },
 };
 
 static bool str_like(const char *a, const char *b)
@@ -396,8 +400,8 @@ bool protocol_match(const char *name, enum rc_proto *proto)
 {
        enum rc_proto p;
 
-       for (p=0; p<ARRAY_SIZE(encoders); p++) {
-               if (str_like(encoders[p].name, name)) {
+       for (p=0; p<ARRAY_SIZE(protocols); p++) {
+               if (str_like(protocols[p].name, name)) {
                        *proto = p;
                        return true;
                }
@@ -408,22 +412,22 @@ bool protocol_match(const char *name, enum rc_proto 
*proto)
 
 unsigned protocol_carrier(enum rc_proto proto)
 {
-       return encoders[proto].carrier;
+       return protocols[proto].carrier;
 }
 
 unsigned protocol_max_size(enum rc_proto proto)
 {
-       return encoders[proto].max_edges;
+       return protocols[proto].max_edges;
 }
 
 unsigned protocol_scancode_mask(enum rc_proto proto)
 {
-       return encoders[proto].scancode_mask;
+       return protocols[proto].scancode_mask;
 }
 
 bool protocol_scancode_valid(enum rc_proto p, unsigned s)
 {
-       if (s & ~encoders[p].scancode_mask)
+       if (s & ~protocols[p].scancode_mask)
                return false;
 
        if (p == RC_PROTO_NECX) {
@@ -439,15 +443,23 @@ bool protocol_scancode_valid(enum rc_proto p, unsigned s)
        return true;
 }
 
+bool protocol_encoder_available(enum rc_proto proto)
+{
+       return protocols[proto].encode != NULL;
+}
+
 unsigned protocol_encode(enum rc_proto proto, unsigned scancode, unsigned *buf)
 {
-       return encoders[proto].encode(proto, scancode, buf);
+       if (!protocols[proto].encode)
+               return 0;
+
+       return protocols[proto].encode(proto, scancode, buf);
 }
 
 const char* protocol_name(enum rc_proto proto)
 {
-       if (proto >= ARRAY_SIZE(encoders))
+       if (proto >= ARRAY_SIZE(protocols) || !protocols[proto].name[0])
                return NULL;
 
-       return encoders[proto].name;
+       return protocols[proto].name;
 }
diff --git a/utils/common/ir-encode.h b/utils/common/ir-encode.h
index 6e9c623e3548..7202c2d8c97c 100644
--- a/utils/common/ir-encode.h
+++ b/utils/common/ir-encode.h
@@ -9,6 +9,7 @@ unsigned protocol_carrier(enum rc_proto proto);
 unsigned protocol_max_size(enum rc_proto proto);
 bool protocol_scancode_valid(enum rc_proto proto, unsigned scancode);
 unsigned protocol_scancode_mask(enum rc_proto proto);
+bool protocol_encoder_available(enum rc_proto proto);
 unsigned protocol_encode(enum rc_proto proto, unsigned scancode, unsigned 
*buf);
 const char *protocol_name(enum rc_proto proto);
 
diff --git a/utils/ir-ctl/ir-ctl.c b/utils/ir-ctl/ir-ctl.c
index 97bcb79b9e45..2d7689304907 100644
--- a/utils/ir-ctl/ir-ctl.c
+++ b/utils/ir-ctl/ir-ctl.c
@@ -262,6 +262,11 @@ static struct file *read_file(struct arguments *args, 
const char *fname)
                                return NULL;
                        }
 
+                       if (!protocol_encoder_available(proto)) {
+                               fprintf(stderr, _("error: %s:%d: no encoder 
available for `%s'\n"), fname, lineno, protocol_name(proto));
+                               return NULL;
+                       }
+
                        if (!protocol_scancode_valid(proto, scancode)) {
                                fprintf(stderr, _("error: %s:%d: invalid 
scancode '%s' for protocol '%s'\n"), fname, lineno, scancodestr, 
protocol_name(proto));
                                return NULL;
@@ -803,6 +808,11 @@ static int lirc_send(struct arguments *args, int fd, 
unsigned features, struct f
        if (f->is_scancode) {
                // encode scancode
                enum rc_proto proto = f->protocol;
+               if (!protocol_encoder_available(proto)) {
+                       fprintf(stderr, _("%s: no encoder available for 
`%s'\n"),
+                               dev, protocol_name(proto));
+                       return EX_UNAVAILABLE;
+               }
                f->len = protocol_encode(f->protocol, f->scancode, f->buf);
                f->carrier = protocol_carrier(proto);
        }

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to