Back to Main Page, Next: Mobility in Publish/Subscribe Systems

ProceduralExample

This is a part of a larger factory floor monitoring application that monitors temperature sensors as potential indicators of anomalous conditions (e.g.,~temperature > 100 in some area of the factory floor). Upon detection of this event, additional sensors are tasked in the affected area. These sensors then collect additional information to try to determine the precise cause of the anomalous temperature readings.

In the code shown here, two kinds of additional sensor readings are collected. Based on these readings, a diagnosis of the cause of the problem is made, and this decision is forwarded to the central node, which notifies a human user. Once the temperature returns to normal, tasking of the extra sensors in the particular area stops and the application resumes passive monitoring of the factory floor.

TASK MonitorTempHandler {
        private dummyCnt;
        private affectedArea;
        private temp;
}

TASKRUN MonitorTempHandler {

        ! New tuple received, process it
        temp = getTupleAttr(a_tempsensor_sample)
        affectedArea = getTupleAttr(a_arealocation)

        if temp > CRITICAL_TEMP then
               ! Initiate detailed monitoring
               newTuple();
               setTupleAttr(a_arealocation, affectedArea);
               setTupleAttr(a_rich_sensor_command, V_RICHSENSOR_SENSE);
               insertTuple(MonitorTempView);
        end if
}

TASK DiagnosticHandler {
       private dummyCnt;
       private richSensor1; ! data from rich sensors
       private richSensor2;
       private view;
       private sample;
       private diagnosis;
}

TASKRUN DiagnosticHandler  {

        ! New tuple received, process it
        view = getView();
        sample = getTupleAttr(a_rich_sensor_sample);
        affectedArea = getTupleAttr(a_arealocation);

        ! What view did we read this from
        if view = V_RICHSENSOR1 then
               richSensor1 = sample
        else
               richSensor2 = sample
        end if

        ! Diagnose the problem
        if richSensor1 < richSensor2 then
               diagnosis = ONFIRE
        end if
        if richSensor2 > richSensor1 then 
               diagnosis = ONFLOOD
        else
               diagnosis = INSUFFICIENT_DATA
        end if

        ! Record the diagnosis
        newTuple();
        setTupleAttr(a_arealocation, affectedArea);
        setTupleAttr(a_subtype_diagnostic_result, V_DIAGNOSTIC_RESULT_INSUFFICIENTDATA);
        insertTuple(DiagnositcView);
}
Page last modified on September 09, 2006, at 08:18 PM