Change sensor data transfer
authorSam Moore <[email protected]>
Sun, 18 Aug 2013 13:11:37 +0000 (21:11 +0800)
committerSam Moore <[email protected]>
Sun, 18 Aug 2013 13:11:37 +0000 (21:11 +0800)
 - Keep binary file always open (mode "a+b"); don't need to reopen each time it is accessed
 - Fill query buffer with most recent datapoints (as opposed to trying to transfer datapoints in sequential order)
   - Better because it keeps client as up to date as possible
   - Rather than client getting increasingly outdated data

TODO:
 - Test to see if buffers in front of writing to file worth it
   - Probably will be; saves from having to unlock mutex on every single data point
 - Merge Query and FCGI stuff

server/query.c
server/sensor.c
server/sensor.h

index 8499e37..86696bb 100644 (file)
@@ -25,21 +25,10 @@ void QuerySensor(int id) //TODO: This code will form the SensorHandler FastCGI f
        //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
 
index a3d3f0b..b746134 100644 (file)
@@ -48,8 +48,8 @@ DataPoint GetData(int sensor_id)
  */
 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);
 }
 
 
@@ -64,14 +64,18 @@ void Sensor_Init(Sensor * s, int id)
        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);
 }
 
 
@@ -104,23 +108,13 @@ void * Sensor_Main(void * arg)
 
                // 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
 
index e51ab0c..ae17ce3 100644 (file)
 /** 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
 {
@@ -40,7 +39,7 @@ 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 **/

UCC git Repository :: git.ucc.asn.au