License: GNU General Public License
------------------------------------------------------------------*/
-
+#include "emuld_common.h"
#include "emuld.h"
/* global definition */
int g_sdbd_sockfd = -1; /* sdbd fd */
static int g_vm_connect_status; /* connection status between emuld and vmodem */
int g_sdcard_sockfd = -1;
+int g_get_status_sockfd = -1; /* return status of devive to the injector */
pthread_t tid[MAX_CLIENT + 1];
struct epoll_event g_events[MAX_EVENTS];
-// for vmodem packets
-typedef struct // lxt_message
-{
- unsigned short length;
- unsigned char group;
- unsigned char action;
- void *data;
-} LXT_MESSAGE;
-
void TAPIMessageInit(LXT_MESSAGE *packet)
{
packet->length = 0;
}
char SDpath[256];
-
+
+unsigned char ActionID = 0;
+char GetBuffer[256];
+void setting_device();
/*--------------------------------------------------------------*/
/* FUNCTION PART
---------------------------------------------------------------*/
LOG("Something may be added in the data end, but it does not matter.");
LOG("sensor data recv buffer: %s", r_databuf);
- if(sendto(uSensordFd, r_databuf, packet->length, 0, (struct sockaddr*)&si_sensord_other, sslen) == -1)
+ if (packet->group == STATUS) {
+ g_get_status_sockfd = event_fd;
+ ActionID = packet->action;
+ memset(GetBuffer, '\0', sizeof(GetBuffer));
+ strcpy(GetBuffer, r_databuf);
+ LOG("GetBuffer is %s", GetBuffer);
+
+ if(pthread_create(&tid[2], NULL, setting_device, NULL) != 0) {
+ LOG("pthread create fail!");
+ }
+ }
+ else if(sendto(uSensordFd, r_databuf, packet->length, 0, (struct sockaddr*)&si_sensord_other, sslen) == -1) {
LOG("sendto error!");
+ }
}
else if(strncmp(tmpbuf, "location", 8) == 0)
{
LOG("Something may be added in the data end, but it does not matter.");
LOG("location data recv buffer: %s", r_databuf);
- setting_location(r_databuf);
+ if (packet->group == STATUS) {
+ g_get_status_sockfd = event_fd;
+ ActionID = packet->action;
+ memset(GetBuffer, '\0', sizeof(GetBuffer));
+ strcpy(GetBuffer, r_databuf);
+ LOG("GetBuffer is %s", GetBuffer);
+
+ if(pthread_create(&tid[2], NULL, setting_device, NULL) != 0) {
+ LOG("pthread create fail!");
+ }
+ } else {
+ setting_location(r_databuf);
+ }
}
else if(strncmp(tmpbuf, "nfc", 3) == 0)
{
exit(0);
}
+void setting_device()
+{
+ pthread_detach(pthread_self());
+
+ char* msg = 0;
+ LXT_MESSAGE* packet = (LXT_MESSAGE*)malloc(sizeof(LXT_MESSAGE));
+
+ switch(ActionID)
+ {
+ case BATTERY_LEVEL:
+ msg = get_battery_level((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting battery level");
+ }
+ break;
+ case BATTERY_CHARGER:
+ msg = get_battery_charger((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting battery charger state");
+ }
+ break;
+ case USB_STATUS:
+ msg = get_usb_status((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting usb status");
+ }
+ break;
+ case EARJACK_STATUS:
+ msg = get_earjack_status((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting earjack status");
+ }
+ break;
+ case RSSI_LEVEL:
+ msg = get_rssi_level((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting rssi level");
+ }
+ break;
+ case ACCEL_VALUE:
+ msg = get_acceleration_value((void*)packet);
+ if (msg == 0) {
+ LOG("falied getting acceleration value");
+ }
+ break;
+ case GYRO_VALUE:
+ msg = get_gyroscope_value((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting gyroscope value");
+ }
+ break;
+ case MAG_VALUE:
+ msg = get_magnetic_value((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting magnetic value");
+ }
+ break;
+ case LIGHT_VALUE:
+ msg = get_light_level((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting light level");
+ }
+ break;
+ case PROXI_VALUE:
+ msg = get_proximity_status((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting proximity status");
+ }
+ break;
+ case MOTION_VALUE:
+ LOG("not support getting motion value");
+ break;
+ case LOCATION_STATUS:
+ msg = get_location_status((void*)packet);
+ if (msg == 0) {
+ LOG("failed getting location status");
+ }
+ break;
+ default:
+ //TODO
+ break;
+ }
+
+ if (g_get_status_sockfd != -1) {
+ if (msg != 0) {
+ LOG("send data to injector");
+ } else {
+ LOG("send error message to injector");
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 0;
+ packet->group = STATUS;
+ packet->action = ActionID;
+ }
+ send(g_get_status_sockfd, (void*)packet, sizeof(char) * HEADER_SIZE, 0);
+ if (packet->length != 0) {
+ send(g_get_status_sockfd, msg, packet->length, 0);
+ }
+ }
+
+ if(msg != 0) {
+ free(msg);
+ }
+ free(packet);
+
+ pthread_exit((void *) 0);
+}
+
// location event
char command[512];
char latitude[128];
--- /dev/null
+//#include <vconf.h>
+#include "emuld_common.h"
+
+
+char* message;
+char* get_usb_status(void* p)
+{
+ FILE* fd = fopen("/sys/devices/platform/jack/usb_online", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ int status = 0;
+ fscanf(fd, "%d", &status);
+ fclose(fd);
+
+ // int to byte
+ message = (char*)malloc(5);
+ message[3] = (char) (status & 0xff);
+ message[2] = (char) (status >> 8 & 0xff);
+ message[1] = (char) (status >> 16 & 0xff);
+ message[0] = (char) (status >> 24 & 0xff);
+ message[4] = '\0';
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 4;
+ packet->group = STATUS;
+ packet->action = USB_STATUS;
+
+ return message;
+}
+
+char* get_earjack_status(void* p)
+{
+ FILE* fd = fopen("/sys/devices/platform/jack/earjack_online", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ int status = 0;
+ fscanf(fd, "%d", &status);
+ fclose(fd);
+
+ // int to byte
+ message = (char*)malloc(5);
+ message[3] = (char) (status & 0xff);
+ message[2] = (char) (status >> 8 & 0xff);
+ message[1] = (char) (status >> 16 & 0xff);
+ message[0] = (char) (status >> 24 & 0xff);
+ message[4] = '\0';
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 4;
+ packet->group = STATUS;
+ packet->action = EARJACK_STATUS;
+
+ return message;
+}
+
+char* get_rssi_level(void* p)
+{
+ int level;
+ int ret = vconf_get_int("memory/telephony/rssi", &level);
+ if (ret != 0) {
+ return 0;
+ }
+
+ // int to byte
+ message = (char*)malloc(5);
+ message[3] = (char) (level & 0xff);
+ message[2] = (char) (level >> 8 & 0xff);
+ message[1] = (char) (level >> 16 & 0xff);
+ message[0] = (char) (level >> 24 & 0xff);
+ message[4] = '\0';
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 4;
+ packet->group = STATUS;
+ packet->action = RSSI_LEVEL;
+
+ return message;
+}
+
+char* get_battery_level(void* p)
+{
+ FILE* fd = fopen("/sys/class/power_supply/battery/capacity", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ int level = 0;
+ fscanf(fd, "%d", &level);
+ fclose(fd);
+
+ // int to byte
+ message = (char*)malloc(5);
+ message[3] = (char) (level & 0xff);
+ message[2] = (char) (level >> 8 & 0xff);
+ message[1] = (char) (level >> 16 & 0xff);
+ message[0] = (char) (level >> 24 & 0xff);
+ message[4] = '\0';
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 4;
+ packet->group = STATUS;
+ packet->action = BATTERY_LEVEL;
+
+ return message;
+}
+
+char* get_battery_charger(void* p)
+{
+ FILE* fd = fopen("/sys/class/power_supply/battery/charge_now", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ int charge = 0;
+ fscanf(fd, "%d", &charge);
+ fclose(fd);
+ // int to byte
+ message = (char*)malloc(5);
+
+ message[3] = (char) (charge & 0xff);
+ message[2] = (char) (charge >> 8 & 0xff);
+ message[1] = (char) (charge >> 16 & 0xff);
+ message[0] = (char) (charge >> 24 & 0xff);
+ message[4] = '\0';
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 4;
+ packet->group = STATUS;
+ packet->action = BATTERY_CHARGER;
+
+ return message;
+}
+
+char* get_proximity_status(void* p)
+{
+ FILE* fd = fopen("/opt/sensor/proxi/vo", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ int status = 0;
+ fscanf(fd, "%d", &status);
+ fclose(fd);
+ // int to byte
+ message = (char*)malloc(5);
+
+ message[3] = (char) (status & 0xff);
+ message[2] = (char) (status >> 8 & 0xff);
+ message[1] = (char) (status >> 16 & 0xff);
+ message[0] = (char) (status >> 24 & 0xff);
+ message[4] = '\0';
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 4;
+ packet->group = STATUS;
+ packet->action = PROXI_VALUE;
+
+ return message;
+}
+
+char* get_light_level(void* p)
+{
+ FILE* fd = fopen("/opt/sensor/light/adc", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ int level = 0;
+ fscanf(fd, "%d", &level);
+ fclose(fd);
+
+ // int to byte
+ message = (char*)malloc(5);
+ message[3] = (char) (level & 0xff);
+ message[2] = (char) (level >> 8 & 0xff);
+ message[1] = (char) (level >> 16 & 0xff);
+ message[0] = (char) (level >> 24 & 0xff);
+ message[4] = '\0';
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = 4;
+ packet->group = STATUS;
+ packet->action = LIGHT_VALUE;
+
+ return message;
+}
+
+char* get_acceleration_value(void* p)
+{
+ FILE* fd = fopen("/opt/sensor/accel/xyz", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ message = (char*)malloc(128);
+ //fscanf(fd, "%d, %d, %d", message);
+ fgets(message, 128, fd);
+ fclose(fd);
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = strlen(message);
+ packet->group = STATUS;
+ packet->action = ACCEL_VALUE;
+
+ return message;
+}
+
+char* get_gyroscope_value(void* p)
+{
+ int x;
+ int y;
+ int z;
+ FILE* fd = fopen("/opt/sensor/gyro/gyro_x_raw", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+ fscanf(fd, "%d", &x);
+ fclose(fd);
+
+ fd = fopen("/opt/sensor/gyro/gyro_y_raw", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+ fscanf(fd, "%d", &y);
+ fclose(fd);
+
+ fd = fopen("/opt/sensor/gyro/gyro_z_raw", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+ fscanf(fd, "%d", &z);
+ fclose(fd);
+
+ message = (char*)malloc(128);
+ memset(message, 0, 128);
+ int ret = sprintf(message, "%d, %d, %d", x, y, z);
+ if (ret < 0) {
+ free(message);
+ return 0;
+ }
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = strlen(message);
+ packet->group = STATUS;
+ packet->action = GYRO_VALUE;
+
+ return message;
+}
+
+char* get_magnetic_value(void* p)
+{
+ FILE* fd = fopen("/opt/sensor/geo/tesla", "r");
+ if(!fd)
+ {
+ return 0;
+ }
+
+ message = (char*)malloc(128);
+ fgets(message, 128, fd);
+ fclose(fd);
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = strlen(message);
+ packet->group = STATUS;
+ packet->action = MAG_VALUE;
+ return message;
+}
+
+char* get_location_status(void* p)
+{
+ int mode;
+ int ret = vconf_get_int("db/location/replay/ReplayMode", &mode);
+ if (ret != 0) {
+ return 0;
+ }
+
+ if (mode == 0) { // STOP
+ message = (char*)malloc(5);
+ ret = sprintf(message, "%d", mode);
+ if (ret < 0) {
+ free(message);
+ return 0;
+ }
+ } else if (mode == 1) { // NMEA MODE(LOG MODE)
+ //char* temp = (char*)malloc(128);
+ char* temp = 0;
+ temp = vconf_get_str("db/location/replay/FileName");
+ if (temp == 0) {
+ //free(temp);
+ return 0;
+ }
+
+ message = (char*)malloc(256);
+ ret = sprintf(message, "%d,%s", mode, temp);
+ if (ret < 0) {
+ free(message);
+ return 0;
+ }
+ } else if (mode == 2) { // MANUAL MODE
+ double latitude;
+ double logitude;
+ ret = vconf_get_dbl("db/location/replay/ManualLatitude", &latitude);
+ if (ret != 0) {
+ return 0;
+ }
+ ret = vconf_get_dbl("db/location/replay/ManualLongitude", &logitude);
+ if (ret != 0) {
+ return 0;
+ }
+ message = (char*)malloc(128);
+ ret = sprintf(message, "%d,%f,%f", mode, latitude, logitude);
+ if (ret < 0) {
+ free(message);
+ return 0;
+ }
+ }
+
+ LXT_MESSAGE* packet = p;
+ memset(packet, 0, sizeof(LXT_MESSAGE));
+ packet->length = strlen(message);
+ packet->group = STATUS;
+ packet->action = LOCATION_STATUS;
+
+ return message;
+}