/usr/include/ola/rdm/PidStore.h is in libola-dev 0.9.8-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 | /*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* PidStore.h
* Holds information about RDM PIDs.
* Copyright (C) 2011 Simon Newton
*/
/**
* @addtogroup rdm_pids
* @{
* @file PidStore.h
* @brief Holds information about RDM PIDs.
* @}
*/
#ifndef INCLUDE_OLA_RDM_PIDSTORE_H_
#define INCLUDE_OLA_RDM_PIDSTORE_H_
#include <stdint.h>
#include <ola/messaging/Descriptor.h>
#include <ola/base/Macro.h>
#include <istream>
#include <map>
#include <memory>
#include <string>
#include <vector>
namespace ola {
namespace rdm {
class PidStore;
class PidDescriptor;
// The following % before Device is to stop Doxygen interpretting it as a class
/**
* @brief The root of the RDM parameter descriptor store.
*
* The root parameter store holds the PLASA (formerly known as ESTA) parameters
* as well as any manufacturer defined parameters. Parameter definitions are
* loaded from .proto files, which are generated by the
* http://rdm.openlighting.org site.
*
* Each parameter has an 16bit identifier (PID).
*
* PLASA PIDs are those defined by the E1.X series of documents. To date this
* includes:
* - E1.20, Remote %Device Management.
* - E1.37-1, Additional Message Sets for Dimmers.
* - E1.37-2, Additional Message Sets for IPv4 & DNS Configuration.
*
* An overrides.proto file can be used as a local system override of any PID
* data. This allows manufacturers to specify their own manufacturer specific
* commands and for testing of draft PIDs.
*/
class RootPidStore {
public:
typedef std::map<uint16_t, const PidStore*> ManufacturerMap;
/**
* @brief Create a new RootPidStore.
*
* Most code shouldn't have to use this. Use RootPidStore::LoadFromFile or
* RootPidStore::LoadFromDirectory instead.
*/
RootPidStore(const PidStore *esta_store,
const ManufacturerMap &manufacturer_stores,
uint64_t version = 0)
: m_esta_store(esta_store),
m_manufacturer_store(manufacturer_stores),
m_version(version) {
}
~RootPidStore();
/**
* @brief The version of the RDM parameter data.
* @returns The version of the parameter data. A higher number is a more
* recent version.
*/
uint64_t Version() const { return m_version; }
/**
* @brief Return the PidStore for PLASA (ESTA) parameters.
* @returns the PidStore for the PLASA parameters. The pointer is valid for
* the lifetime of the RootPidStore.
*/
const PidStore *EstaStore() const {
return m_esta_store.get();
}
/**
* @brief Return the PidStore for a manufacturer.
* @param esta_id the manufacturer id.
* @returns A pointer to a PidStore or NULL if there were no parameters for
* this manufacturer.
*/
const PidStore *ManufacturerStore(uint16_t esta_id) const;
/**
* @brief Lookup a PLASA-defined parameter by name.
* @param pid_name the name of the parameter.
* @return a PidDescriptor or NULL if the parameter wasn't found.
*/
const PidDescriptor *GetDescriptor(const std::string &pid_name) const;
/**
* @brief Lookup a parameter by name in both the PLASA and the specified
* manufacturer store.
* @param pid_name the name of the parameter to look for.
* @param manufacturer_id the ESTA id of the manufacturer.
* @return a PidDescriptor or NULL if the parameter wasn't found.
*/
const PidDescriptor *GetDescriptor(const std::string &pid_name,
uint16_t manufacturer_id) const;
/**
* @brief Look up a PLASA-defined parameter by PID.
* @param pid_value the PID to lookup.
* @return a PidDescriptor or NULL if the parameter wasn't found.
*/
const PidDescriptor *GetDescriptor(uint16_t pid_value) const;
/**
* @brief Lookup a parameter by PID in both the PLASA and the specified
* manufacturer store.
* @param pid_value the pid to lookup
* @param manufacturer_id the ESTA id of the manufacturer.
* @return a PidDescriptor or NULL if the parameter wasn't found.
*/
const PidDescriptor *GetDescriptor(uint16_t pid_value,
uint16_t manufacturer_id) const;
/**
* @brief Load a RootPidStore from a file.
* @param file the file to load
* @param validate whether to perform validation on the data. Validation can
* be turned off for faster load times.
*/
static const RootPidStore *LoadFromFile(const std::string &file,
bool validate = true);
/**
* @brief Load a RootPidStore from a directory.
* @param directory the directory containing the PID data. If directory is
* empty, the installed location will be used.
* @param validate whether to perform validation on the data. Validation can
* be turned off for faster load times.
*/
static const RootPidStore *LoadFromDirectory(const std::string &directory,
bool validate = true);
/**
* @brief Returns the location of the installed PID data.
* @returns the directory where the pid data was installed.
*/
static const std::string DataLocation();
private:
std::auto_ptr<const PidStore> m_esta_store;
ManufacturerMap m_manufacturer_store;
uint64_t m_version;
const PidDescriptor *InternalESTANameLookup(
const std::string &pid_name) const;
DISALLOW_COPY_AND_ASSIGN(RootPidStore);
};
/**
* @brief Holds the PidDescriptors for a single manufacturer.
*/
class PidStore {
public:
/**
* @brief Create a new PidStore with the given PidDescriptors.
* @param pids a list of PidDescriptors to use.
* @pre the names and values for the pids in the vector are unique.
* @note Most code shouldn't have to use this. Call
* RootPidStore::LoadFromFile() or RootPidStore::LoadFromDirectory()
* instead.
*/
explicit PidStore(const std::vector<const PidDescriptor*> &pids);
/**
* @brief Clean up
*/
~PidStore();
/**
* @brief The number of PidDescriptors in this store.
* @returns the number of PidDescriptors in this store.
*/
unsigned int PidCount() const { return m_pid_by_value.size(); }
/**
* @brief Return a list of all PidDescriptors.
* @param[out] pids a vector which is populated with a list of
* PidDescriptors.
*
* The pointers returned are valid for the life of the PidStore object.
*/
void AllPids(std::vector<const PidDescriptor*> *pids) const;
/**
* @brief Lookup a PidDescriptor by PID.
* @param pid_value the PID to lookup.
* @return a PidDescriptor or NULL if the parameter wasn't found.
*/
const PidDescriptor *LookupPID(uint16_t pid_value) const;
/**
* @brief Lookup a PidDescriptor by parameter name.
* @param pid_name the name of the parameter to look for.
* @return a PidDescriptor or NULL if the parameter wasn't found.
*/
const PidDescriptor *LookupPID(const std::string &pid_name) const;
private:
typedef std::map<uint16_t, const PidDescriptor*> PidMap;
typedef std::map<std::string, const PidDescriptor*> PidNameMap;
PidMap m_pid_by_value;
PidNameMap m_pid_by_name;
DISALLOW_COPY_AND_ASSIGN(PidStore);
};
/**
* Contains the descriptors for the GET/SET Requests & Responses for a single
* PID.
*/
class PidDescriptor {
public:
// TODO(simon): use the enums from the Pids.proto instead of duplicating
// here.
typedef enum {
ROOT_DEVICE, // 0 only
ANY_SUB_DEVICE, // 0 - 512 or ALL_DEVICES
NON_BROADCAST_SUB_DEVICE, // 0 - 512
SPECIFIC_SUB_DEVICE, // 1- 512
} sub_device_validator;
PidDescriptor(const std::string &name,
uint16_t value,
const ola::messaging::Descriptor *get_request,
const ola::messaging::Descriptor *get_response,
const ola::messaging::Descriptor *set_request,
const ola::messaging::Descriptor *set_response,
sub_device_validator get_sub_device_range,
sub_device_validator set_sub_device_range)
: m_name(name),
m_pid_value(value),
m_get_request(get_request),
m_get_response(get_response),
m_set_request(set_request),
m_set_response(set_response),
m_get_subdevice_range(get_sub_device_range),
m_set_subdevice_range(set_sub_device_range) {
}
~PidDescriptor();
const std::string &Name() const { return m_name; }
uint16_t Value() const { return m_pid_value; }
const ola::messaging::Descriptor *GetRequest() const { return m_get_request; }
const ola::messaging::Descriptor *GetResponse() const {
return m_get_response;
}
const ola::messaging::Descriptor *SetRequest() const { return m_set_request; }
const ola::messaging::Descriptor *SetResponse() const {
return m_set_response;
}
bool IsGetValid(uint16_t sub_device) const;
bool IsSetValid(uint16_t sub_device) const;
private:
const std::string m_name;
uint16_t m_pid_value;
const ola::messaging::Descriptor *m_get_request;
const ola::messaging::Descriptor *m_get_response;
const ola::messaging::Descriptor *m_set_request;
const ola::messaging::Descriptor *m_set_response;
sub_device_validator m_get_subdevice_range;
sub_device_validator m_set_subdevice_range;
bool RequestValid(uint16_t sub_device,
const sub_device_validator &validator) const;
DISALLOW_COPY_AND_ASSIGN(PidDescriptor);
};
} // namespace rdm
} // namespace ola
#endif // INCLUDE_OLA_RDM_PIDSTORE_H_
|