summaryrefslogtreecommitdiff
path: root/src/gsmd
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2013-02-27 16:46:39 +0100
committerHarald Welte <laforge@gnumonks.org>2013-02-27 18:08:17 +0100
commit821f3af2ac2d77f0f15bdea02c2f3efd0e1cf419 (patch)
treeb945efd852906e94c422b6069406aeaffe0b7f68 /src/gsmd
parent28e25ae42da7d65face9ad2472075f7c4fc87e92 (diff)
add support for encapsulating and forwarding GPS and AIS data
we simply convert the sysmocom specific unsolicited messages into an usock event which is transported to the client[s] who subscribed to it.
Diffstat (limited to 'src/gsmd')
-rw-r--r--src/gsmd/vendor_wavecom.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/src/gsmd/vendor_wavecom.c b/src/gsmd/vendor_wavecom.c
index c1683ea..e5a9f08 100644
--- a/src/gsmd/vendor_wavecom.c
+++ b/src/gsmd/vendor_wavecom.c
@@ -120,8 +120,61 @@ out:
return 0;
}
+#define AIS_PFX "+SYSMOCOM_AIS: "
+
+struct gsmd_ucmd *usock_build_gps(uint8_t subtype, const char *data, uint16_t len)
+{
+ struct gsmd_evt_auxdata *aux;
+ struct gsmd_ucmd *ucmd;
+ int remain_len;
+
+ if (len <= strlen(AIS_PFX))
+ return NULL;
+
+ remain_len = len - strlen(AIS_PFX);
+
+ ucmd = usock_build_event(GSMD_MSG_EVENT, subtype, sizeof(*aux)+remain_len+1);
+ if (!ucmd)
+ return NULL;
+ aux = (struct gsmd_evt_auxdata *) ucmd->buf;
+
+ memcpy(aux->data, data+strlen(AIS_PFX), remain_len);
+ aux->data[remain_len] = '\0';
+
+ return ucmd;
+}
+
+static int sgps_parse(const char *buf, int len, const char *param,
+ struct gsmd *gsmd)
+{
+ struct gsmd_ucmd *ucmd = usock_build_gps(GSMD_EVT_GPS, buf, len);
+
+ if (!ucmd)
+ return -ENOMEM;
+
+ usock_evt_send(gsmd, ucmd, GSMD_EVT_SIGNAL);
+
+ return 0;
+};
+
+static int sais_parse(const char *buf, int len, const char *param,
+ struct gsmd *gsmd)
+{
+
+ struct gsmd_ucmd *ucmd = usock_build_gps(GSMD_EVT_AIS, buf, len);
+
+ if (!ucmd)
+ return -ENOMEM;
+
+ usock_evt_send(gsmd, ucmd, GSMD_EVT_SIGNAL);
+
+ return 0;
+};
+
static const struct gsmd_unsolicit wavecom_unsolicit[] = {
- { "+CCED", &cced_parse }, /* Cell Environment Report */
+ { "+CCED", &cced_parse }, /* Cell Environment Report */
+ { "+SYSMOCOM_GPS", &sgps_parse },
+ { "+SYSMOCOM_AIS", &sais_parse },
};
static int wavecom_detect(struct gsmd *g)
personal git repositories of Harald Welte. Your mileage may vary