Initial commit

This commit is contained in:
Thomas Klaehn
2019-07-25 16:36:38 +02:00
commit eadddf7334
9 changed files with 7772 additions and 0 deletions

100
src/ads1115.c Normal file
View File

@@ -0,0 +1,100 @@
#include <assert.h>
#include <stdlib.h>
#include <syslog.h>
#include <stdbool.h>
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <ads1115.h>
#define BUF_SIZE 3
#define VPS 6.144 / 32768.0
int ads1115_open(const struct ads1115_dev *ads1115)
{
int res;
assert(NULL != ads1115);
syslog(LOG_DEBUG, "Trying to open i2c_bb.\n");
res = i2c_open(ads1115->i2c_dev);
if(res != 0) {
syslog(LOG_ERR, "Unable to open i2c_bb.\n");
return res;
}
syslog(LOG_DEBUG, "i2c dev successfully opened.\n");
return 0;
}
int ads1115_close(const struct ads1115_dev *ads1115)
{
assert(NULL != ads1115);
return i2c_close(ads1115->i2c_dev);
}
int ads1115_start_conversation(const struct ads1115_dev *ads1115)
{
int res;
char buffer[BUF_SIZE];
assert(NULL != ads1115);
syslog(LOG_DEBUG, "ads1115 start conversation.\n");
/* FIXME: prevent hard coded config. */
buffer[0] = 0b00000001; // config register @ address 1
buffer[1] = 0b11000001; // config value high byte
buffer[2] = 0b10000111; // config value low byte
// begin conversation
res = i2c_write(ads1115->i2c_dev, ads1115->i2c_slave_address, buffer, BUF_SIZE);
if(res != BUF_SIZE) {
syslog(LOG_ERR, "Unable to write to ADS1115.\n");
i2c_close(ads1115->i2c_dev);
return res;
}
syslog(LOG_DEBUG, "ads1115 conversation done.\n");
return 0;
}
int ads1115_read_conversation_result(const struct ads1115_dev *ads1115,
struct ads1115_conversation_result *result)
{
int res;
char buffer[BUF_SIZE];
assert(NULL != ads1115);
assert(NULL != result);
// wait for conversation complete
do {
res = i2c_read(ads1115->i2c_dev, ads1115->i2c_slave_address, buffer, 2);
if(res != 2) {
syslog(LOG_ERR, "Unable to read from ADS1115.\n");
return res;
}
} while((buffer[0] & 0x80) == 0);
// read conversation result
buffer[0] = 0b00000000; /* conversation register at address 0b00000000 */
res = i2c_write(ads1115->i2c_dev, ads1115->i2c_slave_address, buffer, 1);
if(res != 1) {
syslog(LOG_ERR, "Unable to write to ADS1115.\n");
return res;
}
// read 2 bytes
res = i2c_read(ads1115->i2c_dev, ads1115->i2c_slave_address, buffer, 2);
if(res != 2) {
syslog(LOG_ERR, "Unable to read from ADS1115.\n");
return res;
}
result->raw = buffer[0] << 8 | buffer[1];
result->voltage = result->raw * VPS;
return 0;
}