blob: 3767508f266cb722377d1ade005e52a07a9c2c91 [file] [log] [blame]
Brian Silverman5c989972013-03-07 22:43:07 -08001#ifndef AOS_CRIO_HARDWARE_DIGITAL_SOURCE_H_
2#define AOS_CRIO_HARDWARE_DIGITAL_SOURCE_H_
3
4#include "aos/common/libstdc++/memory"
5
6#include "WPILib/DigitalSource.h"
7#include "WPILib/DigitalInput.h"
8#include "WPILib/AnalogTrigger.h"
9#include "WPILib/AnalogTriggerOutput.h"
10
11#include "aos/common/macros.h"
12
13namespace aos {
14namespace crio {
15namespace hardware {
16
17// Wrapper for WPILib's class of the same name. Provides an actual Get()
18// function and makes creating analog ones easier.
19class DigitalSource {
20 public:
21 virtual ~DigitalSource() {}
22
23 virtual bool Get() = 0;
24 // This object maintains ownership.
25 virtual ::DigitalSource *source() const = 0;
26
Brian Silvermanc2f62fa2013-03-08 15:55:43 -080027 protected:
28 DigitalSource() {}
29
Brian Silverman5c989972013-03-07 22:43:07 -080030 private:
31 DISALLOW_COPY_AND_ASSIGN(DigitalSource);
32};
33
34class AnalogTriggerOutput : public DigitalSource {
35 public:
36 // Defaults for the voltages for AnalogTriggers. They work well for digital
37 // sensors connected to analog inputs.
38 static const float kDefaultLowerVoltage = 1;
39 static const float kDefaultUpperVoltage = 4;
40
41 // Will set up the voltages on trigger.
Brian Silvermanc2f62fa2013-03-08 15:55:43 -080042 AnalogTriggerOutput(const ::std::unique_ptr< ::AnalogTrigger> &trigger,
Brian Silverman5c989972013-03-07 22:43:07 -080043 ::AnalogTriggerOutput::Type type,
44 float lowerVoltage = kDefaultLowerVoltage,
45 float upperVoltage = kDefaultUpperVoltage);
Brian Silvermanc2f62fa2013-03-08 15:55:43 -080046 explicit AnalogTriggerOutput(::std::unique_ptr< ::AnalogTriggerOutput> output)
Brian Silverman5c989972013-03-07 22:43:07 -080047 : output_(::std::move(output)) {}
48
49 virtual bool Get() { return output_->Get(); }
50 virtual ::DigitalSource *source() const { return output_.get(); }
51
52 private:
Brian Silvermanc2f62fa2013-03-08 15:55:43 -080053 const ::std::unique_ptr< ::AnalogTriggerOutput> output_;
Brian Silverman5c989972013-03-07 22:43:07 -080054};
55
56class DigitalInput : public DigitalSource {
57 public:
Brian Silvermanc2f62fa2013-03-08 15:55:43 -080058 explicit DigitalInput(uint32_t channel)
59 : input_(::std::unique_ptr< ::DigitalInput>(
60 new ::DigitalInput(channel))) {
61 }
62 DigitalInput(uint8_t module, uint32_t channel)
63 : input_(::std::unique_ptr< ::DigitalInput>(
64 new ::DigitalInput(module, channel))) {
65 }
66 explicit DigitalInput(::std::unique_ptr< ::DigitalInput> input)
Brian Silverman5c989972013-03-07 22:43:07 -080067 : input_(::std::move(input)) {}
68
69 virtual bool Get() { return input_->Get(); }
70 virtual ::DigitalSource *source() const { return input_.get(); }
71
72 private:
Brian Silvermanc2f62fa2013-03-08 15:55:43 -080073 const ::std::unique_ptr< ::DigitalInput> input_;
Brian Silverman5c989972013-03-07 22:43:07 -080074};
75
76} // namespace hardware
77} // namespace crio
78} // namespace aos
79
80#endif // AOS_CRIO_HARDWARE_DIGITAL_SOURCE_H_