summaryrefslogtreecommitdiff
path: root/src/gsmd/vendor_ti.c
blob: 53ca7edb19bc65b96fb1eeae350c226066babaa4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* TI [Calypso] compatible backend */

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#include "gsmd.h"

#include <gsmd/gsmd.h>
#include <gsmd/usock.h>
#include <gsmd/event.h>
#include <gsmd/vendorplugin.h>
#include <gsmd/unsolicited.h>

#if 0
#include "vendorplugin.h"

static int 
ti_getopt(struct gsmd *gh, int optname, void *optval, int *optlen)
{
	switch (optname) {
	case GSMD_OPT_CIPHER_IND:
		/* FIXME: send AT%CPRI=? */
		break;
	default:
		return -EINVAL;
	}
}

static int 
ti_setopt(struct gsmd *gh, int optname, const void *optval, int optlen)
{
	switch (optname) {
	case GSMD_OPT_CIPHER_IND:
		/* FIXME: send AT%CPRI= */
		break;
	default:
		return -EINVAL;
	}
}

#endif


static int csq_parse(char *buf, int len, char *param,
		     struct gsmd *gsmd)
{
	char *tok;
	struct gsmd_evt_auxdata *aux;
	struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_SIGNAL,
					     sizeof(*aux));

	DEBUGP("entering csq_parse param=`%s'\n", param);
	if (!ucmd)
		return -EINVAL;
	
	
	aux = (struct gsmd_evt_auxdata *) ucmd->buf;
	tok = strtok(param, ",");
	if (!tok)
		goto out_free_io;
	
	aux->u.signal.sigq.rssi = atoi(tok);

	tok = strtok(NULL, ",");
	if (!tok)
		goto out_free_io;

	aux->u.signal.sigq.ber = atoi(tok);

	DEBUGP("sending EVT_SIGNAL\n");
	usock_evt_send(gsmd, ucmd, GSMD_EVT_SIGNAL);

	return 0;

out_free_io:
	free(ucmd);
	return -EIO;
}

static int cpri_parse(char *buf, int len, const char *param, struct gsmd *gsmd)
{

}

static int cpi_parse(char *buf, int len, const char *param, struct gsmd *gsmd)
{

}

static const struct gsmd_unsolicit ticalypso_unsolicit[] = {
	{ "\%CSQ",	&csq_parse },	/* Signal Quality */
	{ "\%CPRI",	&cpri_parse },	/* Ciphering Indication */
	{ "\%CPI",	&cpi_parse },	/* Call Progress Information */

	/* FIXME: parse all the below and generate the respective events */

	/* %CPROAM: CPHS Home Country Roaming Indicator */
	/* %CPVWI: CPHS Voice Message Waiting */
	/* %CGREG: reports extended information about GPRS registration state */
	/* %CTZV: reports network time and date information */
	/* %CNIV: reports network name information */
	/* %CPKY: Press Key */
	/* %CMGRS: Message Retransmission Service */
	/* %CGEV: reports GPRS network events */
};

static int ticalypso_detect(struct gsmd *g)
{
	/* FIXME: do actual detection of vendor if we have multiple vendors */
	return 1;
}

static int ticalypso_initsettings(struct gsmd *g)
{
	return gsmd_simplecmd(g, "AT\%CPI=3;\%CPRI=1;\%CSQ=1");
}

static struct gsmd_vendor_plugin plugin_ticalypso = {
	.name = "TI Calypso",
	.num_unsolicit = ARRAY_SIZE(ticalypso_unsolicit),
	.unsolicit = &ticalypso_unsolicit,
	.detect = &ticalypso_detect,
	.initsettings = &ticalypso_initsettings,
};
 
/* FIXME: this will be _init() when we make this a plugin */
int ticalypso_init(void)
{
	return gsmd_vendor_plugin_register(&plugin_ticalypso);
}
personal git repositories of Harald Welte. Your mileage may vary