show type in the --get-signal-info command
authorFelix Fietkau <nbd@openwrt.org>
Sun, 17 Feb 2013 21:36:48 +0000 (22:36 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 17 Feb 2013 21:36:48 +0000 (22:36 +0100)
commands-nas.c
dev.c
main.c
qmi-message.h
uqmi.h

index 09624c4846f7d60ad9664c401a525aaa061d6066..e4d7ce6f57d4fccc089e5959482721a2fea97e11 100644 (file)
@@ -62,25 +62,31 @@ cmd_nas_get_signal_info_cb(struct qmi_dev *qmi, struct qmi_request *req, struct
        qmi_parse_nas_get_signal_info_response(msg, &res);
 
        if (res.set.cdma_signal_strength) {
+               blobmsg_add_string(&status, "type", "cdma");
                blobmsg_add_u32(&status, "rssi", (int32_t) res.data.cdma_signal_strength.rssi);
                blobmsg_add_u32(&status, "ecio", (int32_t) res.data.cdma_signal_strength.ecio);
        }
 
        if (res.set.hdr_signal_strength) {
+               blobmsg_add_string(&status, "type", "hdr");
                blobmsg_add_u32(&status, "rssi", (int32_t) res.data.hdr_signal_strength.rssi);
                blobmsg_add_u32(&status, "ecio", (int32_t) res.data.hdr_signal_strength.ecio);
                blobmsg_add_u32(&status, "io", res.data.hdr_signal_strength.io);
        }
 
-       if (res.set.gsm_signal_strength)
+       if (res.set.gsm_signal_strength) {
+               blobmsg_add_string(&status, "type", "gsm");
                blobmsg_add_u32(&status, "signal", (int32_t) res.data.gsm_signal_strength);
+       }
 
        if (res.set.wcdma_signal_strength) {
+               blobmsg_add_string(&status, "type", "wcdma");
                blobmsg_add_u32(&status, "rssi", (int32_t) res.data.wcdma_signal_strength.rssi);
                blobmsg_add_u32(&status, "ecio", (int32_t) res.data.wcdma_signal_strength.ecio);
        }
 
        if (res.set.lte_signal_strength) {
+               blobmsg_add_string(&status, "type", "lte");
                blobmsg_add_u32(&status, "rssi", (int32_t) res.data.lte_signal_strength.rssi);
                blobmsg_add_u32(&status, "rsrq", (int32_t) res.data.lte_signal_strength.rsrq);
                blobmsg_add_u32(&status, "rsrp", (int32_t) res.data.lte_signal_strength.rsrp);
diff --git a/dev.c b/dev.c
index 21e30eae56bedbb7a5f5af40e2c91a5a56e42def..b00ee8d2da44c9db827346a1412123a38670faf0 100644 (file)
--- a/dev.c
+++ b/dev.c
@@ -7,6 +7,8 @@
 #include "qmi-errors.h"
 #include "qmi-errors.c"
 
+bool cancel_all_requests = false;
+
 #define __qmi_service(_n) [__##_n] = _n
 static const uint8_t qmi_services[__QMI_SERVICE_LAST] = {
        __qmi_services
@@ -55,10 +57,14 @@ static void __qmi_request_complete(struct qmi_dev *qmi, struct qmi_request *req,
        req->pending = false;
        list_del(&req->list);
 
-       tlv_buf = qmi_msg_get_tlv_buf(msg, &tlv_len);
-       req->ret = qmi_check_message_status(tlv_buf, tlv_len);
-       if (req->ret)
-               msg = NULL;
+       if (msg) {
+               tlv_buf = qmi_msg_get_tlv_buf(msg, &tlv_len);
+               req->ret = qmi_check_message_status(tlv_buf, tlv_len);
+               if (req->ret)
+                       msg = NULL;
+       } else {
+               req->ret = QMI_ERROR_CANCELLED;
+       }
 
        if (req->cb && (msg || !req->no_error_cb))
                req->cb(qmi, req, msg);
@@ -174,6 +180,10 @@ int qmi_request_wait(struct qmi_dev *qmi, struct qmi_request *req)
                cancelled = uloop_cancelled;
                uloop_cancelled = false;
                uloop_run();
+
+               if (cancel_all_requests)
+                       qmi_request_cancel(qmi, req);
+
                uloop_cancelled = cancelled;
        }
 
diff --git a/main.c b/main.c
index 7bfaba875aedee453e424892aa57f348e3d0652d..cde1f8dfadf568d895c3452752f9d0ccc626e41b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -6,6 +6,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <getopt.h>
+#include <signal.h>
 
 #include "uqmi.h"
 #include "commands.h"
@@ -55,11 +56,21 @@ static void keep_client_id(struct qmi_dev *qmi, const char *optarg)
        qmi_service_get_client_id(qmi, svc);
 }
 
+static void handle_exit_signal(int signal)
+{
+       cancel_all_requests = true;
+       uloop_end();
+}
+
 int main(int argc, char **argv)
 {
        static struct qmi_dev dev;
        int ch;
 
+       uloop_init();
+       signal(SIGINT, handle_exit_signal);
+       signal(SIGTERM, handle_exit_signal);
+
        while ((ch = getopt_long(argc, argv, "d:k:", uqmi_getopt, NULL)) != -1) {
                int cmd_opt = CMD_OPT(ch);
 
index 35838b35d8abdc49e83f1db3d542ee7989da312d..02cd8810d45ad51dd579e6c8f255502b33e9ce8f 100644 (file)
@@ -73,6 +73,7 @@
 enum {
        QMI_ERROR_NO_DATA = -1,
        QMI_ERROR_INVALID_DATA = -2,
+       QMI_ERROR_CANCELLED = -3,
 };
 
 #define QMI_BUFFER_LEN 2048
diff --git a/uqmi.h b/uqmi.h
index 213dbc55a164bc4a753f8c3fe67c0fcbc3f76bbf..842fb9bee96b7f1c3dfce5d69a34c921b2632cb8 100644 (file)
--- a/uqmi.h
+++ b/uqmi.h
@@ -1,8 +1,11 @@
 #ifndef __UQMI_H
 #define __UQMI_H
 
+#include <stdbool.h>
+
 #include <libubox/uloop.h>
 #include <libubox/ustream.h>
+
 #include "qmi-message.h"
 
 #ifdef DEBUG_PACKET
@@ -76,6 +79,7 @@ struct qmi_request {
        int ret;
 };
 
+extern bool cancel_all_requests;
 int qmi_device_open(struct qmi_dev *qmi, const char *path);
 void qmi_device_close(struct qmi_dev *qmi);