blob: c64bbdcc4d5f04606a54c39678b8ff44f975c129 [file] [log] [blame]
Brian Silvermand8f403a2014-12-13 19:12:04 -05001#include "frc971/wpilib/buffered_pcm.h"
2
Tyler Chatowbf0609c2021-07-31 16:13:27 -07003#include <cinttypes>
Brian Silvermand8f403a2014-12-13 19:12:04 -05004
John Park33858a32018-09-28 23:05:48 -07005#include "aos/logging/logging.h"
Philipp Schrader790cb542023-07-05 21:06:52 -07006#include "hal/CTREPCM.h"
Austin Schuhf6b94632019-02-02 22:11:27 -08007#include "hal/HAL.h"
8#include "hal/Ports.h"
Brian Silvermand8f403a2014-12-13 19:12:04 -05009
Stephan Pleinesf63bde82024-01-13 15:59:33 -080010namespace frc971::wpilib {
Brian Silvermand8f403a2014-12-13 19:12:04 -050011
Austin Schuh547cf8a2017-11-23 13:21:16 -080012BufferedPcm::BufferedPcm(int module) : module_(module) {
13 for (int i = 0; i < 8; ++i) {
14 int32_t status = 0;
Austin Schuh9950f682021-11-06 15:27:58 -070015 solenoid_handles_[i] = HAL_InitializeCTREPCM(
16 HAL_GetPortWithModule(module_, i), nullptr, &status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080017 if (status != 0) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070018 AOS_LOG(FATAL, "Status was %d\n", status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080019 }
20 }
21}
22
Brian Silvermand8f403a2014-12-13 19:12:04 -050023::std::unique_ptr<BufferedSolenoid> BufferedPcm::MakeSolenoid(int number) {
24 return ::std::unique_ptr<BufferedSolenoid>(
25 new BufferedSolenoid(number, this));
26}
27
sabinaf5584322017-09-23 18:37:19 -070028void BufferedPcm::DoSet(int number, bool value) {
Brian Silvermand8f403a2014-12-13 19:12:04 -050029 if (value) {
30 values_ |= 1 << number;
31 } else {
32 values_ &= ~(1 << number);
33 }
34}
35
Austin Schuh547cf8a2017-11-23 13:21:16 -080036int32_t BufferedPcm::GetAll() {
37 int32_t status = 0;
Austin Schuh9950f682021-11-06 15:27:58 -070038 int32_t result = HAL_GetCTREPCMSolenoids(module_, &status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080039 if (status != 0) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070040 AOS_LOG(ERROR, "Failed to flush, %d\n", status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080041 return 0;
42 }
43 return result;
44}
45
Brian Silvermand8f403a2014-12-13 19:12:04 -050046void BufferedPcm::Flush() {
Austin Schuhf257f3c2019-10-27 21:00:43 -070047 AOS_LOG(DEBUG, "sending solenoids 0x%" PRIx8 "\n", values_);
Austin Schuh547cf8a2017-11-23 13:21:16 -080048 int32_t status = 0;
Austin Schuh9950f682021-11-06 15:27:58 -070049 HAL_SetCTREPCMSolenoids(module_, 0xff, static_cast<int>(values_), &status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080050 if (status != 0) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070051 AOS_LOG(ERROR, "Failed to flush, %d\n", status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080052 }
Brian Silvermand8f403a2014-12-13 19:12:04 -050053}
54
Stephan Pleinesf63bde82024-01-13 15:59:33 -080055} // namespace frc971::wpilib