blob: d22fcda7211f2cc8b5fa9b01c0fa9e3c36a47e2f [file] [log] [blame]
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#include "hal/roborio/HMB.h"
#include <memory>
#include "FPGACalls.h"
#include "hal/ChipObject.h"
using namespace hal;
// 16 classes of data, each takes up 16 uint16_t's
static_assert(sizeof(HAL_HMBData) == 0x10 * 16 * sizeof(uint32_t));
// Timestamp is the last class, and should be offset correctly
static_assert(offsetof(HAL_HMBData, Timestamp) == 0x10 * 15 * sizeof(uint32_t));
static volatile HAL_HMBData* hmbBuffer;
static size_t hmbBufferSize;
static constexpr const char hmbName[] = "HMB_0_RAM";
static std::unique_ptr<tHMB> hmb;
namespace {
struct HMBHolder {
~HMBHolder() {
if (hmbBuffer) {
hal::HAL_NiFpga_CloseHmb(hmb->getSystemInterface()->getHandle(), hmbName);
}
}
};
} // namespace
extern "C" {
void HAL_InitializeHMB(int32_t* status) {
static HMBHolder holder;
hmb.reset(tHMB::create(status));
if (*status != 0) {
return;
}
*status = hal::HAL_NiFpga_OpenHmb(
hmb->getSystemInterface()->getHandle(), hmbName, &hmbBufferSize,
reinterpret_cast<void**>(const_cast<HAL_HMBData**>(&hmbBuffer)));
if (*status != 0) {
return;
}
auto cfg = hmb->readConfig(status);
cfg.Enables_AI0_Low = 1;
cfg.Enables_AI0_High = 1;
cfg.Enables_AIAveraged0_Low = 1;
cfg.Enables_AIAveraged0_High = 1;
cfg.Enables_Accumulator0 = 1;
cfg.Enables_Accumulator1 = 1;
cfg.Enables_DI = 1;
cfg.Enables_AnalogTriggers = 1;
cfg.Enables_Counters_Low = 1;
cfg.Enables_Counters_High = 1;
cfg.Enables_CounterTimers_Low = 1;
cfg.Enables_CounterTimers_High = 1;
cfg.Enables_Encoders_Low = 1;
cfg.Enables_Encoders_High = 1;
cfg.Enables_EncoderTimers_Low = 1;
cfg.Enables_EncoderTimers_High = 1;
cfg.Enables_DutyCycle_Low = 1;
cfg.Enables_DutyCycle_High = 1;
cfg.Enables_Interrupts = 1;
cfg.Enables_PWM = 1;
cfg.Enables_PWM_MXP = 1;
cfg.Enables_Relay_DO_AO = 1;
cfg.Enables_Timestamp = 1;
hmb->writeConfig(cfg, status);
}
const volatile HAL_HMBData* HAL_GetHMBBuffer(void) {
return hmbBuffer;
}
} // extern "C"