//CRITICAL SECTION (Don't access file while sensor thread is writing to it!)
pthread_mutex_lock(&(s->mutex));
- FILE * file = fopen(s->filename, "rb");
- if (file == NULL)
- {
- Log(LOGWARN, "Couldn't open file \"%s\" mode rb - %s", s->filename, strerror(errno));
- }
- else
- {
- fseek(file, (s->read_offset)*sizeof(DataPoint), SEEK_SET);
- amount_read = fread(&buffer, sizeof(DataPoint), QUERY_BUFSIZ, file);
- s->read_offset += amount_read;
- Log(LOGDEBUG, "Read %d data points; offset now at %d", amount_read, s->read_offset);
-
- fclose(file);
- }
-
+ fseek(s->file, -QUERY_BUFSIZ*sizeof(DataPoint), SEEK_END);
+ amount_read = fread(&buffer, sizeof(DataPoint), QUERY_BUFSIZ, s->file);
+ Log(LOGDEBUG, "Read %d data points", amount_read);
+
pthread_mutex_unlock(&(s->mutex));
//End critical section
*/
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;
+ #define FILENAMESIZE 4
+ char filename[FILENAMESIZE];
if (s->id >= pow(10, FILENAMESIZE))
{
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
+
+ sprintf(filename, "%d", s->id);
+ unlink(filename); //TODO: Move old files somewhere
- Log(LOGDEBUG, "Initialised sensor %d; binary file is \"%s\"", id, s->filename);
+ 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);
-
pthread_mutex_unlock(&(s->mutex));
// End of critical section
/** Number of data points to keep in sensor buffers **/
#define SENSOR_DATABUFSIZ 10
+
/** Number of sensors **/
#define NUMSENSORS 1
-#define FILENAMESIZE 10
-
/** Structure to represent data recorded by a sensor at an instant in time **/
typedef struct
{
/** Offset position in binary file for query thread to read from**/
int read_offset;
/** File to write data into when buffer is full **/
- char filename[FILENAMESIZE];
+ FILE * file;
/** Thread running the sensor **/
pthread_t thread;
/** Mutex to protect access to stuff **/