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();
	}