2009:Correct Dashboard Update Function
From 1511Wookiee
Jump to navigationJump to search
This function should be used if/when WPILib is updated
#include "WPILib.h"
#include "ThunderDrive.h"
#include "DashboardDataFormat.h"
#include "AnalogModule.h"
#include "DigitalModule.h"
#include "iomap.h"
//This function requires you to modify WPIlib/DigitalModule.h and
// make m_fpgaDIO a public member instead of private. The reason is
// that there are no publicly accessible ways of reading the value of
// a digital output or the output enables. Exposing m_fpgaDIO lets you use
// the ChipObject functions readDI, readDO, and readOutputEnable. The bitmasking
// of the DI and DO vectors versus the OE ensure that DIO's that are not inputs are
// not falsely set because those specific bits are actually outputs, and vice versa.
//
// The same lack of ability to get() the status of the relayFWD and relayREV bits
// requires exposing m_fpgaDIO to use the readSlowValue_Relay[Fwd|Rev] function
void UpdateDashboard(void)
{
tRioStatusCode status = 0;
UINT16 channum = 0; //analog/digital channel number
AnalogModule *amodule = AnalogModule::GetInstance(1);
DigitalModule *dmodule = DigitalModule::GetInstance(4);
for (channum = 1; channum <= SensorBase::kAnalogChannels; channum++)
{
dashboardDataFormat.m_AnalogChannels[0][channum-1] = amodule->GetValue(channum);
}
for (channum = 1; channum <= SensorBase::kPwmChannels; channum++)
{
dashboardDataFormat.m_PWMChannels[0][channum-1] = dmodule->GetPWM(channum);
}
unsigned short digin = 0, digout = 0, dio = 0;
unsigned short dio_oe = dmodule->m_fpgaDIO->readOutputEnable(&status);
digin = dmodule->m_fpgaDIO->readDI(&status);
digin &= ~dio_oe;
digout = dmodule->m_fpgaDIO->readDO(&status);
digout &= dio_oe;
dio = digin | digout;
dashboardDataFormat.m_DIOChannels[0] = dio; //cast from ushort to UINT16
dashboardDataFormat.m_DIOChannelsOutputEnable[0] = dio_oe; //another ushort to UINT16 cast
dashboardDataFormat.m_RelayFwd[0] = dmodule->m_fpgaDIO->readSlowValue_RelayFwd(&status);
dashboardDataFormat.m_RelayRev[0] = dmodule->m_fpgaDIO->readSlowValue_RelayRev(&status);
//no solenoid feedback - we're not using it.
dashboardDataFormat.PackAndSend();
}