*/
void Destroy(Sensor * s)
{
- //TODO: Surely we'll need to do something here?
// Maybe move the binary file into long term file storage?
+ fclose(s->file);
}
s->read_offset = 0;
s->id = id;
- if (s->id >= pow(10, FILENAMESIZE))
+ #define FILENAMESIZE BUFSIZ
+ char filename[FILENAMESIZE];
+ //if (s->id >= pow(10, FILENAMESIZE))
+ if (false)
{
Fatal("Too many sensors! FILENAMESIZE is %d; increase it and recompile.", FILENAMESIZE);
}
- sprintf(s->filename, "%d", s->id);
- unlink(s->filename); //TODO: Move old files somewhere
- Log(LOGDEBUG, "Initialised sensor %d; binary file is \"%s\"", id, s->filename);
+ pthread_mutex_init(&(s->mutex), NULL);
+
+ sprintf(filename, "%d", s->id);
+ unlink(filename); //TODO: Move old files somewhere
+
+ s->file = fopen(filename, "a+b"); // open binary file
+ Log(LOGDEBUG, "Initialised sensor %d; binary file is \"%s\"", id, filename);
}
// CRITICAL SECTION (no threads should be able to read/write the file at the same time)
pthread_mutex_lock(&(s->mutex));
-
- // Open binary file in append mode and dump buffer into it
- FILE * file = fopen(s->filename, "ab");
- if (file == NULL)
- {
- Fatal("Couldn't open file \"%s\" mode ab - %s", s->filename, strerror(errno));
- }
- int amount_written = fwrite(s->buffer, sizeof(DataPoint), SENSOR_DATABUFSIZ, file);
+ fseek(s->file, 0, SEEK_END);
+ int amount_written = fwrite(s->buffer, sizeof(DataPoint), SENSOR_DATABUFSIZ, s->file);
if (amount_written != SENSOR_DATABUFSIZ)
{
Fatal("Wrote %d data points and expected to write %d to \"%s\" - %s", amount_written, SENSOR_DATABUFSIZ, strerror(errno));
}
-
- Log(LOGDEBUG, "Wrote %d data points for sensor %d", amount_written, s->id);
-
- fclose(file);
-
+ //Log(LOGDEBUG, "Wrote %d data points for sensor %d", amount_written, s->id);
pthread_mutex_unlock(&(s->mutex));
// End of critical section
return NULL;
}
+/**
+ * Fill buffer with most recent sensor data
+ * @param s - Sensor to use
+ * @param buffer - Buffer to fill
+ * @param bufsiz - Size of buffer to fill
+ * @returns The number of DataPoints actually read
+ */
+int Sensor_Query(Sensor * s, DataPoint * buffer, int bufsiz)
+{
+ int amount_read = 0;
+ //CRITICAL SECTION (Don't access file while sensor thread is writing to it!)
+ pthread_mutex_lock(&(s->mutex));
+
+ fseek(s->file, -bufsiz*sizeof(DataPoint), SEEK_END);
+ amount_read = fread(buffer, sizeof(DataPoint), bufsiz, s->file);
+ //Log(LOGDEBUG, "Read %d data points", amount_read);
+ pthread_mutex_unlock(&(s->mutex));
+ return amount_read;
+}
+