#include <limits.h>
#include <errno.h>
#define GYRO_CALIBRATE
#define DENOISE_MEDIAN
#ifdef GYRO_CALIBRATE
#include <math.h>
#define GYRO_MAX_ERR 0.05
#define GYRO_DS_SIZE 100
#endif
#ifdef DENOISE_MEDIAN
#define GYRO_DENOISE_MAX_SAMPLES 5
#define GYRO_DENOISE_NUM_FIELDS 3
#endif
#define GYRO_DROP_SAMPLES 5
#ifdef GYRO_CALIBRATE
};
#endif
#ifdef DENOISE_MEDIAN
};
#endif
#ifdef GYRO_CALIBRATE
#endif
#ifdef DENOISE_MEDIAN
#endif
};
static bool
{
}
static void
{
} else {
SOL_WRN(
"Unable to connect, retrying...");
return;
}
}
static void
{
}
#ifdef GYRO_CALIBRATE
static void
{
}
static bool
{
if (fabs(x) >= 1 || fabs(y) >= 1 || fabs(z) >= 1) {
return false;
}
if (x < cal_data->min_x)
if (y < cal_data->min_y)
if (z < cal_data->min_z)
else {
}
return false;
}
return true;
}
static void
{
double near_zero;
near_zero = 0.02;
else
near_zero = 0.1;
if (fabs(*x) < near_zero && fabs(*y) < near_zero && fabs(*z) < near_zero) {
*x *= 0.000001;
*y *= 0.000001;
*z *= 0.000001;
}
}
#endif
#ifdef DENOISE_MEDIAN
static unsigned int
partition(
double *list,
unsigned int left,
unsigned int right,
unsigned int pivot_index)
{
unsigned int i;
unsigned int store_index = left;
double aux;
double pivot_value = list[pivot_index];
aux = list[pivot_index];
list[pivot_index] = list[right];
list[right] = aux;
for (i = left; i < right; i++) {
if (list[i] < pivot_value) {
aux = list[store_index];
list[store_index] = list[i];
list[i] = aux;
store_index++;
}
}
aux = list[right];
list[right] = list[store_index];
list[store_index] = aux;
return store_index;
}
static double
{
unsigned int left = 0;
unsigned int right = size - 1;
unsigned int pivot_index;
unsigned int median_index = (right / 2);
double temp[size];
memcpy(temp, queue, size * sizeof(double));
if (left == right)
return temp[left];
while (left < right) {
pivot_index = (left + right) / 2;
pivot_index =
partition(temp, left, right, pivot_index);
if (pivot_index == median_index)
return temp[median_index];
else if (pivot_index > median_index)
right = pivot_index - 1;
else
left = pivot_index + 1;
}
return temp[left];
}
static void
{
unsigned int offset;
offset = 0;
filter_data->
buff[offset + filter_data->
idx] = *x;
filter_data->
buff[offset + filter_data->
idx] = *y;
filter_data->
buff[offset + filter_data->
idx] = *z;
}
#endif
static void
{
int r;
char buffer[128];
#ifdef GYRO_CALIBRATE
#endif
#ifdef DENOISE_MEDIAN
#endif
return;
}
#ifdef GYRO_CALIBRATE
out.x = out.x - cal_data->
bias_x;
out.y = out.y - cal_data->
bias_y;
out.z = out.z - cal_data->
bias_z;
#endif
#ifdef DENOISE_MEDIAN
#endif
#ifdef GYRO_CALIBRATE
#endif
#ifdef GYRO_CALIBRATE
snprintf(buffer, sizeof(buffer) - 1, "%f\t%f\t%f\t[rad/sec]\t(%s)", out.x, out.y, out.z,
(cal_data->
calibrated ?
"Calibrated" :
"Not calibrated"));
#else
snprintf(buffer, sizeof(buffer) - 1, "%f\t%f\t%f\t[rad/sec]\t(Calibration disabled)",
out.x, out.y, out.z);
#endif
printf("%s\n", buffer);
if (gyro_data->
mqtt == NULL) {
return;
}
.retain = false,
};
SOL_WRN(
"Unable to publish message");
}
}
return;
error:
SOL_WRN(
"Could not read channel buffer values");
}
int
main(
int argc,
char *argv[])
{
.clean_session = true,
.keep_alive = 60,
.handlers = {
},
};
int device_id;
if (argc < 11) {
fprintf(stderr, "\nUsage: %s <device name> <trigger name> <buffer size> " \
"<sampling frequency> <scale> <custom offset> <offset> " \
"<MQTT broker ip> <MQTT broker port> <MQTT topic>\n" \
"\t<buffer size>:\t\t0=default\n" \
"\t<sampling frequency>:\t-1=default\n" \
"\t<scale>:\t\t<-1=default\n" \
"\t<custom offset>:\ty or n\n" \
"\t<offset>:\t\tonly take effect if custom offset is \"y\"\n" \
"Press CTRL + C to quit\n" \
, argv[0]);
return 0;
}
iio_config.trigger_name = strdup(argv[2]);
iio_config.buffer_size = atoi(argv[3]);
iio_config.sampling_frequency = atoi(argv[4]);
channel_config.scale = atof(argv[5]);
if (strncmp(argv[6], "y", 1) == 0) {
channel_config.
offset = atoi(argv[7]);
} else
iio_config.
data = &gyro_data;
mqtt_config.
host = argv[8];
mqtt_config.
port = atoi(argv[9]);
&channel_config);
&channel_config);
&channel_config);
#ifdef GYRO_CALIBRATE
#endif
#ifdef DENOISE_MEDIAN
#endif
#ifdef DENOISE_MEDIAN
#endif
return 0;
error_iio:
if (device) {
}
}
#ifdef DENOISE_MEDIAN
}
#endif
return -1;
}