fixes to make the hardware stuff actually work
diff --git a/aos/common/logging/logging.h b/aos/common/logging/logging.h
index 392fc5b..9087a32 100644
--- a/aos/common/logging/logging.h
+++ b/aos/common/logging/logging.h
@@ -7,6 +7,11 @@
#include <stdio.h>
#include <stdint.h>
+#ifdef __VXWORKS__
+// Because the vxworks system headers miss the noreturn...
+void abort(void) __attribute__((noreturn));
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/aos/crio/hardware/README b/aos/crio/hardware/README
index 551de5c..8974a52 100644
--- a/aos/crio/hardware/README
+++ b/aos/crio/hardware/README
@@ -5,4 +5,5 @@
qualify the names of these ones (and should do the same for WPILib ones too).
The wrappers only have the functionality that is missing from whatever WPILib
class they are wrapping (and can return pointer to). Use that pointer to do
- everything else.
+ everything else. They also ahve the more useful constructors that forward to
+ the WPILib ones.
diff --git a/aos/crio/hardware/counter.cc b/aos/crio/hardware/counter.cc
index 25ec6aa..fc19f89 100644
--- a/aos/crio/hardware/counter.cc
+++ b/aos/crio/hardware/counter.cc
@@ -1,6 +1,7 @@
-#include "aos/crio/hardware/hardware.h"
+#include "aos/crio/hardware/counter.h"
#include "aos/crio/hardware/digital_source.h"
+#include "aos/common/logging/logging.h"
using ::std::unique_ptr;
@@ -17,34 +18,45 @@
case ::CounterBase::EncodingType::k4X:
return 4;
}
+ BadEncodingType(type_);
}
-unique_ptr<Counter> Counter::Create(unique_ptr<DigitalSource> a,
- unique_ptr<DigitalSource> b,
+void Counter::BadEncodingType(::CounterBase::EncodingType type) {
+ if (type == ::CounterBase::EncodingType::k1X ||
+ type == ::CounterBase::EncodingType::k2X ||
+ type == ::CounterBase::EncodingType::k4X) {
+ LOG(FATAL, "somebody didn't handle all of the possible encoding types!\n");
+ }
+ LOG(FATAL, "bad ::CounterBase::EncodingType %d\n", static_cast<int>(type));
+}
+
+unique_ptr<Counter> Counter::Create(unique_ptr< ::DigitalSource> a,
+ unique_ptr< ::DigitalSource> b,
::CounterBase::EncodingType type) {
switch (type) {
case ::CounterBase::EncodingType::k4X:
return unique_ptr<Counter>(new EncoderCounter(::std::move(a),
::std::move(b)));
- case ::CounterBase::EncodingTYpe::k2X:
+ case ::CounterBase::EncodingType::k2X:
case ::CounterBase::EncodingType::k1X:
return unique_ptr<Counter>(new CounterCounter(::std::move(a),
::std::move(b),
type));
}
+ BadEncodingType(type);
}
-EncoderCounter::EncoderCounter(unique_ptr<DigitalSource> a,
- unique_ptr<DigitalSource> b)
- : Counter(::std::move(a), ::std::move(b), ::CounterBase::EncodingType::k4X),
- encoder_(new ::Encoder(a()->source(), b()->source())) {}
+EncoderCounter::EncoderCounter(unique_ptr< ::DigitalSource> a_source,
+ unique_ptr< ::DigitalSource> b_source)
+ : Counter(::std::move(a_source), ::std::move(b_source),
+ ::CounterBase::EncodingType::k4X),
+ encoder_(new ::Encoder(a().get(), b().get())) {}
-CounterCounter::CounterCounter(unique_ptr<DigitalSource> a,
- unique_ptr<DigitalSource> b,
+CounterCounter::CounterCounter(unique_ptr< ::DigitalSource> a_source,
+ unique_ptr< ::DigitalSource> b_source,
::CounterBase::EncodingType type)
- : Counter(::std::move(a), ::std::move(b), type),
- counter_(new ::Counter(type, a()->source(), b()->source(),
- false /*inverted*/)) {
+ : Counter(::std::move(a_source), ::std::move(b_source), type),
+ counter_(new ::Counter(type, a().get(), b().get(), false /*inverted*/)) {
assert(type == ::CounterBase::EncodingType::k1X ||
type == ::CounterBase::EncodingType::k2X);
}
diff --git a/aos/crio/hardware/counter.h b/aos/crio/hardware/counter.h
index f184146..23bf35d 100644
--- a/aos/crio/hardware/counter.h
+++ b/aos/crio/hardware/counter.h
@@ -32,8 +32,8 @@
// This object maintains ownership.
virtual ::CounterBase *counter_base() const = 0;
- const ::std::unique_ptr<DigitalSource> &a() { return a_; }
- const ::std::unique_ptr<DigitalSource> &b() { return b_; }
+ const ::std::unique_ptr< ::DigitalSource> &a() { return a_; }
+ const ::std::unique_ptr< ::DigitalSource> &b() { return b_; }
// Returns the denominator to convert from ticks to cycles.
int GetDenominator();
@@ -41,25 +41,32 @@
// Will create an instance of a subclass as appropriate for type.
// This should be used (except for special circumstances) for constructing all
// instances because it makes it much easier to change the encoding type.
- static ::std::unique_ptr<Counter> Create(::std::unique_ptr<DigitalSource> a,
- ::std::unique_ptr<DigitalSource> b,
+ static ::std::unique_ptr<Counter> Create(::std::unique_ptr< ::DigitalSource>
+ a,
+ ::std::unique_ptr< ::DigitalSource>
+ b,
::CounterBase::EncodingType type);
protected:
- Counter(::std::unique_ptr<DigitalSource> a,
- ::std::unique_ptr<DigitalSource> b,
+ Counter(::std::unique_ptr< ::DigitalSource> a,
+ ::std::unique_ptr< ::DigitalSource> b,
::CounterBase::EncodingType type)
: a_(::std::move(a)),
b_(::std::move(b)),
type_(type) {}
+ // What to do at the end of functions that handle all encoding types to make
+ // GCC happy. Will LOG(FATAL) a message.
+ static void BadEncodingType(::CounterBase::EncodingType type)
+ __attribute__((noreturn));
+
private:
+ const ::std::unique_ptr< ::DigitalSource> a_;
+ const ::std::unique_ptr< ::DigitalSource> b_;
+
// Because WPILib doesn't actually keep track of it...
const ::CounterBase::EncodingType type_;
- const ::std::unique_ptr<DigitalSource> a_;
- const ::std::unique_ptr<DigitalSource> b_;
-
DISALLOW_COPY_AND_ASSIGN(Counter);
};
@@ -67,27 +74,30 @@
// creates an internal ::Counter, which is really stupid.
class EncoderCounter : public Counter {
public:
- EncoderCounter(::std::unique_ptr<DigitalSource> a,
- ::std::unique_ptr<DigitalSource> b);
+ EncoderCounter(::std::unique_ptr< ::DigitalSource> a,
+ ::std::unique_ptr< ::DigitalSource> b);
virtual int32_t Get() { return encoder_->GetRaw(); }
- virtual ::CounterBase *counter_base() { return encoder_.get(); }
+ virtual ::CounterBase *counter_base() const { return encoder_.get(); }
+ const ::std::unique_ptr< ::Encoder> &encoder() { return encoder_; }
private:
- const ::std::unique_ptr<Encoder> encoder_;
+ const ::std::unique_ptr< ::Encoder> encoder_;
};
class CounterCounter : public Counter {
public:
- CounterCounter(::std::unique_ptr<DigitalSource> a,
- ::std::unique_ptr<DigitalSource> b,
+ CounterCounter(::std::unique_ptr< ::DigitalSource> a,
+ ::std::unique_ptr< ::DigitalSource> b,
::CounterBase::EncodingType type);
virtual int32_t Get() { return counter_->Get(); }
- virtual ::CounterBase *counter_base() { return counter_.get(); }
+ virtual ::CounterBase *counter_base() const { return counter_.get(); }
+ const ::std::unique_ptr< ::Counter> &counter() { return counter_; }
private:
- const ::std::unique_ptr<Counter> counter_;
+ const ::std::unique_ptr< ::Counter> counter_;
+};
} // namespace hardware
} // namespace crio
diff --git a/aos/crio/hardware/digital_source.cc b/aos/crio/hardware/digital_source.cc
index 83f6142..1ed6e1c 100644
--- a/aos/crio/hardware/digital_source.cc
+++ b/aos/crio/hardware/digital_source.cc
@@ -1,15 +1,18 @@
#include "aos/crio/hardware/digital_source.h"
+using ::std::unique_ptr;
+
namespace aos {
namespace crio {
namespace hardware {
-AnalogTriggerOutput::AnalogTriggerOutput(const ::AnalogTrigger &trigger,
+AnalogTriggerOutput::AnalogTriggerOutput(const unique_ptr< ::AnalogTrigger>
+ &trigger,
::AnalogTriggerOutput::Type type,
float lowerVoltage,
float upperVoltage)
- : output_(trigger.CreateOutput(type)) {
- trigger.SetLimitsVoltage(lowerVoltage, upperVoltage);
+ : output_(trigger->CreateOutput(type)) {
+ trigger->SetLimitsVoltage(lowerVoltage, upperVoltage);
}
} // namespace hardware
diff --git a/aos/crio/hardware/digital_source.h b/aos/crio/hardware/digital_source.h
index 9bc5cab..3767508 100644
--- a/aos/crio/hardware/digital_source.h
+++ b/aos/crio/hardware/digital_source.h
@@ -24,6 +24,9 @@
// This object maintains ownership.
virtual ::DigitalSource *source() const = 0;
+ protected:
+ DigitalSource() {}
+
private:
DISALLOW_COPY_AND_ASSIGN(DigitalSource);
};
@@ -36,30 +39,38 @@
static const float kDefaultUpperVoltage = 4;
// Will set up the voltages on trigger.
- AnalogTriggerOutput(const ::AnalogTrigger &trigger,
+ AnalogTriggerOutput(const ::std::unique_ptr< ::AnalogTrigger> &trigger,
::AnalogTriggerOutput::Type type,
float lowerVoltage = kDefaultLowerVoltage,
float upperVoltage = kDefaultUpperVoltage);
- AnalogTriggerOutput(::std::unique_ptr<::AnalogTriggerOutput> output)
+ explicit AnalogTriggerOutput(::std::unique_ptr< ::AnalogTriggerOutput> output)
: output_(::std::move(output)) {}
virtual bool Get() { return output_->Get(); }
virtual ::DigitalSource *source() const { return output_.get(); }
private:
- const ::std::unique_ptr<::AnalogTriggerOutput> output_;
+ const ::std::unique_ptr< ::AnalogTriggerOutput> output_;
};
class DigitalInput : public DigitalSource {
public:
- DigitalInput(::std::unique_ptr<::DigitalInput> input)
+ explicit DigitalInput(uint32_t channel)
+ : input_(::std::unique_ptr< ::DigitalInput>(
+ new ::DigitalInput(channel))) {
+ }
+ DigitalInput(uint8_t module, uint32_t channel)
+ : input_(::std::unique_ptr< ::DigitalInput>(
+ new ::DigitalInput(module, channel))) {
+ }
+ explicit DigitalInput(::std::unique_ptr< ::DigitalInput> input)
: input_(::std::move(input)) {}
virtual bool Get() { return input_->Get(); }
virtual ::DigitalSource *source() const { return input_.get(); }
private:
- const ::std::unique_ptr<::DigitalInput> input_;
+ const ::std::unique_ptr< ::DigitalInput> input_;
};
} // namespace hardware
diff --git a/aos/crio/hardware/hardware.gyp b/aos/crio/hardware/hardware.gyp
index 44cbb89..b63a7c3 100644
--- a/aos/crio/hardware/hardware.gyp
+++ b/aos/crio/hardware/hardware.gyp
@@ -22,6 +22,7 @@
'dependencies': [
'digital_source',
'<(EXTERNALS):WPILib',
+ '<(AOS)/build/aos.gyp:logging',
],
'export_dependent_settings': [
'<(EXTERNALS):WPILib',
diff --git a/aos/crio/shared_libs/limit_encoder_reader.cc b/aos/crio/shared_libs/limit_encoder_reader.cc
index d71f977..dbbc88d 100644
--- a/aos/crio/shared_libs/limit_encoder_reader.cc
+++ b/aos/crio/shared_libs/limit_encoder_reader.cc
@@ -8,7 +8,8 @@
namespace aos {
namespace crio {
-LimitEncoderReader::LimitEncoderReader(unique_ptr<::hardware::Counter> &counter,
+LimitEncoderReader::LimitEncoderReader(const unique_ptr<::hardware::Counter>
+ &counter,
unique_ptr<::hardware::DigitalSource>
source,
bool posEdge, bool negEdge)
diff --git a/aos/crio/shared_libs/limit_encoder_reader.h b/aos/crio/shared_libs/limit_encoder_reader.h
index 3660ffa..281244c 100644
--- a/aos/crio/shared_libs/limit_encoder_reader.h
+++ b/aos/crio/shared_libs/limit_encoder_reader.h
@@ -19,8 +19,9 @@
public:
// See InterruptNotifier for details about the state of the sensor object
// before the constructor is called.
- LimitEncoderReader(::std::unique_ptr<::aos::crio::hardware::Counter> &counter,
- ::std::uniuqe_ptr<::aos::crio::hardware::DigitalSource>
+ LimitEncoderReader(const ::std::unique_ptr< ::aos::crio::hardware::Counter>
+ &counter,
+ ::std::unique_ptr< ::aos::crio::hardware::DigitalSource>
source,
bool posEdge, bool negEdge);
@@ -34,10 +35,10 @@
// Only to set things up etc. Getting values through these methods will always
// have race conditions!
// Also helpful for debugging.
- const ::std::unique_ptr<::aos::crio::hardware::Counter> &counter() const {
+ const ::std::unique_ptr< ::aos::crio::hardware::Counter> &counter() const {
return counter_;
}
- const ::std::unique_ptr<::aos::crio::hardware::DigitalSource>
+ const ::std::unique_ptr< ::aos::crio::hardware::DigitalSource>
&source() const {
return source_;
}
@@ -48,8 +49,8 @@
}
void ReadValue();
- const ::std::unique_ptr<::aos::crio::hardware::Counter> &counter_;
- const ::std::unique_ptr<::aos::crio::hardware::DigitalSource> source_;
+ const ::std::unique_ptr< ::aos::crio::hardware::Counter> &counter_;
+ const ::std::unique_ptr< ::aos::crio::hardware::DigitalSource> source_;
const ::std::unique_ptr<InterruptNotifier<LimitEncoderReader>> notifier_;