OrangePi3 LTS 驱动开发- veml7700 轮询解析
上面一章如果驱动加载正常的话,节点显示如下:
所以,我们去轮询读取lux节点的数据就好了。
代码
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#define ERR_BUF_MAX 64
#define NODE_BUF_MAX 128
#define MAX_ARG_NUM 64
#define VEML_FILE_PATH "/sys/class/max_veml7700/veml7700"
#define VEML_SUPPORT_PATH "/sys/class/max_veml7700/veml7700/support"
#define VEML_GAIN_PATH "/sys/class/max_veml7700/veml7700/gain"
#define VEML_IT_PATH "/sys/class/max_veml7700/veml7700/it"
#define VEML_LUX_PATH "/sys/class/max_veml7700/veml7700/lux"
#define ALS_GAIN_X1 0x0
#define ALS_GAIN_X2 0x1
#define ALS_GAIN_d8 0x2
#define ALS_GAIN_d4 0x3
#define ALS_INTEGRATION_25ms 0xC
#define ALS_INTEGRATION_50ms 0x8
#define ALS_INTEGRATION_100ms 0x0
#define ALS_INTEGRATION_200ms 0x1
#define ALS_INTEGRATION_400ms 0x2
#define ALS_INTEGRATION_800ms 0x3
int sysfs_read(const char *path, char *buf, int count)
{
char err_buf[ERR_BUF_MAX];
int size;
int fd;
fd = open(path, O_RDONLY);
if (fd < 0) {
strerror_r(errno, err_buf, sizeof(err_buf));
printf("Error open %s: %s\n", path, err_buf);
return -1;
}
memset(buf, 0, count);
size = read(fd, buf, count - 1);
if(size < 0) {
strerror_r(errno, err_buf, sizeof(err_buf));
printf("Error read %s: %s\n", path, err_buf);
} else {
buf[size] = '\0';
}
close(fd);
printf("count = %d, read size = %d \n",count,size);
printf(" %s -> buf = %s ",__FUNCTION__,buf);
return size;
}
int sysfs_write(const char *path, char *buf)
{
char err_buf[ERR_BUF_MAX];
int size;
int fd;
fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0644);
if (fd < 0) {
strerror_r(errno, err_buf, sizeof(err_buf));
printf("Error open %s: %s\n", path, err_buf);
return -1 ;
}
printf(" %s -> buf = %s ",__FUNCTION__,buf);
size = write(fd, buf, strlen(buf));
if (size < 0) {
strerror_r(errno, err_buf, sizeof(err_buf));
printf("Error write %s: %s\n", path, err_buf);
}
close(fd);
return size;
}
int sysfs_write_int(const char *path, int val)
{
char buf[NODE_BUF_MAX];
snprintf(buf, sizeof(buf), "%d", val);
return sysfs_write(path,buf);
}
int sysfs_read_int(const char *path)
{
int fd;
int val = 0;
char bcmd[16];
fd = open(path, O_RDONLY);
if (fd >= 0) {
read(fd, bcmd, sizeof(bcmd));
val = strtol(bcmd, NULL, 10);
close(fd);
} else {
printf("unable to open file %s,err: %s", path, strerror(errno));
}
return val;
}
int get_is_support_light_sensor(bool *support)
{
*support = sysfs_read_int(VEML_SUPPORT_PATH);
return 0;
}
int get_light_sensor_gain(unsigned short *gain)
{
*gain = sysfs_read_int(VEML_GAIN_PATH);
return 0;
}
int get_light_sensor_it(unsigned short *it)
{
*it = sysfs_read_int(VEML_IT_PATH);
return 0;
}
int get_light_sensor_lux(unsigned short *it)
{
*it = sysfs_read_int(VEML_LUX_PATH);
return 0;
}
void scale_lux(unsigned short raw_counts, float *lux)
{
unsigned short gain;
unsigned short itime;
get_light_sensor_gain(&gain);
get_light_sensor_it(&itime);
float factor1, factor2;
switch(gain & 0x3){
case ALS_GAIN_X1:
factor1 = 1.f;
break;
case ALS_GAIN_X2:
factor1 = 0.5f;
break;
case ALS_GAIN_d8:
factor1 = 8.f;
break;
case ALS_GAIN_d4:
factor1 = 4.f;
break;
default:
factor1 = 1.f;
break;
}
switch(itime){
case ALS_INTEGRATION_25ms:
factor2 = 0.2304f;
break;
case ALS_INTEGRATION_50ms:
factor2 = 0.1152f;
break;
case ALS_INTEGRATION_100ms:
factor2 = 0.0576f;
break;
case ALS_INTEGRATION_200ms:
factor2 = 0.0288f;
break;
case ALS_INTEGRATION_400ms:
factor2 = 0.0144f;
break;
case ALS_INTEGRATION_800ms:
factor2 = 0.0072f;
break;
default:
factor2 = 0.2304f;
break;
}
*lux = raw_counts * factor1 * factor2;
printf("this is value %f\n",*lux);
// apply correction from App. Note for all readings
// using Horner's method
*lux = *lux * (1.0023f + *lux * (8.1488e-5f + *lux * (-9.3924e-9f +
*lux * 6.0135e-13f)));
}
int main(int argc,char *argv[])
{
bool is_support;
unsigned short reg_value;
float light_value;
get_is_support_light_sensor(&is_support);
if (is_support){
printf("Support light sensor, model Veml7700\n");
do
{
get_light_sensor_lux(®_value);
scale_lux(reg_value,&light_value);
/* code */
printf("get light sensor value = %f\n",light_value);
sleep(3);
} while (1);
}
return 0;
}