summaryrefslogtreecommitdiff
path: root/fw/esp32/components/eos/cell_ussd.c
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2020-08-12 01:49:15 +0200
committerUros Majstorovic <majstor@majstor.org>2020-08-12 01:49:15 +0200
commit57c1824affca858023c65c84e188ea7dc6c0a5f2 (patch)
treea3d701c98b76de279324a0d2318bbcb1259045d4 /fw/esp32/components/eos/cell_ussd.c
parent0ca91a2b6a1b112a6e67306e7dbedaeec0225c5b (diff)
ussd service implemented urc
Diffstat (limited to 'fw/esp32/components/eos/cell_ussd.c')
-rw-r--r--fw/esp32/components/eos/cell_ussd.c66
1 files changed, 65 insertions, 1 deletions
diff --git a/fw/esp32/components/eos/cell_ussd.c b/fw/esp32/components/eos/cell_ussd.c
index 3113886..a4cf32b 100644
--- a/fw/esp32/components/eos/cell_ussd.c
+++ b/fw/esp32/components/eos/cell_ussd.c
@@ -1,12 +1,16 @@
#include <stdlib.h>
+#include <string.h>
#include <stdio.h>
#include <esp_log.h>
#include "eos.h"
+#include "net.h"
#include "at_cmd.h"
#include "cell.h"
+static const char *TAG = "EOS USSD";
+
static char cmd[256];
static int cmd_len;
@@ -30,10 +34,70 @@ void eos_cell_ussd_handler(unsigned char mtype, unsigned char *buffer, uint16_t
rv = at_expect("^OK", "^ERROR", 1000);
eos_modem_give();
+ break;
+
+ case EOS_CELL_MTYPE_USSD_CANCEL:
+ rv = eos_modem_take(1000);
+ if (rv) return;
+ at_cmd("AT+CUSD=2\r");
+ rv = at_expect("^OK", "^ERROR", 1000);
+
+ eos_modem_give();
break;
}
}
-void eos_cell_ussd_init(void) {} \ No newline at end of file
+static void ussd_reply_handler(char *urc, regmatch_t m[]) {
+ int rep, rv;
+ unsigned char *buf;
+ uint16_t len;
+ char *_buf;
+ size_t _len;
+ regex_t re;
+ regmatch_t match[2];
+
+ rv = regcomp(&re, ".*(\",[0-9]+)$", REG_EXTENDED);
+ if (rv) return;
+
+ sscanf(urc + m[1].rm_so, "%1d", &rep);
+
+ buf = eos_net_alloc();
+ buf[0] = EOS_CELL_MTYPE_USSD | EOS_CELL_MTYPE_USSD_REPLY;
+ buf[1] = rep;
+ len = 2;
+
+ rv = EOS_OK;
+ _buf = (char *)buf + len;
+ strcpy(_buf, urc + m[2].rm_so);
+ do {
+ if (regexec(&re, _buf, 2, match, 0) == 0) {
+ ESP_LOGI(TAG, "MATCH:%ld %s", match[1].rm_so, _buf);
+ _buf[match[1].rm_so] = '\0';
+ _len = strlen(_buf);
+ len += _len + 1;
+ break;
+ } else {
+ _len = strlen(_buf);
+ _buf[_len] = '\n';
+ _buf += _len + 1;
+ len += _len + 1;
+ }
+ rv = eos_modem_readln(_buf, EOS_NET_SIZE_BUF - len, 1000);
+ if (rv) break;
+ } while (1);
+
+ if (rv) {
+ ESP_LOGE(TAG, "USSD error");
+ eos_net_free(buf);
+ } else {
+ eos_net_send(EOS_NET_MTYPE_CELL, buf, len);
+ }
+ regfree(&re);
+}
+
+void eos_cell_ussd_init(void) {
+ at_urc_insert("\\+CUSD: ([0-9]),\"(.*)", ussd_reply_handler, REG_EXTENDED);
+
+} \ No newline at end of file