#include <string.h>
#include <unistd.h>
#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <linux/if_tun.h>
+#include <fcntl.h>
#include <glib.h>
#include <tcore.h>
#include <plugin.h>
+#include <core_object.h>
+
#include <user_request.h>
#include <hal.h>
+#include <mux.h>
+#include <at.h>
+#include <queue.h>
-#include "tty_imc.h"
+#include "util_imc.h"
#include "pr3_audio.h"
-#define BUF_LEN_MAX 512
+#define BUF_LEN_MAX 4096
+
+#define CHANNEL_MAX 8
+
+#define CHANNEL_MODEM 3
+#define CHANNEL_CALL 1
+#define CHANNEL_SIM 1
+#define CHANNEL_SMS 1
+#define CHANNEL_NETWORK 2
+#define CHANNEL_PS 3
+#define CHANNEL_SAT 2
+#define CHANNEL_SS 2
+#define CHANNEL_NONE -1
struct custom_data {
- int tty_fd;
- guint watch_id_tty;
+ int hal_fd;
+ guint watch_id;
+ void *cb;
+ void *cb_data;
};
-static TReturn hal_power(TcoreHal *hal, gboolean flag)
+static TcoreHal *get_object_hal(const char *obj_name)
{
- struct custom_data *user_data;
+ if (strcmp(obj_name, "modem") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_MODEM);
+ else if (strcmp(obj_name, "call") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_CALL);
+ else if (strcmp(obj_name, "sim") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_SIM);
+ else if (strcmp(obj_name, "umts_sms") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_SMS);
+ else if (strcmp(obj_name, "umts_network") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_NETWORK);
+ else if (strcmp(obj_name, "umts_ps") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_PS);
+ else if (strcmp(obj_name, "sat") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_SAT);
+ else if (strcmp(obj_name, "ss") == 0)
+ return tcore_cmux_get_hal_channel(CHANNEL_SS);
+
+ return NULL;
+}
- user_data = tcore_hal_ref_user_data(hal);
- if (!user_data)
- return TCORE_RETURN_FAILURE;
+static void on_cmux_init(void *user_data)
+{
+ TcoreHal *hal = user_data;
+ struct custom_data *cdata;
+ TcoreHalPowerCallBack func;
+
+ dbg("Successfully initialized CMUX");
+
+ cdata = tcore_hal_ref_user_data(hal);
+ func = (TcoreHalPowerCallBack)cdata->cb;
+ func(hal, cdata->cb_data);
+}
+
+static void on_response_setupmux(TcorePending *p, int data_len,
+ const void *data, void *user_data)
+{
+ TcorePlugin *plugin = tcore_pending_ref_plugin(p);
+ TcoreHal *hal = user_data;
+ TReturn ret;
+
+ dbg("Entry");
+
+ /* Initialize CMUX */
+ ret = tcore_cmux_init(plugin, hal, on_cmux_init, hal,
+ CHANNEL_MAX);
+ if (TCORE_RETURN_SUCCESS != ret)
+ err("Failed to initialize CMUX");
+
+ dbg("Exit");
+
+ return;
+}
+
+static TReturn hal_power(TcoreHal *hal, gboolean flag,
+ TcoreHalPowerCallBack func, void *user_data)
+{
+ struct custom_data *cdata;
+
+ cdata = tcore_hal_ref_user_data(hal);
/* power on */
if (flag == TRUE) {
- dbg("Phone Power On success (fd:%d)", user_data->tty_fd);
+ TcorePending *pending;
+
+ cdata->cb = (void *)func;
+ cdata->cb_data = user_data;
tcore_hal_set_power_state(hal, TRUE);
+
+ pending = tcore_at_pending_new(NULL, "AT+CMUX=0,0,,1509,10,3,30,,", "+CMUX", TCORE_AT_NO_RESULT, on_response_setupmux, hal);
+
+ if (pending == NULL) {
+ err("Fail to create AT+CMUX pending request");
+
+ return TCORE_RETURN_FAILURE;
+ }
+
+ /* Send callback */
+ tcore_hal_send_request(hal, pending);
/* power off */
} else {
- dbg("Phone Power Off success.");
+ tcore_cmux_close();
+
+ g_source_remove(cdata->watch_id);
+ close(cdata->hal_fd);
+
+ g_free(cdata);
tcore_hal_set_power_state(hal, FALSE);
+
+ dbg("Phone Power Off success.");
}
return TCORE_RETURN_SUCCESS;
if (!user_data)
return TCORE_RETURN_FAILURE;
- ret = tty_write(user_data->tty_fd, data, data_len);
+ ret = fd_write(user_data->hal_fd, data, data_len);
if(ret < 0) {
- err("tty_write failed");
+ err("fd_write failed");
return TCORE_RETURN_FAILURE;
}
- dbg("tty_write success ret=%d (fd=%d, len=%d)", ret, user_data->tty_fd, data_len);
+ dbg("fd_write success ret=%d (fd=%d, len=%d)", ret, user_data->hal_fd, data_len);
return TCORE_RETURN_SUCCESS;
}
+static TReturn hal_link_object_channel(CoreObject *object)
+{
+ const char *name = tcore_object_ref_name(object);
+ TcoreHal *hal;
+ TReturn ret;
+
+ hal = get_object_hal(name);
+ if (hal == NULL)
+ return TCORE_RETURN_EINVAL;
+
+ ret = tcore_object_set_hal(object, hal);
+
+ return ret;
+}
static struct tcore_hal_operations hops =
{
.power = hal_power,
.send = hal_send,
.set_sound_path = pr3_audio_set_sound_path,
+ .link_object_channel = hal_link_object_channel,
};
static gboolean on_recv_tty_message(GIOChannel *channel, GIOCondition condition, gpointer data)
custom = tcore_hal_ref_user_data(hal);
memset(buf, 0, BUF_LEN_MAX);
- n = tty_read(custom->tty_fd, buf, BUF_LEN_MAX);
+ n = fd_read(custom->hal_fd, buf, BUF_LEN_MAX);
if (n < 0) {
- err("tty_read error. return_valute = %d", n);
+ err("fd_read error. return_valute = %d", n);
return TRUE;
}
dbg("I'm init!");
/* Phonet init */
- data = calloc(sizeof(struct custom_data), 1);
- memset(data, 0, sizeof(struct custom_data));
+ data = g_new0(struct custom_data, 1);
- data->tty_fd = tty_open();
+ data->hal_fd = tty_open();
+ if (data->hal_fd < 0) {
+ g_free(data);
+ return FALSE;
+ }
/* HAL init */
hal = tcore_hal_new(plugin, "imc-pr3", &hops, TCORE_HAL_MODE_AT);
tcore_hal_link_user_data(hal, data);
- data->watch_id_tty= register_gio_watch(hal, data->tty_fd, on_recv_tty_message);
+ data->watch_id= register_gio_watch(hal, data->hal_fd, on_recv_tty_message);
- dbg("tty_fd = %d, watch_id_tty=%d ", data->tty_fd, data->watch_id_tty);
+ dbg("hal_fd = %d, watch_id=%d ", data->hal_fd, data->watch_id);
if (pr3_audio_init() != TRUE)
err("Error in audio initialization")