Data Service Engine
Tom Schoellhammer, Mohammad Rahimi, Eric Osterweil, Mike Wimbrow
Executive Summary
It is the job of the Data Service Engine (DSE) to accept queries
from the system bus (for which we plan to use Tiny Diffusion)
and then to evaluate them, returning any query results to the queryer.
A query can be one of three things:
- Data Query
- System State Query
- Configuration Command
The DSE first evaluates whether there are enough resources to execute
the query. If so, the DSE then executes the query and returns any
desired results to the system bus.
The Query Engine interfaces with the system bus to provide data
services to the system. The Query Engine needs to know how to
interpret queries and measurement names, but need not know any details
about the sampling hardware itself. For this reason, the combination
of the Data Map and the Transform Manager abstract away the details of
physical sensors. The Data Map takes a high-level measurement name
and translates it into a physical address for the sensor (ADC
channel/hardware address, Event Counter, Pulse rate counter, Mica2
battery voltage, SIB Temp, SIB Humidity, or virtual sensor). Once the
sensor data is ready, the Transform Manager changes the raw sensor
value into appropriate measurement units. This data is then used by
the Query Engine to satisfy standing queries.
|
In the case of a configuration command, the message is directed to the
Configuration Handler (CH). These messages are used to configure the
DM so that it can use additional sensors. The CH interfaces with the
EEPROM driver so that configuration information can be stored in a
non-volatile manner. Rebooting the mote then does not neccessitate
reconfiguring the mote.
|
The target platform for the DSE is TinyOS running on Mica2
motes. Each mote will be outfitted with a
Mica2 Data Aquisition
Board.
Component Decomposition
The DSE is broken into six pieces. The Query Engine (QE) interfaces
with the system bus to accept queriess from it and provide data to it.
The QE uses the Query Table (QT) to store each query and any
associated state. The QT both allocates memory for each query and
marshalls access to allocated memory. The QE interfaces with the Data
Map (DM) in order to request data associated with a particular
measurement name. The DM is responsible for keeping track of the
parameters intrinsic to a particular sensor (detailed later). It also
translates a meaurement name into an hardware address (ADC channel
number). Once that translation is done the Sampler is tasked. When
that data is ready, the Transform Manager (TM) converts the raw ADC
value to a unitted data type. The TM uses DM to perform this
conversion. The TM then returns the data to the QE.
Query Engine
The QE's job is to
- Evaluate whether enough memory available to satisfy the query
- Evaluate whether the appropriate measurement names are available
- Execute the query
- Return the query result
In order to perform these three tasks the QE interfaces with three
components. The QE requests memory from the QT. The QT may deny
memory to the QE if there is not enough. In the event that there is
not enough memory the query is not executed.
Interfaces
- QeAcceptQueryI
This interface is presented to the system bus. Queries and data
are transmitted through this interface.
- QeAcceptDataI
This interface is presented to the TM. Data arrives with its
associated sampling ID. This data is then matched to the proper
query. A query that can now be evaluated (because all the
requisite data is ready) is then executed.
- QeStorageI
This interface is presented to the QT. It is used when the QE
wants to store something, or when it wants to gain access to
something that is already stored. In adddition, it also accepts
events from the QT when a buffer is done being stored.
Modules
- QueryEngineM
This module implements the QeAcceptQueryI, the QeAcceptDataI,
and the QeStorageI interfaces. When dealing with requests that
come over the QeAcceptQueryI interface its job is to evaulate
whether enough storage is available for the query and the
appropriate measurement names are avaialable. If some requisite
resource is not available then the system bus is notified that
the DSE cannot fulfill the query. When dealing with requests
that come from the QeAcceptDataI interface its job is to find
the query that the data is associated with, store the data, and
evaluate the query if all requisite data is available. The
QeStorageI interface allows the QT to send the QE an event when
a storage task has completed.
Testing
A test driver will be written to test the QE in the following ways:
- Unit Testing
Is query submission handled correctly
Is data stored correctly
Does query look up work correctly
Is query evaluation done correctly
Data Map
The first job of the DM is to provide the QE with a list of available
sensors. Its second job is to take handle sampling requests from the
QE. The DM receives requests from the QE that specifies a measurement
name and sampling period. The DM tranlates that measurement name into
an hardware address (ADC channel). The hardware address and sample
period are then passed to the Sampler. To do these jobs the DM
maintains a table that correlates a measurement name with sensor
parameters, hardware address, and transformation ID (detailed later). The
DM also accepts requests to either update or add entries to this table
Interfaces
- DmAcceptMnAndTI
This interface accepts a measurement name and period at which
that measurement name should be sampled. It also provides a
list of sensors that are available to the QE.
- DmMappingI
This interface allows another component to request the mapping
from either measurement name to hardware address, or from
hardware address to measurement name.
- DmUpdateTableI
This interface accepts a measurement name along with sensor
parameters and a transform identifier. The transform identifier
indicates which transform to apply to a raw ADC value.
Modules
- DataMapM
This module implements all Dm interfaces.
Testing
A test driver will be written to test the DM in the following ways:
- Unit Testing
Ensure that the correct data sheet parameters are stored
Test that the list of available sensors is returned correctly
Test that updates are performed correctly
Ensure that the correct mapping is being reported
Test that the table update works correcly
Transform Manager
The TM keeps a list of transforms that take raw ADC values as input
and convert them to meaningful unitted data types. In addition, it
supports an "identity" transform that does nothing to the data. This
identity transform can be used when a new sensor for which no
prespecified transform exists.
Interfaces
- TmTransformDataI
This interface accepts a raw ADC value, sampling ID, and
measurement so that the the ADC value can be appropriately
transformed.
Modules
- TransformManagerM
This module implements all Tm interfaces.
Testing
A test driver will be written to test the Transform manager in the
following ways:
- Unit Testing
Ensure that the correct mapping is being reported
Test that the table update works correcly
Query Table
It is the job of the Query Table to manage the memory required to
store a query as well as marshal access to query data structures. In
order to use memory efficiently and to avoid fragmentation the Query
Table performs memory compaction. To avoid inconsistancies caused by
changing the location of various data blocks the Query Table also can
grant or deny access to memory.
The Query Table needs an interface that will allow applications to
request storage as well as to request access to data already stored.
The QT accepts explicit requests to delete standing queries.
Interfaces
- QueryTableI
Handles the allocation of buffers and the access to buffers.
Modules
- QueryTableM
This module implements the storage functions of the QueryTableI
interface. The total amount of memory desired is allocated if there
is enough available memory. In addition, this module implements the
access functions for the QueryTableI interface. A query identifier
(either the query ID or a sampling ID) are used to find the
associated query.
Testing
A test driver will be written to test the QueryTable in the following ways:
- Is memory allocated correclty
- Is locking performed correclty
- Is compaction performed correclty
Configuration Handler
It is the job of the CH is to accept incoming configuration commands,
store them in non-volatile memory (EEPROM) and then update the DM with
the new configuration information. In addition, at startup, the CH
reads an existing configuration information and uses it to configure
the DM.
Although the diagram shows that the CH interfaces direclty with the
system bus it has not been decided whether it will interface directly
or some other multiplexing component will be used.
Interfaces
- ChAcceptCmdI
This interface is used to accept configuration command messages.
Modules
- ConfigurationHandlerM
This module implements the storage functions of the ChAcceptCmdI
interface.
Testing
A test driver will be written to test the QueryTable in the following ways:
- EEPROM Reading/Writing: write several configuration commands to
EEPROM and then read them back
- Configure the DM with various configuration commands and check
the DM's state to ensure they were successful
- Check that at startup the CH configures the DM correctly
according to existing configuration information stored in the EEPROM
Interfaces
- QeAcceptQueryI
The QeAcceptQueryI interface connects to the system bus to accept
queries and return data.
-
passQuery( )
This command is used to pass a buffer containing a query
to the QE.
-
sendQueryResult( )
This event is used to pass data to the system bus for transport.
-
returnBuffer( )
This event is used to return a buffer that was borrowed
from the system bus. It also conveys whether or not the
query has been accepted or not.
|
- QeAcceptDataI
This interface is presented to the lower layer (specifically, the
Transform Manager) and is used to receive data that will be used to
satisfy standing queries.
-
passData( )
This command allows the QE to receive a unitted data type.
|
- QeStorageI
This interface is presented to the QT and provides all functions
associated with storage and retreival.
-
storeDone( )
This command allows the QE to be notified when data is
done being stored.
|
- DmAcceptMnAndTI
This interface is presented to the QE so that the QE can request a
particular measurement name of interest and the period that data
should be returned.
-
passMnT( )
This command is used to pass a measurement name and period.
A sampling ID is returned.
-
cancelSamplingID( )
This command is used to cancel a particular sampling task.
-
getRemainingSamplerJobs( )
This command is used to get the number of sampler tasks
that are unused.
|
- DmUpdateTableI
This interface is used to update the Data Map's table that contains
the parameters for all the sensors.
-
newSensorParams( )
This command is used to specify the parameters for a new
sensor or to update the parameters of an existing sensor
-
deleteSensor( )
This command is used to delete a particular sensor from
the Data Map's table.
-
newMnMapping( )
This command takes a measurement name and hardware address
as input. If an entry already exists for that
measurement name then the hardware address is updated.
If the measurement name is not in the table then a new
entry is created.
-
deleteMnMapping( )
This command is used to delete the table entry associated
with the passed measurement name.
-
readSensorParams( )
This command returns the parameters for a sensor based on
measurement name.
|
- DmMappingI
This interface is used to access the table that maps measurement names
to hardware address and vice versa.
-
mn2hwAddr( )
This command takes a measurement name as input and returns
the associated hardware address.
-
hwAddr2mn( )
This command takes an hardware address and returns the
associated measurement name.
|
- TmTransformDataI
This interface is presented to the Sampler so that data can be passed
to the TM. The TM takes this data and applies a transform to convert
a raw ADC value to a unitted data type. This data is then passed to
the QE.
-
transformData( )
This command takes a raw ADC value, measurement name, and
sampling ID as input. It then applies the appropriate
transform to the data (based on the measurement name).
|
- QueryTableI
The QueryTableI interface defines the functions to insert, access,
and expire queries. The commands for this interface are:
-
insert( )
Used to request the storage of a query.
-
deleteQueryId( )
Used to request the deletion of a query with matching ID.
-
request( )
Used to get exclusive access to a query.
-
release( )
Used to release access to a query.
-
insertionDone( )
Used to notify the module that called insert that insertion is complete.
|
- ChAcceptCmdI
This interface defines those commands required to interface with the
system bus.
-
acceptCmd( )
A configuration command is passed to this function.
-
acceptCmdDone( )
This returns the buffer that arrived via the acceptCmd function.
-
readMNs( )
Returns to the system bus the measurement names of all
availabe sensors.
-
readMnConfig( )
Returns configuration information about a particular
measurement name/
|
Query Engine
- Interfaces
This component implements the following interface:
- Modules
QueryEngineM
This module implements the QeAcceptQueryI, QeAcceptDataI, and
QeStorage interfaces.
- Implementation
The implementation of this component is as follows:
-
init( )
The QE does not maintian any large internal data stuctures. QE
simply asks QT to init, followed by the DM, and then the TM.
-
start( )
Call start for the DM and TM.
-
stop( )
Call stop for the DM and TM.
-
QeAcceptQueryI.insert( )
This function takes as input a buffer and its length. The QE
parses the query to find what measurement names are required.
It then asks the DM if those measurement names are available.
Depending on the availability and the type of query, the QE
may at this point return 'failure' to the system bus. If not,
the QE then asks the QT if there is enough memory to store the
buffer, along with some extra 'bookkeeping' space. If that
space is not available then the QE will return 'failure' to
the system bus. Otherwise, the buffer is passed to the QT for
storage.
Parameters:
|
Type
|
Name
|
Description
|
|
char*
|
queryBuff
|
This parameter is a pointer to the query being passed.
|
|
uint8_t
|
length
|
This parameter holds the length of the buffer query
|
Return:
None
-
QeAcceptQueryI.sendQueryResult( )
I DON'T THINK THIS FUNCTION SHOULD BE HERE SINCE THIS FUNCTION
WOULD BE IMPLEMENTED BY THE SYSTEM BUS.
Parameters:
|
Type
|
Name
|
Description
|
|
char*
|
buff
|
buff is a pointer to a buffer that should be sent.
|
|
uint8_t
|
length
|
The length of the buffer
|
Return:
None
-
QeAcceptQueryI.returnBuffer( )
I DON'T THINK THIS FUNCTION SHOULD BE HERE SINCE THIS FUNCTION
WOULD BE IMPLEMENTED BY THE SYSTEM BUS.
Parameters:
|
Type
|
Name
|
Description
|
|
char*
|
buff
|
This parameter is a pointer to a buffer that is no
longer needed.
|
Return:
None
-
QeAcceptDataI.passData( )
This function accepts a sensor value and its associated
sampling ID. The QE asks the QT to return a pointer to the
buffer that contians this sampling ID. Once the buffer has
been returned the data is written into the buffer, and the
state of the query is updated. If the query is ready to be
evaluated then the QE prepares a packet with the query result
and passes the packet to the system bus.
Parameters:
|
Type
|
Name
|
Description
|
|
float
|
sample
|
Unitted data from the Sampler
|
|
uint8_t
|
samplingID
|
The sampling ID associated with the sample
|
Return:
None
-
QeStorageI.storeDone( )
When the QT is done storing a query then this event is
called. The QT passes a pointer to the buffer that the QE
received from the system bus as well as a pointer to the newly
allocated buffer. The QE returns the system buses buffer, and
then uses its own buffer to request each measurement name from
the Data Map. The DM will respond with the sampling IDs for
each of the measurement names. The sampling IDs are then
stored into the buffer. Lastly, the QE tells the QT that it
is done altering the buffer.
Parameters:
|
Type
|
Name
|
Description
|
|
char*
|
queryPtr
|
Location of the stored query (with appended extra space)
in memory
|
Return:
None
Data Map
- Interfaces
This component implements the following interface:
- DmAcceptMnAndTI
- DmMappingI
- DmUpdateTableI
- Modules
DataMapM
This component implements the following interfaces:
- Implementation
The implementation of this component is as follows:
-
init( )
The DM maintains a table that has as many rows as there are ADC
hardware addresses. The DM marks each row as being 'disabled.' The DM
then calls init for the Sampler.
-
start( )
Call start for the Sampler.
-
stop( )
Call stop for the Sampler.
-
DmAcceptMnAndTI.mnExist( )
A measurement name is passed to the DM. The DM looks through
the list of available measurement names to see if the
passed-in name is on the list. If so, 'success' is returned.
If not, 'failure.'
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
msrName
|
The measurement name of the sensor that we are looking for
|
Return:
|
Type
|
Name
|
Description
|
|
boolean
|
res
|
This value is 1 if the sensor exists, 0 otherwise
|
-
DmAcceptMnAndTI.passMnT( )
The DM receives a measurement name 'msrName' and a sampling
period 'samplePeriod.' The DM first checks to see if the
measurement name 'msrName' is available. If not, 'failure' is
returned. Otherwise, the DM finds the parameters that are
associated with 'msrName' and passes them to the Sampler,
along with the 'samplePeriod.' The Sampler should return a
sampling ID. The DM then passes that sampling ID to the QE.
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
msrName
|
The measurement name of the sensor to sample
|
|
uint8_t
|
samplePeriod
|
The sampling period for the measurement name.
|
Return:
|
Type
|
Name
|
Description
|
|
uint8_t
|
sampleID
|
This the sampling ID. All future transactions
pertaining to this sampling task will be referred to
using this number.
|
-
DmAcceptMnAndTI.cancelSamplingID( )
The DM receives a sampling ID from the QE. The DM tells the
Sampler that it should cancel the sampling task associated
with the passed sampling ID. Once the Sampler has canceled
the task it returns 'success' to the DM. The DM then returns
'success' to the QE.
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
samplingID
|
The sampling ID of the sampling task to be cancelled
|
Return:
None
-
DmAcceptMnAndTI.getRemainingSamplerJobs( )
The DM acts as nothing more than a pass through, asking the
sampler for the total number of unused sampling jobs.
Parameters:
None
Return:
|
Type
|
Name
|
Description
|
|
uint8_t
|
remaining
|
This number of remaing jobs.
|
-
DmMappingI.mn2hwAddr( )
The DM is passed a measurement name 'msrName.' The DM looks
to see if there is an attached sensor that corresponds to
'msrName.' If not, 'failure' is returned. If so, the
hardware address associated with 'msrName' is returned.
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
msrName
|
The measurement name of the sensor to sample
|
Return:
|
Type
|
Name
|
Description
|
|
uint8_t
|
chanName
|
The hardware address associated with the measurement name
|
-
DmMappingI.hwAddr2mn( )
The DM is passed a hardware address 'chanName.' The DM looks
to see if there is a sensor attached to the hardware address
'chanName.' If not, 'failure' is returned. If so, the
measurement name associated with 'chanName' is returned.
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
chanName
|
A hardware address
|
Return:
|
Type
|
Name
|
Description
|
|
uint8_t
|
msrName
|
The measurement name associated with the hardware address
|
-
DmUpdateTableI.updateTable( )
The DM keeps a table that has many rows as there are hardware
addresses. Each row contains the measurement name and
parameters of the attached sensor. If there is no sensor
attached, as special 'no sensor' value is stored there. This
function receives a hardware address, measurement name and
parameters. These values should then be stored in the proper
row of the table.
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
msrName
|
New measurement name
|
|
uint8_t
|
sensorName
|
New sensor name
|
|
uint8_t
|
chanNum
|
New hardware address
|
|
uint8_t
|
params
|
The parameters for this measurment name
|
Return:
|
Type
|
Name
|
Description
|
|
result_t
|
res
|
Encodes whether insertion was successful or not
|
Transform Manager
- Interfaces
This component implements the following interface:
- Modules
TransformManagerM
This module implements the TmTransformDataI interface.
- Implementation
The implementation of this component is as follows:
-
init( )
The TM maintains no large internal data structures, and has no
components underneath that aren't already initialized. Do
nothing and return.
-
start( )
Return.
-
stop( )
Return.
-
TmTransformData.transformData( )
This function accepts a raw ADC value 'value', a sampling ID
'samplingID', and a hardware address 'chanNum.' Based on
this information the TM finds the correct data transform that
corresponds to 'chanName' and then transforms 'value' using
it. The TM then passes the transformed value, and
'samplingID' to the QE.
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
chanNum
|
The hardware address of the sampled sensor
|
|
uint8_t
|
samplingID
|
The sampling ID of the sample
|
|
float
|
value
|
The raw data from the ADC
|
Return:
None
Query Table
- Interfaces
This compoent implements the following interface:
- Modules
QueryTableM
This module implements the QueryTableI interface.
-
compactMemory( )
This method is internal and is used to post a task that
will perform compaction of the memory pool that the Query
Table manages.
-
finishInsertion( )
This method is internal and is used to post a task that
will finish the insertion of a buffer into memory.
|
Testing
The testing of this module will entail the insertion of several
queries. These queries will then be deleted, refreshed, retrieved in
order to validate functionality.
- Implementation
The implementation of this component is as follows:
-
init( )
The QT maintains a large memory pool. The memory pool needs to
be initialized (using your favorite memory management scheme).
For this implementation we use a linked list, with header and footer.
-
start( )
Return.
-
stop( )
Return.
-
QueryTableI.insert( )
The query table accepts a pointer to a buffer and then will try
to find a large enough free memory block available to store the
buffer. If there is space for it then immediately the header
information is written into the location. A task is then posted
to finish the insertion.
Parameters:
|
Type
|
Name
|
Description
|
|
char*
|
queryBuff
|
This parameter is a pointer to the query to be stored.
This pointer also points at information regarding the
buffer, specifically its size.
|
|
uint8_t
|
queryBuffSize
|
This parameter is the size of the queryBuffer in bytes
|
|
uint8_t
|
extraSpace
|
This parameter is the size of the extra space needed
to resolve the query
|
Return:
|
Type
|
Description
|
|
result_t
|
The return of this command will indicate success if
there were no other insertions pending, and if there
was a large enough memory block available for storage.
|
-
QueryTableI.deleteQueryId( )
A query ID is passed to the QueryTable, requesting that the
memory block associated with the query ID should be deleted.
Parameters:
|
Type
|
Name
|
Description
|
|
uint16_t
|
qID
|
This parameter is used to locate a query
|
Return:
|
Type
|
Description
|
|
result_t
|
The return of this command will indicate success if a
query with matching qID did exist
|
-
QueryTableI.request( )
A sampling ID is passed to the QueryTable, requesting that a
pointer to the memory block associated with the sampling ID
should be returned and that the query should be marked as 'in
use.'
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
sampling ID
|
This parameter is used to locate a query
|
Return:
|
Type
|
Description
|
|
result_t
|
The return of this command will indicate success if a
query with matching sampling ID did exist and the query
was not already in use
|
-
QueryTableI.release( )
A sampling ID is passed to the QueryTable, requesting that the
query be unlocked.
Parameters:
|
Type
|
Name
|
Description
|
|
uint8_t
|
sampling ID
|
This parameter is used to locate a query
|
Return:
|
Type
|
Description
|
|
result_t
|
The return of this command will indicate success if a
query with matching sampling ID did exist
|
-
QueryTableI.insertionDone( )
This is an event that informs a module that requested the
insertion of a query that insertion is complete.
Parameters:
None
Return:
None
-
compactMemory( )
This function traverses the memory buffer compacting as it
goes. Compaction terminates when either there are no more
buffers, or a buffer that is locked and needs to be moved is
encountered.
Parameters:
None
Return:
None
-
finishInsertion( )
This function finishes copying the contents of a memory buffer
into its buffer space.
Parameters:
None
Return:
None
Configuration Handler
- Interfaces
This component implements the following interface:
- Modules
ConfigurationHandlerM
This module implements the ChAcceptCmdI interface.
- Implementation
The implementation of this component is as follows:
-
init( )
The CH first calls init on the EEPROM driver
-
start( )
The CH reads configuration information from the EEPROM and
sends this information to the DM.
-
stop( )
Return.
-
ChAcceptCmdI.acceptCmd( )
The CH gets a buffer from the system bus, along with its
length. The CH then interprets the buffer to figure out what
type of message it is, either a 'put' command or a 'get'
command.
If it is a put command, then the buffer specifies one or more
measurement names along with their associated parameters. The
CH stores this data to the EEPROM. Once stored, the CH then
calls the update function of the Data Map, passing the same
data to it.
If it is a get command, then the the buffer can specify a
particular measurement name. The parameters associated
with that measurement name are read from EEPROM and then
passed to the system bus for transport back to the requester.
In addition, a get command can also specify that it wants to
receive a list of all available measurement names. The
measurement names of all available sensors are then put into
the buffer and passed to the system bus for trasnport.
Parameters:
|
Type
|
Name
|
Description
|
|
char*
|
cmdBuff
|
A pointer to a buffer containing configuration information
|
|
uint8_t
|
cmdLen
|
The length of the buffer pointed to by cmdBuff
|
Return:
None
-
ChAcceptCmdI.acceptCmdDone( )
The CH returns the buffer that was received from the system
bus.
Parameters:
|
Type
|
Name
|
Description
|
|
char*
|
cmdBuff
|
A pointer to a buffer containing configuration information
|
Return:
None
Internal Data Sturcutres
- Query Engine
The QE interprets queries and data, which are either stored in
temporary buffers or within the QT. Thus, the QE is a finite state
machine and does not possess any large data structures.
- Query Table
The QT implements a memory manager. As such it manages a large
memory buffer in a linked list fashion.
- Data Map
For each analog measurement name there are three parameters: power
supply (3V or 5V), setup time (in ms), and the number of samples to
average for noise reduction.
For each digital measurement name there are also four parameters:
suppression interval (time during which upper layers are not
interrupted with events), triggering type (rising edge, falling
edge, both edges), whether the sensor is a counter, and whether the
sensor generates events.
The DM maintains a table that has as many entiries as there are
hardware addresses. For each hardware address there is an
associated measurement name, along with all parameters.
- Transform Manager
The TM keeps one transform per measurement name. In addition, it
provides a default transform that does nothing to a raw ADC value,
allowing this raw value to pass directly to the QE.
- Configuration Handler
The CH reads and writes configuration information from the EEPROM.
Because the configuration for a sensor could change, and because the
ability to add new configuration information is needed the CH needs
to implement a simple file system on the EEPROM. Due to the small
amount of configuration information a linked list implementation is
proposed, although this has not been explored throughly.
- Component Testing
Create an application called
TEST_QueryTable_DRIVER
This applications is expected to build and run without specific
input, and is expected to produce very standard output. Upon
successful completion, drivers should produce the string:
>>>SUCCESS<<<
Upon a failure, drivers should produce the string:
>>>FAIL<<<
These strings should be produced using DBG_USR3.
- Integration Testing
The purpose of the regression test suite is to ensure that the Data
Service Provider's functionality can be tested at any time. A
system's regression test suite will be comprised of a list of
operations that must be successfully performed in a simulated
environment according to a pre-defined set of acceptance criteria.
- Regression Testing
Forthcoming.