YARP
Yet Another Robot Platform
fakeBattery.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#include "fakeBattery.h"
7
8#include <yarp/os/Log.h>
10#include <yarp/os/LogStream.h>
11#include <yarp/os/Time.h>
12
13#include <iostream>
14#include <cstring>
15
16using namespace yarp::os;
17using namespace yarp::dev;
18
19namespace {
20YARP_LOG_COMPONENT(FAKEBATTERY, "yarp.device.fakeBattery")
21constexpr double default_period = 0.02;
22constexpr double default_charge = 50.0;
23constexpr double default_voltage = 30.0;
24constexpr double default_current = 3.0;
25constexpr double default_temperature = 20.0;
26constexpr const char* default_info = "Fake battery system v2.0";
27}
28
31{
32}
33
34
36{
37 double period = config.check("thread_period", Value(default_period), "Thread period (smaller implies faster charge/discharge)").asFloat64();
38 setPeriod(period);
39
40 double charge = config.check("charge", Value(default_charge), "Initial charge (%)").asFloat64();
41 double voltage = config.check("voltage", Value(default_voltage), "Initial voltage (V)").asFloat64();
42 double current = config.check("current", Value(default_current), "Initial current (A)").asFloat64();
43 double temperature = config.check("temperature", Value(default_temperature), "Initial temperature (°C)").asFloat64();
44 std::string info = config.check("info", Value(default_info), "Initial battery information").asString();
45 {
46 std::lock_guard<std::mutex> lock(m_mutex);
47 battery_charge = charge;
48 battery_voltage = voltage;
49 battery_current = current;
50 battery_temperature = temperature;
51 battery_info = std::move(info);
52 updateStatus();
53 }
54
55 std::string name = config.find("name").asString();
57 if (!ctrl_port.open(name + "/control/rpc:i")) {
58 yCError(FAKEBATTERY, "Could not open rpc port");
59 close();
60 return false;
61 }
62
63 PeriodicThread::start();
64
65 return true;
66}
67
69{
70 // Stop the thread
71 PeriodicThread::stop();
72
73 // Close the RPC port
75
76 return true;
77}
78
80{
81 std::lock_guard<std::mutex> lock(m_mutex);
82 if (battery_current > 0.1) {
83 battery_charge -= 0.001;
84 } else if (battery_current < -0.1) {
85 battery_charge += 0.001;
86 }
87 updateStatus();
88}
89
90bool FakeBattery::getBatteryVoltage(double& voltage)
91{
92 std::lock_guard<std::mutex> lock(m_mutex);
93 voltage = battery_voltage;
94 return true;
95}
96
97bool FakeBattery::getBatteryCurrent(double& current)
98{
99 std::lock_guard<std::mutex> lock(m_mutex);
100 current = battery_current;
101 return true;
102}
103
105{
106 std::lock_guard<std::mutex> lock(m_mutex);
107 charge = battery_charge;
108 return true;
109}
110
112{
113 std::lock_guard<std::mutex> lock(m_mutex);
114 status = battery_status;
115 return true;
116}
117
118bool FakeBattery::getBatteryTemperature(double& temperature)
119{
120 std::lock_guard<std::mutex> lock(m_mutex);
121 temperature = battery_temperature;
122 return true;
123}
124
125bool FakeBattery::getBatteryInfo(std::string& info)
126{
127 std::lock_guard<std::mutex> lock(m_mutex);
128 info = battery_info;
129 return true;
130}
131
132void FakeBattery::setBatteryVoltage(const double voltage)
133{
134 std::lock_guard<std::mutex> lock(m_mutex);
135 battery_voltage = voltage;
137 updateStatus();
138}
139
140void FakeBattery::setBatteryCurrent(const double current)
141{
142 std::lock_guard<std::mutex> lock(m_mutex);
143 battery_current = current;
145 updateStatus();
146}
147
148void FakeBattery::setBatteryCharge(const double charge)
149{
150 std::lock_guard<std::mutex> lock(m_mutex);
151 battery_charge = charge;
153 updateStatus();
154}
155
157{
158 std::lock_guard<std::mutex> lock(m_mutex);
159 battery_status = status;
161}
162
163void FakeBattery::setBatteryInfo(const std::string& info)
164{
165 std::lock_guard<std::mutex> lock(m_mutex);
166 battery_info = info;
167}
168
169void FakeBattery::setBatteryTemperature(const double temperature)
170{
171 std::lock_guard<std::mutex> lock(m_mutex);
172 battery_temperature = temperature;
173}
174
176{
177 std::lock_guard<std::mutex> lock(m_mutex);
178 return battery_voltage;
179}
180
182{
183 std::lock_guard<std::mutex> lock(m_mutex);
184 return battery_current;
185}
186
188{
189 std::lock_guard<std::mutex> lock(m_mutex);
190 return battery_charge;
191}
192
194{
195 std::lock_guard<std::mutex> lock(m_mutex);
196 yCInfo(FAKEBATTERY, "getBatteryStatus() -> %d", static_cast<int>(battery_status));
197 return battery_status;
198}
199
201{
202 std::lock_guard<std::mutex> lock(m_mutex);
203 switch (battery_status) {
205 return "0: BATTERY_OK_STANBY";
207 return "1: BATTERY_OK_IN_CHARGE";
209 return "2: BATTERY_OK_IN_USE";
211 return "3: BATTERY_GENERAL_ERROR";
212 case BATTERY_TIMEOUT:
213 return "4: BATTERY_TIMEOUT";
215 return "5: BATTERY_LOW_WARNING";
217 return "6: BATTERY_CRITICAL_WARNING";
218 default:
219 return "Invalid battery status";
220 };
221}
222
224{
225 std::lock_guard<std::mutex> lock(m_mutex);
226 return battery_info;
227}
228
230{
231 std::lock_guard<std::mutex> lock(m_mutex);
232 return battery_temperature;
233}
234
235
236void FakeBattery::updateStatus()
237{
239 return;
240 }
242 if (battery_current > 0.1) {
243 if (battery_charge > 15.0) {
244 battery_status = yarp::dev::IBattery::Battery_status::BATTERY_OK_IN_USE;
245 } else if (battery_charge > 5.0) {
246 battery_status = yarp::dev::IBattery::Battery_status::BATTERY_LOW_WARNING;
247 } else {
248 battery_status = yarp::dev::IBattery::Battery_status::BATTERY_CRITICAL_WARNING;
249 }
250 } else if (battery_current > -0.1) {
251 battery_status = yarp::dev::IBattery::Battery_status::BATTERY_OK_STANBY;
252 } else {
253 battery_status = yarp::dev::IBattery::Battery_status::BATTERY_OK_IN_CHARGE;
254 }
255}
constexpr double default_period
Definition: FakeOdometry.h:14
fakeBattery: Documentation to be added
Definition: fakeBattery.h:29
void setBatteryTemperature(const double temperature) override
double getBatteryCharge() override
std::string getBatteryInfo() override
std::string battery_info
Definition: fakeBattery.h:36
double battery_temperature
Definition: fakeBattery.h:35
void setBatteryStatus(const yarp::dev::IBattery::Battery_status status) override
void setBatteryInfo(const std::string &info) override
Battery_status getBatteryStatus() override
yarp::os::RpcServer ctrl_port
Definition: fakeBattery.h:42
void setBatteryCurrent(const double current) override
void run() override
Loop function.
Definition: fakeBattery.cpp:79
Battery_status battery_status
Definition: fakeBattery.h:37
bool suspend_battery_status_update
Definition: fakeBattery.h:38
bool open(yarp::os::Searchable &config) override
Open the DeviceDriver.
Definition: fakeBattery.cpp:35
void setBatteryVoltage(const double voltage) override
bool close() override
Close the DeviceDriver.
Definition: fakeBattery.cpp:68
double battery_charge
Definition: fakeBattery.h:32
double battery_voltage
Definition: fakeBattery.h:33
void setBatteryCharge(const double charge) override
double getBatteryVoltage() override
std::mutex m_mutex
Definition: fakeBattery.h:31
double battery_current
Definition: fakeBattery.h:34
double getBatteryCurrent() override
std::string getBatteryStatusString() override
double getBatteryTemperature() override
bool open(const std::string &name) override
Start port operation, with a specific name, with automatically-chosen network parameters.
void close() override
Stop port activity.
An abstraction for a periodic thread.
bool setPeriod(double period)
Set the (new) period of the thread.
A base class for nested structures that can be searched.
Definition: Searchable.h:63
virtual bool check(const std::string &key) const =0
Check if there exists a property of the given name.
virtual Value & find(const std::string &key) const =0
Gets a value corresponding to a given keyword.
A single value (typically within a Bottle).
Definition: Value.h:43
virtual std::string asString() const
Get string value.
Definition: Value.cpp:234
yarp::os::WireLink & yarp()
Get YARP state associated with this object.
Definition: Wire.h:28
#define yCInfo(component,...)
Definition: LogComponent.h:171
#define yCError(component,...)
Definition: LogComponent.h:213
#define YARP_LOG_COMPONENT(name,...)
Definition: LogComponent.h:76
constexpr const T & clamp(const T &v, const T &lo, const T &hi)
Definition: numeric.h:91
For streams capable of holding different kinds of content, check what they actually have.
An interface to the operating system, including Port based communication.