#include "structDefs.h"

int main(int argc, char **argv)
{

   char buf[2500];
   measT *mt = new measT;

   // Set up a basic measT and serialize it into a buffer
   // 
   mt->dataType = 1;
   mt->numMeas = 4;
   mt->ranges = new double[4];   for (int i = 0; i < mt->numMeas; i++) mt->ranges[i] = i;
   mt->covariance = new double[4]; for (int i = 0; i < mt->numMeas; i++) mt->covariance[i] = i;
   mt->alphas = new double[4];   for (int i = 0; i < mt->numMeas; i++) mt->alphas[i] = i+10;
   mt->measStatus = new bool[4]; for (int i = 0; i < mt->numMeas; i++) mt->measStatus[i] = true;
   for (int i = 0; i < mt->numMeas; i++) printf("\tranges[%d] = %f\n", i, mt->ranges[i]);
   for (int i = 0; i < mt->numMeas; i++) printf("\talphas[%d] = %f\n", i, mt->alphas[i]);
   for (int i = 0; i < mt->numMeas; i++) printf("\tmeasStatus[%d] = %d\n", i, mt->measStatus[i]);

   printf("Packed   %d bytes\n", mt->serialize(buf, 2500));

   // Create a different measT, and unserialize the buffer into it, then compare
   // 
   measT mtNew;
   printf("Unpacked %d bytes\n", mtNew.unserialize(buf, 2500));
   for (int i = 0; i < mt->numMeas; i++) printf("\tranges[%d] = %f\n", i, mtNew.ranges[i]);
   for (int i = 0; i < mt->numMeas; i++) printf("\talphas[%d] = %f\n", i, mtNew.alphas[i]);
   for (int i = 0; i < mt->numMeas; i++) printf("\tmeasStatus[%d] = %d\n", i, mtNew.measStatus[i]);

   // Test the operator= function and compare
   // 
   mtNew.clean();
   mtNew = *mt;
   for (int i = 0; i < mt->numMeas; i++) printf("\tranges[%d] = %f\n", i, mtNew.ranges[i]);
   for (int i = 0; i < mt->numMeas; i++) printf("\talphas[%d] = %f\n", i, mtNew.alphas[i]);
   for (int i = 0; i < mt->numMeas; i++) printf("\tmeasStatus[%d] = %d\n", i, mtNew.measStatus[i]);

   // Create a commsT object with the measT as the payload, serialize it.
   // 
   commsT ct(TRN_MEAS, 3, mtNew);
   printf("%s\n", ct.to_s(buf, 2500));
   printf("Packed commsT into %d bytes\n", ct.serialize(buf, 2500));

   // Create a different commsT, unserialize the buffer into it. Compare.
   // 
   commsT ctNew; //ct.clean();
   ctNew.unserialize(buf, 2500);
   printf("%s\n", ctNew.to_s(buf, 2500));

   printf("Clean up...\n");
   mt->clean();
   delete mt;

   return 0;
}