/* 2014/8/8 Rev1.0 Copyright (C) Sadaji Sunaga This module is free. */ #include "my_i2c_sensors.h" #include "i2c-dev.h" static int writeSensor(int fd, int sensorAddr, u_char regNo, u_char data); int openI2C(char* deviceName){ int fd = open(deviceName, O_RDWR); if (fd < 0) { return -1; } return fd; } int SetSmbus (int fd, char rw, int command, int size, union i2c_smbus_data *data) { struct i2c_smbus_ioctl_data args ; args.read_write = rw ; args.command = command ; args.size = size ; args.data = data ; return ioctl(fd, I2C_SMBUS, &args) ; } static u_char readSensor(int fd, int sensorAddr, u_char regNo) { union i2c_smbus_data data; if (ioctl(fd, I2C_SLAVE, sensorAddr) < 0) { return -1; } if (SetSmbus (fd, I2C_SMBUS_READ, regNo, I2C_SMBUS_BYTE_DATA, &data) < 0) { return 0; } return ( u_char)(data.byte & 0xFF); } static int writeSensor(int fd, int sensorAddr, u_char regNo, u_char data) { u_char buf[2]; if (ioctl(fd, I2C_SLAVE, sensorAddr) < 0) { return -1; } buf[0] = regNo; buf[1] = data; if((write(fd,buf,2))!=2) { return -1; } return 1; } float getTempareture(int fd) { float temp = 0.0f; int h,l; l = readSensor(fd, LPS331AP_ADDR, 0x2b); h = readSensor(fd, LPS331AP_ADDR, 0x2c); short t = (short)((h << 8) + l); temp = (float)t / 480.0f + 42.5f; return temp; } float getPressure(int fd) { int h,m,l; l = readSensor(fd, LPS331AP_ADDR, 0x28); m = readSensor(fd, LPS331AP_ADDR, 0x29); h = readSensor(fd, LPS331AP_ADDR, 0x2a); int data = (h << 16) + (m << 8) + l; float press = (float)data / 4096.0f; return press; } int activateLPS331AP(int fd) { return writeSensor(fd, LPS331AP_ADDR, 0x20, 0x90); }