blob: 3123add55d20c4d3370519984154ea0c58e9ba76 [file] [log] [blame]
Brian Silvermand8f403a2014-12-13 19:12:04 -05001#include "frc971/wpilib/buffered_pcm.h"
2
3#include <inttypes.h>
4
John Park33858a32018-09-28 23:05:48 -07005#include "aos/logging/logging.h"
Austin Schuhf6b94632019-02-02 22:11:27 -08006#include "hal/HAL.h"
7#include "hal/Ports.h"
8#include "hal/Solenoid.h"
Brian Silvermand8f403a2014-12-13 19:12:04 -05009
10namespace frc971 {
11namespace wpilib {
12
Austin Schuh547cf8a2017-11-23 13:21:16 -080013BufferedPcm::BufferedPcm(int module) : module_(module) {
14 for (int i = 0; i < 8; ++i) {
15 int32_t status = 0;
16 solenoid_handles_[i] =
17 HAL_InitializeSolenoidPort(HAL_GetPortWithModule(module_, i), &status);
18 if (status != 0) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070019 AOS_LOG(FATAL, "Status was %d\n", status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080020 }
21 }
22}
23
Brian Silvermand8f403a2014-12-13 19:12:04 -050024::std::unique_ptr<BufferedSolenoid> BufferedPcm::MakeSolenoid(int number) {
25 return ::std::unique_ptr<BufferedSolenoid>(
26 new BufferedSolenoid(number, this));
27}
28
sabinaf5584322017-09-23 18:37:19 -070029void BufferedPcm::DoSet(int number, bool value) {
Brian Silvermand8f403a2014-12-13 19:12:04 -050030 if (value) {
31 values_ |= 1 << number;
32 } else {
33 values_ &= ~(1 << number);
34 }
35}
36
Austin Schuh547cf8a2017-11-23 13:21:16 -080037int32_t BufferedPcm::GetAll() {
38 int32_t status = 0;
39 int32_t result = HAL_GetAllSolenoids(module_, &status);
40 if (status != 0) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070041 AOS_LOG(ERROR, "Failed to flush, %d\n", status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080042 return 0;
43 }
44 return result;
45}
46
Brian Silvermand8f403a2014-12-13 19:12:04 -050047void BufferedPcm::Flush() {
Austin Schuhf257f3c2019-10-27 21:00:43 -070048 AOS_LOG(DEBUG, "sending solenoids 0x%" PRIx8 "\n", values_);
Austin Schuh547cf8a2017-11-23 13:21:16 -080049 int32_t status = 0;
50 HAL_SetAllSolenoids(module_, static_cast<int>(values_), &status);
51 if (status != 0) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070052 AOS_LOG(ERROR, "Failed to flush, %d\n", status);
Austin Schuh547cf8a2017-11-23 13:21:16 -080053 }
Brian Silvermand8f403a2014-12-13 19:12:04 -050054}
55
56} // namespace wpilib
57} // namespace frc971