diff --git a/hal/lib/Athena/Accelerometer.cpp b/hal/lib/Athena/Accelerometer.cpp index 0895c9c084..153844c570 100644 --- a/hal/lib/Athena/Accelerometer.cpp +++ b/hal/lib/Athena/Accelerometer.cpp @@ -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" diff --git a/hal/lib/Athena/Analog.cpp b/hal/lib/Athena/Analog.cpp index e56d6585dc..05f4460482 100644 --- a/hal/lib/Athena/Analog.cpp +++ b/hal/lib/Athena/Analog.cpp @@ -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" diff --git a/hal/lib/Athena/Compressor.cpp b/hal/lib/Athena/Compressor.cpp index 9305097886..3f7141b227 100644 --- a/hal/lib/Athena/Compressor.cpp +++ b/hal/lib/Athena/Compressor.cpp @@ -3,13 +3,15 @@ #include 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" diff --git a/hal/lib/Athena/Digital.cpp b/hal/lib/Athena/Digital.cpp index 29dc8198ff..ef9bfac11e 100644 --- a/hal/lib/Athena/Digital.cpp +++ b/hal/lib/Athena/Digital.cpp @@ -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" diff --git a/hal/lib/Athena/HALAthena.cpp b/hal/lib/Athena/HALAthena.cpp index 23f5266121..4baf40b469 100644 --- a/hal/lib/Athena/HALAthena.cpp +++ b/hal/lib/Athena/HALAthena.cpp @@ -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" diff --git a/hal/lib/Athena/Interrupts.cpp b/hal/lib/Athena/Interrupts.cpp index e5ad2af475..1e715e689a 100644 --- a/hal/lib/Athena/Interrupts.cpp +++ b/hal/lib/Athena/Interrupts.cpp @@ -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" diff --git a/hal/lib/Athena/Notifier.cpp b/hal/lib/Athena/Notifier.cpp index 09337f917c..99fd6523a2 100644 --- a/hal/lib/Athena/Notifier.cpp +++ b/hal/lib/Athena/Notifier.cpp @@ -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" diff --git a/hal/lib/Athena/PDP.cpp b/hal/lib/Athena/PDP.cpp index 26fb4f6f38..129efa7799 100644 --- a/hal/lib/Athena/PDP.cpp +++ b/hal/lib/Athena/PDP.cpp @@ -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" diff --git a/hal/lib/Athena/Power.cpp b/hal/lib/Athena/Power.cpp index cde96ead43..755d8ed41d 100644 --- a/hal/lib/Athena/Power.cpp +++ b/hal/lib/Athena/Power.cpp @@ -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" diff --git a/hal/lib/Athena/Semaphore.cpp b/hal/lib/Athena/Semaphore.cpp index db9e9a3b4a..3c84c46df8 100644 --- a/hal/lib/Athena/Semaphore.cpp +++ b/hal/lib/Athena/Semaphore.cpp @@ -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" diff --git a/hal/lib/Athena/SerialPort.cpp b/hal/lib/Athena/SerialPort.cpp index 7393e2cfbd..883b720035 100644 --- a/hal/lib/Athena/SerialPort.cpp +++ b/hal/lib/Athena/SerialPort.cpp @@ -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; } - - \ No newline at end of file + +} // extern "C" diff --git a/hal/lib/Athena/Solenoid.cpp b/hal/lib/Athena/Solenoid.cpp index a95d836b1f..cb8ee8bab4 100644 --- a/hal/lib/Athena/Solenoid.cpp +++ b/hal/lib/Athena/Solenoid.cpp @@ -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" diff --git a/hal/lib/Athena/Task.cpp b/hal/lib/Athena/Task.cpp index 9e4b2e9ac0..013f44d59a 100644 --- a/hal/lib/Athena/Task.cpp +++ b/hal/lib/Athena/Task.cpp @@ -9,6 +9,8 @@ #include +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" diff --git a/hal/lib/Athena/Utilities.cpp b/hal/lib/Athena/Utilities.cpp index b34677fead..218771aca9 100644 --- a/hal/lib/Athena/Utilities.cpp +++ b/hal/lib/Athena/Utilities.cpp @@ -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" diff --git a/hal/lib/Shared/HAL.cpp b/hal/lib/Shared/HAL.cpp index 978127842c..d77c6e7df2 100644 --- a/hal/lib/Shared/HAL.cpp +++ b/hal/lib/Shared/HAL.cpp @@ -3,6 +3,8 @@ #include "FRC_NetworkCommunication/FRCComm.h" #include +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"