/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * RDMHttpModule.h * This module acts as the http -> olad gateway for RDM commands. * Copyright (C) 2010 Simon Newton */ #ifndef OLAD_RDMHTTPMODULE_H_ #define OLAD_RDMHTTPMODULE_H_ #include #include #include #include #include "ola/OlaCallbackClient.h" #include "ola/rdm/RDMAPI.h" #include "ola/rdm/UID.h" #include "ola/web/JsonSections.h" #include "olad/HttpModule.h" #include "olad/HttpServer.h" namespace ola { using std::string; using ola::rdm::UID; /* * The module that deals with RDM requests. */ class RDMHttpModule: public HttpModule { public: RDMHttpModule(HttpServer *http_server, class OlaCallbackClient *client); ~RDMHttpModule(); int RunRDMDiscovery(const HttpRequest *request, HttpResponse *response); int JsonUIDs(const HttpRequest *request, HttpResponse *response); int JsonSupportedPIDs(const HttpRequest *request, HttpResponse *response); int JsonSupportedSections(const HttpRequest *request, HttpResponse *response); int JsonSectionInfo(const HttpRequest *request, HttpResponse *response); int JsonSaveSectionInfo(const HttpRequest *request, HttpResponse *response); void PruneUniverseList(const vector &universes); private: typedef struct { string manufacturer; string device; bool active; } resolved_uid; typedef enum { RESOLVE_MANUFACTURER, RESOLVE_DEVICE, } uid_resolve_action; typedef struct { map resolved_uids; std::queue > pending_uids; bool uid_resolution_running; bool active; } uid_resolution_state; HttpServer *m_server; class OlaCallbackClient *m_client; ola::rdm::RDMAPI m_rdm_api; map m_universe_uids; typedef struct { string id; string name; string hint; } section_info; struct lt_section_info { bool operator()(const section_info &left, const section_info &right) { return left.name < right.name; } }; typedef struct { unsigned int universe_id; const UID uid; string hint; string device_model; string software_version; } device_info; typedef struct { unsigned int universe_id; const UID *uid; bool include_descriptions; unsigned int active; unsigned int next; unsigned int total; vector > personalities; } personality_info; RDMHttpModule(const RDMHttpModule&); RDMHttpModule& operator=(const RDMHttpModule&); // uid resolution methods void HandleUIDList(HttpResponse *response, unsigned int universe_id, const ola::rdm::UIDSet &uids, const string &error); void ResolveNextUID(unsigned int universe_id); void UpdateUIDManufacturerLabel(unsigned int universe, UID uid, const ola::rdm::ResponseStatus &status, const string &device_label); void UpdateUIDDeviceLabel(unsigned int universe, UID uid, const ola::rdm::ResponseStatus &status, const string &device_label); uid_resolution_state *GetUniverseUids(unsigned int universe); uid_resolution_state *GetUniverseUidsOrCreate(unsigned int universe); // supported params / sections void SupportedParamsHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, const vector &pids); void SupportedSectionsHandler(HttpResponse *response, unsigned int universe, UID uid, const ola::rdm::ResponseStatus &status, const vector &pids); void SupportedSectionsDeviceInfoHandler( HttpResponse *response, const vector pids, const ola::rdm::ResponseStatus &status, const ola::rdm::DeviceDescriptor &device); // section methods string GetDeviceInfo(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void GetSoftwareVersionHandler(HttpResponse *response, device_info dev_info, const ola::rdm::ResponseStatus &status, const string &software_version); void GetDeviceModelHandler(HttpResponse *response, device_info dev_info, const ola::rdm::ResponseStatus &status, const string &device_model); void GetDeviceInfoHandler(HttpResponse *response, device_info dev_info, const ola::rdm::ResponseStatus &status, const ola::rdm::DeviceDescriptor &device); string GetProductIds(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void GetProductIdsHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, const vector &ids); string GetManufacturerLabel(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void GetManufacturerLabelHandler(HttpResponse *response, unsigned int universe_id, const UID uid, const ola::rdm::ResponseStatus &status, const string &label); string GetDeviceLabel(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void GetDeviceLabelHandler(HttpResponse *response, unsigned int universe_id, const UID uid, const ola::rdm::ResponseStatus &status, const string &label); string SetDeviceLabel(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetFactoryDefaults(HttpResponse *response, unsigned int universe_id, const UID &uid); void FactoryDefaultsHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, bool defaults); string SetFactoryDefault(HttpResponse *response, unsigned int universe_id, const UID &uid); string GetLanguage(HttpResponse *response, unsigned int universe_id, const UID &uid); void GetSupportedLanguagesHandler(HttpResponse *response, unsigned int universe_id, const UID uid, const ola::rdm::ResponseStatus &status, const vector &languages); void GetLanguageHandler(HttpResponse *response, vector languages, const ola::rdm::ResponseStatus &status, const string &language); string SetLanguage(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetBootSoftware(HttpResponse *response, unsigned int universe_id, const UID &uid); void GetBootSoftwareLabelHandler(HttpResponse *response, unsigned int universe_id, const UID uid, const ola::rdm::ResponseStatus &status, const string &label); void GetBootSoftwareVersionHandler( HttpResponse *response, string label, const ola::rdm::ResponseStatus &status, uint32_t version); string GetPersonalities(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void GetPersonalityHandler( HttpResponse *response, personality_info *info, const ola::rdm::ResponseStatus &status, uint8_t current, uint8_t total); void GetNextPersonalityDescription(HttpResponse *response, personality_info *info); void GetPersonalityLabelHandler( HttpResponse *response, personality_info *info, const ola::rdm::ResponseStatus &status, uint8_t personality, uint16_t slot_count, const string &label); void SendPersonalityResponse(HttpResponse *response, personality_info *info); string SetPersonality(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetStartAddress(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void GetStartAddressHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, uint16_t address); string SetStartAddress(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetSensor(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void SensorDefinitionHandler(HttpResponse *response, unsigned int universe_id, const UID uid, uint8_t sensor_id, const ola::rdm::ResponseStatus &status, const ola::rdm::SensorDescriptor &definition); void SensorValueHandler(HttpResponse *response, ola::rdm::SensorDescriptor *definition, const ola::rdm::ResponseStatus &status, const ola::rdm::SensorValueDescriptor &value); string RecordSensor(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetDeviceHours(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string SetDeviceHours(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetLampHours(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string SetLampHours(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetLampStrikes(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string SetLampStrikes(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetLampState(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void LampStateHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, uint8_t state); string SetLampState(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetLampMode(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); void LampModeHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, uint8_t mode); string SetLampMode(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetPowerCycles(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string SetPowerCycles(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetDisplayInvert(HttpResponse *response, unsigned int universe_id, const UID &uid); void DisplayInvertHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, uint8_t value); string SetDisplayInvert(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetDisplayLevel(HttpResponse *response, unsigned int universe_id, const UID &uid); void DisplayLevelHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, uint8_t value); string SetDisplayLevel(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetPanInvert(HttpResponse *response, unsigned int universe_id, const UID &uid); string SetPanInvert(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetTiltInvert(HttpResponse *response, unsigned int universe_id, const UID &uid); string SetTiltInvert(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetPanTiltSwap(HttpResponse *response, unsigned int universe_id, const UID &uid); string SetPanTiltSwap(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetClock(HttpResponse *response, unsigned int universe_id, const UID &uid); void ClockHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, const ola::rdm::ClockValue &clock); string GetIdentifyMode(HttpResponse *response, unsigned int universe_id, const UID &uid); string SetIdentifyMode(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); string GetPowerState(HttpResponse *response, unsigned int universe_id, const UID &uid); void PowerStateHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status, uint8_t value); string SetPowerState(const HttpRequest *request, HttpResponse *response, unsigned int universe_id, const UID &uid); // util methods bool CheckForInvalidId(const HttpRequest *request, unsigned int *universe_id); bool CheckForInvalidUid(const HttpRequest *request, UID **uid); void SetHandler(HttpResponse *response, const ola::rdm::ResponseStatus &status); void GenericUIntHandler(HttpResponse *response, string description, const ola::rdm::ResponseStatus &status, uint32_t value); void GenericUInt8BoolHandler(HttpResponse *response, string description, const ola::rdm::ResponseStatus &status, uint8_t value); void GenericBoolHandler(HttpResponse *response, string description, const ola::rdm::ResponseStatus &status, bool value); bool CheckForRDMError(HttpResponse *response, const ola::rdm::ResponseStatus &status); int RespondWithError(HttpResponse *response, const string &error); void RespondWithSection(HttpResponse *response, const ola::web::JsonSection §ion); bool CheckForRDMSuccess(const ola::rdm::ResponseStatus &status); bool CheckForRDMSuccessWithError(const ola::rdm::ResponseStatus &status, string *error); void HandleBoolResponse(HttpResponse *response, const string &error); void AddSection(vector *sections, const string §ion_id, const string §ion_name, const string &hint=""); static const uint32_t INVALID_PERSONALITY = 0xffff; static const char BACKEND_DISCONNECTED_ERROR[]; static const char HINT_KEY[]; static const char ID_KEY[]; static const char SECTION_KEY[]; static const char UID_KEY[]; static const char ADDRESS_FIELD[]; static const char DISPLAY_INVERT_FIELD[]; static const char GENERIC_BOOL_FIELD[]; static const char GENERIC_STRING_FIELD[]; static const char GENERIC_UINT_FIELD[]; static const char IDENTIFY_FIELD[]; static const char LABEL_FIELD[]; static const char LANGUAGE_FIELD[]; static const char RECORD_SENSOR_FIELD[]; static const char BOOT_SOFTWARE_SECTION[]; static const char CLOCK_SECTION[]; static const char DEVICE_HOURS_SECTION[]; static const char DEVICE_INFO_SECTION[]; static const char DEVICE_LABEL_SECTION[]; static const char DISPLAY_INVERT_SECTION[]; static const char DISPLAY_LEVEL_SECTION[]; static const char DMX_ADDRESS_SECTION[]; static const char FACTORY_DEFAULTS_SECTION[]; static const char IDENTIFY_SECTION[]; static const char LAMP_HOURS_SECTION[]; static const char LAMP_MODE_SECTION[]; static const char LAMP_STATE_SECTION[]; static const char LAMP_STRIKES_SECITON[]; static const char LANGUAGE_SECTION[]; static const char MANUFACTURER_LABEL_SECTION[]; static const char PAN_INVERT_SECTION[]; static const char PAN_TILT_SWAP_SECTION[]; static const char PERSONALITY_SECTION[]; static const char POWER_CYCLES_SECTION[]; static const char POWER_STATE_SECTION[]; static const char PRODUCT_DETAIL_SECTION[]; static const char SENSOR_SECTION[]; static const char TILT_INVERT_SECTION[]; }; } // ola #endif // OLAD_RDMHTTPMODULE_H_