181 lines
3.9 KiB
C
181 lines
3.9 KiB
C
/******************************************************************************
|
|
*
|
|
* $Id: misc.c 196 2010-03-17 10:33:00Z rikita $
|
|
*
|
|
* -- Copyright Notice --
|
|
*
|
|
* Copyright (c) 2009 Asahi Kasei Microdevices Corporation, Japan
|
|
* All Rights Reserved.
|
|
*
|
|
* This software program is proprietary program of Asahi Kasei Microdevices
|
|
* Corporation("AKM") licensed to authorized Licensee under Software License
|
|
* Agreement (SLA) executed between the Licensee and AKM.
|
|
*
|
|
* Use of the software by unauthorized third party, or use of the software
|
|
* beyond the scope of the SLA is strictly prohibited.
|
|
*
|
|
* -- End Asahi Kasei Microdevices Copyright Notice --
|
|
*
|
|
******************************************************************************/
|
|
#include "misc.h"
|
|
#include <fcntl.h>
|
|
#include <linux/input.h>
|
|
|
|
int s_stopRequest; /*!< 0:Not stop, 1:Stop */
|
|
int s_opmode; /*!< 0:Daemon mode, 1:Console mode */
|
|
|
|
static int s_keyFile = -1; /*!< FD to console control device */
|
|
static int s_formFile = -1; /*!< FD to formation detect device */
|
|
|
|
#define NUMOF_AKMD_INTERVAL 8
|
|
static AKMD_INTERVAL s_interval[NUMOF_AKMD_INTERVAL] = {
|
|
{ 10000, 10}, /* 100Hz SENSOR_DELAY_FASTEST */
|
|
{ 12500, 8}, /* 80Hz */
|
|
{ 20000, 5}, /* 50Hz SENSOR_DELAY_GAME */
|
|
{ 25000, 4}, /* 40Hz */
|
|
{ 50000, 2}, /* 20Hz */
|
|
{ 60000, 2}, /* 16Hz SENSOR_DELAY_UI */
|
|
{100000, 1}, /* 10Hz */
|
|
{125000, 1} /* 8Hz SENSOR_DELAY_NORMAL */
|
|
};
|
|
|
|
/*!
|
|
Sleep function in millisecond.
|
|
*/
|
|
inline void msleep(signed int msec)
|
|
{
|
|
usleep(1000 * msec);
|
|
}
|
|
|
|
/*!
|
|
Check if measurement stop event is occurred. This function should not be
|
|
called except the application is run as ConsoleMode.
|
|
@return If event is not occurred, the return value is 0. When this function
|
|
fails, the return value is -1. When this function succeeds, the return
|
|
value is positive value.
|
|
*/
|
|
int16 checkKeyConsole(void)
|
|
{
|
|
int ch;
|
|
int len;
|
|
struct input_event ev;
|
|
|
|
if (s_keyFile < 0) {
|
|
return -1;
|
|
}
|
|
|
|
len = read(s_keyFile, &ev, sizeof(ev));
|
|
|
|
while (len > 0) {
|
|
if ((ev.type == EV_KEY) && (ev.value == 0)) {
|
|
ch = (ev.code == KEY_ENTER) ? AKKEY_STOP_MEASURE : ev.code;
|
|
return ch;
|
|
}
|
|
len = read(s_keyFile, &ev, sizeof(ev));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*!
|
|
Open device driver for checking measurement stop condition.
|
|
@return If function succeeds, the return value is 1. Otherwise, the return
|
|
value is 0.
|
|
*/
|
|
int16 openKey(void)
|
|
{
|
|
if (s_opmode) {
|
|
if (s_keyFile < 0) {
|
|
s_keyFile = open("/dev/input/event0", O_RDONLY | O_NONBLOCK);
|
|
if (s_keyFile < 0) {
|
|
s_keyFile = -1;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*!
|
|
Close device driver for checking measurement stop condition.
|
|
*/
|
|
void closeKey(void)
|
|
{
|
|
if (s_keyFile != -1) {
|
|
close(s_keyFile);
|
|
s_keyFile = -1;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
Check if measurement stop event is occurred.
|
|
@return If event is not occurred, the return value is 0. When this function
|
|
fails, the return value is -1. When this function succeeds, the return
|
|
value is positive value.
|
|
*/
|
|
int16 checkKey(void)
|
|
{
|
|
if (s_opmode) {
|
|
return checkKeyConsole();
|
|
} else {
|
|
return s_stopRequest ? AKKEY_STOP_MEASURE : AKKEY_NONE;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
Open device driver which detects current formation
|
|
@return If function succeeds, the return value is 1. Otherwise, the return
|
|
value is 0.
|
|
*/
|
|
int16 openFormation(void)
|
|
{
|
|
if (s_formFile < 0) {
|
|
s_formFile = 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*!
|
|
Close device driver
|
|
*/
|
|
void closeFormation(void)
|
|
{
|
|
if (s_formFile != -1) {
|
|
s_formFile = -1;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
Get current formation
|
|
@return The number represents current form.
|
|
*/
|
|
int16 getFormation(void)
|
|
{
|
|
return AKMD_FORM0;
|
|
}
|
|
|
|
/*!
|
|
Get valid measurement interval and HDOE decimator.
|
|
@return If this function succeeds, the return value is 1. Otherwise 0.
|
|
*/
|
|
int16 GetValidInterval(const int32 request, /*!< Request of interval in
|
|
microsecond */
|
|
AKMD_INTERVAL* interval /*!< Actual interval */
|
|
)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < NUMOF_AKMD_INTERVAL; i++) {
|
|
*interval = s_interval[i];
|
|
if (request <= s_interval[i].interval) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
|