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