mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
I'm not 100% sure whether we want these, but they are a quick find and replace to do. Basically, there are two primary things that we have done this summer that break existing user code: -Changing GetInstance() calls to return references instead of pointers. This forces users to change from doing something like LiveWindow::GetInstance()->AddSensor() to LiveWindow::GetInstance().AddSensor(). -Making PIDGet() and related calls const, forcing users to change the function signatures wherever they override them. The GetInstance() calls don't really matter to me either way, especially since there are no real ownership issues going on there, unlike the rest of the smart pointer-related changes. For the const stuff, it is certainly more correct to mandate that user PIDGet() functions be const and the such, but at the same time, I'm not sure that there is any strong need for it, and the errors generated are not the most helpful. While this wouldn't necessarily be an issue for more experienced teams or completely new teams (who don't have any old code to be reusing), it may cause issues for more average teams who aren't familiar with the intricacies of C++ anything. Change-Id: I6e7007982069292ea70e6d0fc8ca40203340df1b
112 lines
3.9 KiB
C++
112 lines
3.9 KiB
C++
/*----------------------------------------------------------------------------*/
|
|
/* Copyright (c) FIRST 2008. All Rights Reserved.
|
|
*/
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
|
|
/*----------------------------------------------------------------------------*/
|
|
#pragma once
|
|
|
|
#include "SensorBase.h"
|
|
#include "Counter.h"
|
|
#include "Task.h"
|
|
#include "PIDSource.h"
|
|
#include "LiveWindow/LiveWindowSendable.h"
|
|
#include <atomic>
|
|
|
|
#include "HAL/cpp/priority_mutex.h"
|
|
|
|
#include <memory>
|
|
|
|
class DigitalInput;
|
|
class DigitalOutput;
|
|
|
|
/**
|
|
* Ultrasonic rangefinder class.
|
|
* The Ultrasonic rangefinder measures absolute distance based on the round-trip
|
|
* time
|
|
* of a ping generated by the controller. These sensors use two transducers, a
|
|
* speaker and
|
|
* a microphone both tuned to the ultrasonic range. A common ultrasonic sensor,
|
|
* the Daventech SRF04
|
|
* requires a short pulse to be generated on a digital channel. This causes the
|
|
* chirp to be
|
|
* emmitted. A second line becomes high as the ping is transmitted and goes low
|
|
* when
|
|
* the echo is received. The time that the line is high determines the round
|
|
* trip distance
|
|
* (time of flight).
|
|
*/
|
|
class Ultrasonic : public SensorBase,
|
|
public PIDSource,
|
|
public LiveWindowSendable {
|
|
public:
|
|
enum DistanceUnit { kInches = 0, kMilliMeters = 1 };
|
|
|
|
[[deprecated(
|
|
"Raw pointers are deprecated; prefer either specifying the channel "
|
|
"numbers as integers or passing shared_ptrs.")]]
|
|
Ultrasonic(DigitalOutput *pingChannel, DigitalInput *echoChannel,
|
|
DistanceUnit units = kInches);
|
|
|
|
[[deprecated(
|
|
"References are deprecated; prefer either specifying the channel numbers "
|
|
"as integers or passing shared_ptrs.")]]
|
|
Ultrasonic(DigitalOutput &pingChannel, DigitalInput &echoChannel,
|
|
DistanceUnit units = kInches);
|
|
|
|
Ultrasonic(std::shared_ptr<DigitalOutput> pingChannel,
|
|
std::shared_ptr<DigitalInput> echoChannel,
|
|
DistanceUnit units = kInches);
|
|
Ultrasonic(uint32_t pingChannel, uint32_t echoChannel,
|
|
DistanceUnit units = kInches);
|
|
virtual ~Ultrasonic();
|
|
|
|
void Ping();
|
|
bool IsRangeValid() const;
|
|
static void SetAutomaticMode(bool enabling);
|
|
double GetRangeInches() const;
|
|
double GetRangeMM() const;
|
|
bool IsEnabled() const { return m_enabled; }
|
|
void SetEnabled(bool enable) { m_enabled = enable; }
|
|
|
|
double PIDGet() override;
|
|
void SetPIDSourceType(PIDSourceType pidSource) override;
|
|
void SetDistanceUnits(DistanceUnit units);
|
|
DistanceUnit GetDistanceUnits() const;
|
|
|
|
void UpdateTable() override;
|
|
void StartLiveWindowMode() override;
|
|
void StopLiveWindowMode() override;
|
|
std::string GetSmartDashboardType() const override;
|
|
void InitTable(std::shared_ptr<ITable> subTable) override;
|
|
std::shared_ptr<ITable> GetTable() const override;
|
|
|
|
private:
|
|
void Initialize();
|
|
|
|
static void UltrasonicChecker();
|
|
|
|
static constexpr double kPingTime =
|
|
10 * 1e-6; ///< Time (sec) for the ping trigger pulse.
|
|
static const uint32_t kPriority =
|
|
64; ///< Priority that the ultrasonic round robin task runs.
|
|
static constexpr double kMaxUltrasonicTime =
|
|
0.1; ///< Max time (ms) between readings.
|
|
static constexpr double kSpeedOfSoundInchesPerSec = 1130.0 * 12.0;
|
|
|
|
static Task m_task; // task doing the round-robin automatic sensing
|
|
static Ultrasonic *m_firstSensor; // head of the ultrasonic sensor list
|
|
static std::atomic<bool> m_automaticEnabled; // automatic round robin mode
|
|
static priority_mutex m_mutex; // synchronize access to the list of sensors
|
|
|
|
std::shared_ptr<DigitalOutput> m_pingChannel;
|
|
std::shared_ptr<DigitalInput> m_echoChannel;
|
|
bool m_allocatedChannels;
|
|
bool m_enabled;
|
|
Counter m_counter;
|
|
Ultrasonic *m_nextSensor;
|
|
DistanceUnit m_units;
|
|
|
|
std::shared_ptr<ITable> m_table = nullptr;
|
|
};
|