Data Acquisition Example Code
dataacq.cpp

/*********************************************** 
 * File: dataacq.cpp                           *
 * This program is used to send a mobile agent * 
 * to an agency running on a gumstix, retrieve * 
 * the data carried back by the mobile agent,  * 
 * and create a graph and text output          * 
 ***********************************************/ 
#include <libmc.h>
#include <stdio.h>
#include <stdlib.h>
#include <chplot.h>

using namespace std;

int main(int argc, char *argv[]) {
    MCAgency_t agency;
    MCAgent_t agent;
    int *extent;
    int dim;
    double *ret;
    double **data;
    double *x;
    int i, j, k, size;
    class CPlot plot;

    if(argc == 2) {
        printf("Starting agency listening on port %d.\n", atoi(argv[1]));
        agency = MC_Initialize(atoi(argv[1]), NULL);
    }
    else {
        agency = MC_Initialize(5130, NULL);
    }
    MC_SendAgentMigrationMessageFile(agency,
                                     "agent_dataacq.xml",
                                     "bird3.engr.ucdavis.edu",
                                     5050);
    while(1) {
        printf("Waiting for agent return...\n");
        MC_WaitSignal(agency, MC_RECV_RETURN);
        agent = MC_FindAgentByName(agency, "mobagent1");
        if(agent == NULL) {
            MC_ResetSignal(agency);
            continue;
        }
        if(MC_GetAgentType(agent) != MC_RETURN_AGENT) {
            MC_ResetSignal(agency);
            continue;
        }
        else {
            break;
        }
    }
    MC_GetAgentReturnData(agent, 0, (void**)&ret, &dim, &extent);
    MC_ResetSignal(agency);

    printf("dim is %d\n", dim);
    printf("Extents are: ");
    size = 1;
    for(i=0; i<dim; i++) {
        printf("%d ", extent[i]);
        size *= extent[i];
    }
    printf("\n");
    printf("%d Elements:\n", size);

    x = (double *)malloc(extent[1]*sizeof(double));
    data = (double **)malloc(extent[0]*sizeof(double *));
    for(i=0; i<extent[0]; i++) {
        data[i] = (double *)malloc(extent[1]*sizeof(double));
    }

    k = 0;
    for(i=0; i<extent[0]; i++) {
        if(i == 0) {
            printf("\nX axis:");
        }
        else if(i == 1) {
            printf("\nY axis:");
        }
        for(j=0; j<extent[1]; j++) {
            data[i][j] = ret[k];
            if(!(j % 13)) {
                printf("\n");
            }
            printf("%.2f ", data[i][j]);
            k++;
        }
        printf("\n");
    }

    for(i=0; i<extent[1]; i++) {
        x[i] = i+1;
    }

    plot.data2DCurve(x, data[0], extent[1]);
    plot.data2DCurve(x, data[1], extent[1]);
    plot.legend("X Axis", 0);
    plot.legend("Y Axis", 1);
    plot.label(PLOT_AXIS_X, "Sample");
    plot.label(PLOT_AXIS_Y, "Acceleration (m/s^2)");
    plot.plotting();

    free(x);
    for(i=0; i<extent[0]; i++) {
        free(data[i]);
    }
    free(data);

    return 0;
}
  
agent_dataacq.xml
<?xml version="1.0"?>

<!DOCTYPE myMessage SYSTEM "gafmessage.dtd">

<GAF_MESSAGE>
<MESSAGE message="MOBILE_AGENT">
<MOBILE_AGENT>
<AGENT_DATA>
<NAME>mobagent1</NAME>
<OWNER>IEL</OWNER>
<HOME>iel2.engr.ucdavis.edu:5130</HOME>
<TASKS task="1" num="0">
<TASK num="0" 
      return="a" 
      complete="0" 
      server="bird3.engr.ucdavis.edu:5050">
</TASK>
<AGENT_CODE>
<![CDATA[
#include "i2c-io-api.h"
#define MEANX 512.0
#define MEANY 509.0
#define DELTA 208.0 
#define ACCELG 9.8 

double a[2][100];

int main() {
  char* i2cDevName = "/dev/i2c-0";
  char* gI2cAddr = "0x0b";
  int ret, count = 0, channel = 64;
  uint16_t adcVal = 0;
  ret = I2C_IO_Init(i2cDevName, gI2cAddr);
  for(count=0; count<100; count++) {
      if(I2C_IO_GetADC(ret, channel, &adcVal)) {
          a[0][count] = ((adcVal-MEANX)/DELTA)*ACCELG;
      }
      if(I2C_IO_GetADC(ret, channel+1, &adcVal)) {
          a[1][count] = ((adcVal-MEANY)/DELTA)*ACCELG;
      }
  }
  I2C_IO_CloseDev();
  return 0;
}
]]>
</AGENT_CODE>
</TASKS>
</AGENT_DATA>
</MOBILE_AGENT>
</MESSAGE>
</GAF_MESSAGE>