codec.cc
// INCLUDE THE CLASS DECLARATION
#include "codec.h"
// INCLUDE CLASSES USED IN THE IMPLEMENTATION
#include "smi_channel.h"
#include "smi_message.h"
//************************
// CLASS DEFINITION: Codec
//************************
// CONSTANTS: MUST MATCH THE DEFINITION USED BY THE VERILOG WRAPPER
const int Codec::DEV_WRITE=0;
const int Codec::DEV_READ=1;
// CONSTRUCTOR
Codec::Codec(const string& name)
{
// FETCH THE SMI CHANNEL POINTER
SMI_Channel* channel = SMI_Channel::instance();
// ALLOCATE AN SMI REPLY MESSAGE
d_tx = channel->newTxMessage();
// REGISTER THIS MODEL INSTANCE WITH SMI
channel->add(name, "codec", this);
}
// DESTRUCTOR
Codec::~Codec()
{
// DELETE THE SMI REPLY MESSAGE
delete d_tx;
}
// METHOD: process(rx)
SMI_TxMessage*
Codec::process(const SMI_RxMessage& rx)
{
// CHOOSE AN ACTION DEPENDING ON THE MESSAGE TYPE
switch(rx.integer(0))
{
// IF THE MESSAGE TYPE IS "Write"
case DEV_WRITE:
// ACCEPT WRITE CHANNEL DATA
dacData(rx.integer(1));
break;
// IF THE MESSAGE TYPE IS "Read"
case DEV_READ:
// GENERATE AND RETURN READ CHANNEL DATA
d_tx->append(16, adcData());
break;
// IF THE MESSAGE TYPE IS ILLEGAL
default:
cout << "Codec::process: ILLEGAL OPERATION" << endl;
}
// RETURN ANY REPLY MESSAGE
return d_tx;
}
© Copyright 2000-2001 Adrian Lewis