HAL: Use extern "C" in implementation files.

This turns accidental parameter mismatches between header and implementation
into compiler errors.

Change-Id: Ic26fabb82b2fd5f79407a11435cdbd35348af15f
This commit is contained in:
Peter Johnson
2015-11-26 00:08:32 -08:00
parent e2ec34090a
commit 351e8599ac
15 changed files with 105 additions and 50 deletions

View File

@@ -171,6 +171,8 @@ static double unpackAxis(int16_t raw) {
}
}
extern "C" {
/**
* Set the accelerometer to active or standby mode. It must be in standby
* mode to change any configuration.
@@ -232,3 +234,5 @@ double getAccelerometerZ() {
int raw = (readRegister(kReg_OutZMSB) << 4) | (readRegister(kReg_OutZLSB) >> 4);
return unpackAxis(raw);
}
} // extern "C"

View File

@@ -24,18 +24,20 @@ struct AnalogPort {
tAccumulator *accumulator;
};
bool analogSampleRateSet = false;
priority_recursive_mutex analogRegisterWindowMutex;
tAI* analogInputSystem = NULL;
tAO* analogOutputSystem = NULL;
uint32_t analogNumChannelsToActivate = 0;
static bool analogSampleRateSet = false;
static priority_recursive_mutex analogRegisterWindowMutex;
static tAI* analogInputSystem = NULL;
static tAO* analogOutputSystem = NULL;
static uint32_t analogNumChannelsToActivate = 0;
extern "C" {
// Utility methods defined below.
uint32_t getAnalogNumActiveChannels(int32_t *status);
uint32_t getAnalogNumChannelsToActivate(int32_t *status);
void setAnalogNumChannelsToActivate(uint32_t channels);
static uint32_t getAnalogNumActiveChannels(int32_t *status);
static uint32_t getAnalogNumChannelsToActivate(int32_t *status);
static void setAnalogNumChannelsToActivate(uint32_t channels);
bool analogSystemInitialized = false;
static bool analogSystemInitialized = false;
/**
* Initialize the analog System.
@@ -424,7 +426,7 @@ int32_t getAnalogOffset(void* analog_port_pointer, int32_t *status) {
*
* @return Active channels.
*/
uint32_t getAnalogNumActiveChannels(int32_t *status) {
static uint32_t getAnalogNumActiveChannels(int32_t *status) {
uint32_t scanSize = analogInputSystem->readConfig_ScanSize(status);
if (scanSize == 0)
return 8;
@@ -442,7 +444,7 @@ uint32_t getAnalogNumActiveChannels(int32_t *status) {
*
* @return Value to write to the active channels field.
*/
uint32_t getAnalogNumChannelsToActivate(int32_t *status) {
static uint32_t getAnalogNumChannelsToActivate(int32_t *status) {
if(analogNumChannelsToActivate == 0) return getAnalogNumActiveChannels(status);
return analogNumChannelsToActivate;
}
@@ -455,7 +457,7 @@ uint32_t getAnalogNumChannelsToActivate(int32_t *status) {
*
* @param channels Number of active channels.
*/
void setAnalogNumChannelsToActivate(uint32_t channels) {
static void setAnalogNumChannelsToActivate(uint32_t channels) {
analogNumChannelsToActivate = channels;
}
@@ -744,3 +746,5 @@ int32_t getAnalogVoltsToValueIntHack(void* analog_port_pointer, int voltage, int
void setAnalogTriggerLimitsVoltageIntHack(void* analog_trigger_pointer, int lower, int upper, int32_t *status) {
setAnalogTriggerLimitsVoltage(analog_trigger_pointer, intToFloat(lower), intToFloat(upper), status);
}
} // extern "C"

View File

@@ -3,13 +3,15 @@
#include <iostream>
static const int NUM_MODULE_NUMBERS = 63;
extern PCM *modules[NUM_MODULE_NUMBERS];
extern PCM *PCM_modules[NUM_MODULE_NUMBERS];
extern void initializePCM(int module);
extern "C" {
void *initializeCompressor(uint8_t module) {
initializePCM(module);
return modules[module];
return PCM_modules[module];
}
bool checkCompressorModule(uint8_t module) {
@@ -114,3 +116,5 @@ void clearAllPCMStickyFaults(void *pcm_pointer, int32_t *status) {
*status = module->ClearStickyFaults();
}
} // extern "C"

View File

@@ -53,38 +53,39 @@ struct DigitalPort {
uint32_t PWMGeneratorID;
};
// XXX: Set these back to static once we figure out the memory clobbering issue
// Create a mutex to protect changes to the digital output values
priority_recursive_mutex digitalDIOMutex;
static priority_recursive_mutex digitalDIOMutex;
// Create a mutex to protect changes to the relay values
priority_recursive_mutex digitalRelayMutex;
static priority_recursive_mutex digitalRelayMutex;
// Create a mutex to protect changes to the DO PWM config
priority_recursive_mutex digitalPwmMutex;
priority_recursive_mutex digitalI2COnBoardMutex;
priority_recursive_mutex digitalI2CMXPMutex;
static priority_recursive_mutex digitalPwmMutex;
static priority_recursive_mutex digitalI2COnBoardMutex;
static priority_recursive_mutex digitalI2CMXPMutex;
tDIO* digitalSystem = NULL;
tRelay* relaySystem = NULL;
tPWM* pwmSystem = NULL;
hal::Resource *DIOChannels = NULL;
hal::Resource *DO_PWMGenerators = NULL;
hal::Resource *PWMChannels = NULL;
static tDIO* digitalSystem = NULL;
static tRelay* relaySystem = NULL;
static tPWM* pwmSystem = NULL;
static hal::Resource *DIOChannels = NULL;
static hal::Resource *DO_PWMGenerators = NULL;
static hal::Resource *PWMChannels = NULL;
bool digitalSystemsInitialized = false;
static bool digitalSystemsInitialized = false;
uint8_t i2COnboardObjCount = 0;
uint8_t i2CMXPObjCount = 0;
uint8_t i2COnBoardHandle = 0;
uint8_t i2CMXPHandle = 0;
static uint8_t i2COnboardObjCount = 0;
static uint8_t i2CMXPObjCount = 0;
static uint8_t i2COnBoardHandle = 0;
static uint8_t i2CMXPHandle = 0;
int32_t m_spiCS0Handle = 0;
int32_t m_spiCS1Handle = 0;
int32_t m_spiCS2Handle = 0;
int32_t m_spiCS3Handle = 0;
int32_t m_spiMXPHandle = 0;
priority_recursive_mutex spiOnboardSemaphore;
priority_recursive_mutex spiMXPSemaphore;
tSPI *spiSystem;
static int32_t m_spiCS0Handle = 0;
static int32_t m_spiCS1Handle = 0;
static int32_t m_spiCS2Handle = 0;
static int32_t m_spiCS3Handle = 0;
static int32_t m_spiMXPHandle = 0;
static priority_recursive_mutex spiOnboardSemaphore;
static priority_recursive_mutex spiMXPSemaphore;
static tSPI *spiSystem;
extern "C" {
struct SPIAccumulator {
void* notifier = nullptr;
@@ -805,7 +806,7 @@ void setCounterAverageSize(void* counter_pointer, int32_t size, int32_t *status)
* If it's an analog trigger, determine the module from the high order routing channel
* else do normal digital input remapping based on pin number (MXP)
*/
void remapDigitalSource(bool analogTrigger, uint32_t &pin, uint8_t &module) {
extern "C++" void remapDigitalSource(bool analogTrigger, uint32_t &pin, uint8_t &module) {
if (analogTrigger) {
module = pin >> 4;
} else {
@@ -1492,7 +1493,7 @@ void spiSetHandle(uint8_t port, int32_t handle){
* @param port The number of the port to use. 0-3 for Onboard CS0-CS2, 4 for MXP
* @return The semaphore for the SPI port.
*/
priority_recursive_mutex& spiGetSemaphore(uint8_t port) {
extern "C++" priority_recursive_mutex& spiGetSemaphore(uint8_t port) {
if(port < 4)
return spiOnboardSemaphore;
else
@@ -1872,3 +1873,5 @@ void i2CClose(uint8_t port) {
}
return;
}
} // extern "C"

View File

@@ -29,6 +29,8 @@ static uint32_t timeEpoch = 0;
static uint32_t prevFPGATime = 0;
static void* rolloverNotifier = nullptr;
extern "C" {
void* getPort(uint8_t pin)
{
Port* port = new Port();
@@ -366,3 +368,5 @@ void imaqGetLastError()
void niTimestamp64()
{
}
} // extern "C"

View File

@@ -9,6 +9,8 @@ struct Interrupt // FIXME: why is this internal?
tInterruptManager *manager;
};
extern "C" {
void* initializeInterrupts(uint32_t interruptIndex, bool watcher, int32_t *status)
{
Interrupt* anInterrupt = new Interrupt();
@@ -121,3 +123,5 @@ void setInterruptUpSourceEdge(void* interrupt_pointer, bool risingEdge, bool fal
anInterrupt->anInterrupt->writeConfig_RisingEdge(risingEdge, status);
anInterrupt->anInterrupt->writeConfig_FallingEdge(fallingEdge, status);
}
} // extern "C"

View File

@@ -59,6 +59,8 @@ static void cleanupNotifierAtExit() {
notifierManager = nullptr;
}
extern "C" {
void* initializeNotifier(void (*process)(uint64_t, void*), void *param, int32_t *status)
{
if (!process) {
@@ -154,3 +156,5 @@ void stopNotifierAlarm(void* notifier_pointer, int32_t *status)
Notifier* notifier = (Notifier*)notifier_pointer;
notifier->triggerTime = UINT64_MAX;
}
} // extern "C"

View File

@@ -6,6 +6,8 @@ static const int NUM_MODULE_NUMBERS = 63;
static PDP *pdp[NUM_MODULE_NUMBERS] = { NULL };
extern "C" {
void initializePDP(uint8_t module) {
if(!pdp[module]) {
pdp[module] = new PDP(module);
@@ -68,4 +70,4 @@ void clearPDPStickyFaults(uint8_t module, int32_t *status) {
*status = pdp[module]->ClearStickyFaults();
}
} // extern "C"

View File

@@ -9,6 +9,8 @@ static void initializePower(int32_t *status) {
}
}
extern "C" {
/**
* Get the roboRIO input voltage
*/
@@ -125,3 +127,5 @@ int getUserCurrentFaults3V3(int32_t *status) {
initializePower(status);
return (int)power->readFaultCounts_OverCurrentFaultCount3V3(status);
}
} // extern "C"

View File

@@ -9,6 +9,8 @@ TLogLevel semaphoreLogLevel = logDEBUG;
if (level > semaphoreLogLevel) ; \
else Log().Get(level)
extern "C" {
MUTEX_ID initializeMutexNormal() { return new priority_mutex; }
void deleteMutex(MUTEX_ID sem) { delete sem; }
@@ -40,3 +42,5 @@ void takeMultiWait(MULTIWAIT_ID cond, MUTEX_ID m) {
}
void giveMultiWait(MULTIWAIT_ID cond) { cond->notify_all(); }
} // extern "C"

View File

@@ -2,8 +2,10 @@
#include "visa/visa.h"
uint32_t m_resourceManagerHandle;
uint32_t m_portHandle[2];
static uint32_t m_resourceManagerHandle;
static uint32_t m_portHandle[2];
extern "C" {
void serialInitializePort(uint8_t port, int32_t *status) {
char const * portName;
@@ -144,5 +146,5 @@ void serialClose(uint8_t port, int32_t *status) {
if(*status > 0)
*status = 0;
}
} // extern "C"

View File

@@ -9,7 +9,7 @@
static const int NUM_MODULE_NUMBERS = 63;
PCM *modules[NUM_MODULE_NUMBERS] = { NULL };
PCM *PCM_modules[NUM_MODULE_NUMBERS] = { NULL };
struct solenoid_port_t {
PCM *module;
@@ -17,17 +17,19 @@ struct solenoid_port_t {
};
void initializePCM(int module) {
if(!modules[module]) {
modules[module] = new PCM(module);
if(!PCM_modules[module]) {
PCM_modules[module] = new PCM(module);
}
}
extern "C" {
void* initializeSolenoidPort(void *port_pointer, int32_t *status) {
Port* port = (Port*) port_pointer;
initializePCM(port->module);
solenoid_port_t *solenoid_port = new solenoid_port_t;
solenoid_port->module = modules[port->module];
solenoid_port->module = PCM_modules[port->module];
solenoid_port->pin = port->pin;
return solenoid_port;
@@ -95,3 +97,5 @@ void clearAllPCMStickyFaults_sol(void *solenoid_port_pointer, int32_t *status){
*status = port->module->ClearStickyFaults();
}
} // extern "C"

View File

@@ -9,6 +9,8 @@
#include <signal.h>
extern "C" {
STATUS verifyTaskID(TASK task) {
if (task != nullptr && pthread_kill(*task, 0) == 0) {
return OK;
@@ -49,3 +51,5 @@ STATUS getTaskPriority(TASK task, int* priority) {
return ERROR;
}
}
} // extern "C"

View File

@@ -4,6 +4,8 @@
const int32_t HAL_NO_WAIT = 0;
const int32_t HAL_WAIT_FOREVER = -1;
extern "C" {
void delayTicks(int32_t ticks)
{
struct timespec test, remaining;
@@ -42,3 +44,5 @@ void delaySeconds(double s)
test = remaining;
}
}
} // extern "C"

View File

@@ -3,6 +3,8 @@
#include "FRC_NetworkCommunication/FRCComm.h"
#include <cstring>
extern "C" {
int HALGetControlWord(HALControlWord *data)
{
return FRC_NetworkCommunication_getControlWord((ControlWord_t*) data);
@@ -126,3 +128,5 @@ void HALNetworkCommunicationObserveUserProgramTest(void)
{
FRC_NetworkCommunication_observeUserProgramTest();
}
} // extern "C"