rosaria/Legacy/Aria/ArNetworking/include/ArClientHandlerConfig.h
2021-12-16 14:07:59 +00:00

224 lines
8.8 KiB
C++

#ifndef ARCLIENTCONFIGHANDLER_H
#define ARCLIENTCONFIGHANDLER_H
#include "Aria.h"
#include "ArClientBase.h"
/// Client handler for receiving and updating ArConfig data via ArNetworking.
/**
* ArClientHandlerConfig processes the network packets that describe a
* robot's ArConfig. It also provides a means to save the modified
* configuration data to the robot server. This class is designed to
* work in conjunction with the ArServerHandlerConfig. See the server
* handler documentation for a complete description of the networking
* interface.
*
* This class should be thread safe, with the exception of
* unThreadSafeGetConfig. (If you want to use this method, surround it
* with calls to lock() and unlock().)
*
* Note that you can't add callbacks or remove callbacks from within a
* callback function.
**/
class ArClientHandlerConfig
{
public:
/// Constructor
AREXPORT ArClientHandlerConfig(ArClientBase *client,
bool ignoreBounds = false,
const char *robotName = NULL,
const char *logPrefix = NULL);
/// Destructor
AREXPORT virtual ~ArClientHandlerConfig(void);
/// Requests the config from the server
AREXPORT void requestConfigFromServer(void);
/// Tells the server to reload the configuration
AREXPORT void reloadConfigOnServer(void);
/// Threadsafe way to get the config to play with
AREXPORT ArConfig getConfigCopy(void);
/// Adds a gotConfig callback
AREXPORT void addGotConfigCB(ArFunctor *functor,
ArListPos::Pos position = ArListPos::LAST);
/// Removes a gotConfig callback
AREXPORT void remGotConfigCB(ArFunctor *functor);
/// Adds a save config to server succeeded callback
AREXPORT void addSaveConfigSucceededCB(ArFunctor *functor,
ArListPos::Pos position = ArListPos::LAST);
/// Removes a save config to server succeeded callback
AREXPORT void remSaveConfigSucceededCB(ArFunctor *functor);
/// Adds a save config to server failed callback
AREXPORT void addSaveConfigFailedCB(ArFunctor1<const char *> *functor,
ArListPos::Pos position = ArListPos::LAST);
/// Removes a save config to server failed callback
AREXPORT void remSaveConfigFailedCB(ArFunctor1<const char *> *functor);
/// Returns true if config gotten
AREXPORT bool haveGottenConfig(void);
/// Sends the config back to the server
AREXPORT void saveConfigToServer(void);
/// Sends the config back to the server
AREXPORT void saveConfigToServer(
ArConfig *config,
const std::set<std::string,
ArStrCaseCmpOp> *ignoreTheseSections = NULL);
/// Returns if we've requested some defaults
AREXPORT bool haveRequestedDefaults(void);
/// Returns if we've gotten our requested defaults
AREXPORT bool haveGottenDefaults(void);
/// Sees if we can request defaults (both types)
AREXPORT bool canRequestDefaults(void);
AREXPORT bool requestDefaultConfigFromServer(void);
AREXPORT ArConfig *getDefaultConfig();
/// Requests defaults for all sections from the server; modifies the config
AREXPORT bool requestConfigDefaults(void);
/// Requests defaults for one section from the server; modifies the config
AREXPORT bool requestSectionDefaults(const char *section);
/// Adds a got config defaults callback
AREXPORT void addGotConfigDefaultsCB(ArFunctor *functor,
ArListPos::Pos position = ArListPos::LAST);
/// Removes a got config defaults callback
AREXPORT void remGotConfigDefaultsCB(ArFunctor *functor);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Last Editable Priority
//
// This value designates the last priority (highest numerical value) for
// which parameters may be edited. For example, when this value is set to
// EXPERT, then the user may not edit FACTORY parameters.
//
// If editable priority levels are supported and the client wishes to
// receive parameters of ineditable priorities, then the method
// requestLastEditablePriority should be called (and completed) before
// requestConfigFromServer is called.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/// Returns whether the server supports the last editable priority request.
AREXPORT bool isLastEditablePriorityAvailable();
/// Requests the last editable priority from the server
AREXPORT bool requestLastEditablePriorityFromServer();
/// Returns whether the last editable priority has been received from the server
AREXPORT bool haveGottenLastEditablePriority();
/// Returns the last editable priority of the config
AREXPORT ArPriority::Priority getLastEditablePriority();
/// Adds callback invoked when the last editable priority packet is received
AREXPORT void addGotLastEditablePriorityCB
(ArFunctor *functor,
int position = 50);
/// Removes the specified callback from the list of last editable priority callbacks
AREXPORT void remGotLastEditablePriorityCB(ArFunctor *functor);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/// Unthreadsafe way to get the config to play with (see long docs)
AREXPORT ArConfig *getConfig(void);
/// Locks the config for if you're using the unthreadsafe getConfig
AREXPORT int lock(void);
/// Try to lock for the config for if you're using the unthreadsafe getConfig
AREXPORT int tryLock(void);
/// Unlocks the config for if you're using the unthreadsafe getConfig
AREXPORT int unlock(void);
/// Turn on this flag to reduce the number of verbose log messages.
AREXPORT void setQuiet(bool isQuiet);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Packet Handlers
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/// Handles the packet from the GetConfigBySectionsV3
AREXPORT void handleGetConfigBySectionsV3(ArNetPacket *packet);
/// Handles the packet from the GetConfigBySectionsV2
AREXPORT void handleGetConfigBySectionsV2(ArNetPacket *packet);
/// Handles the packet from the GetConfigBySections
AREXPORT void handleGetConfigBySections(ArNetPacket *packet);
/// Handles the packet from the GetConfigSectionFlags
AREXPORT void handleGetConfigSectionFlags(ArNetPacket *packet);
/// Handles the packet from the getConfig
AREXPORT void handleGetConfig(ArNetPacket *packet);
/// Handles the return packet from the setConfig (saveConfigToServer)
AREXPORT void handleSetConfig(ArNetPacket *packet);
/// Handles the return packet from the setConfigBySections (saveConfigToServer)
AREXPORT void handleSetConfigBySections(ArNetPacket *packet);
/// Handles the return packet from the setConfigBySectionsV2 (saveConfigToServer)
AREXPORT void handleSetConfigBySectionsV2(ArNetPacket *packet);
/// Handles the return packet from getConfigDefaults
AREXPORT void handleGetConfigDefaults(ArNetPacket *packet);
/// Handles the return packet from getLastEditablePriority
AREXPORT void handleGetLastEditablePriority(ArNetPacket *packet);
protected:
AREXPORT void handleGetConfigData(ArNetPacket *packet,
bool isMultiplePackets,
int version);
protected:
std::string myRobotName;
std::string myLogPrefix;
std::list<ArFunctor *> myGotConfigCBList;
std::list<ArFunctor *> mySaveConfigSucceededCBList;
std::list<ArFunctor1<const char *> *> mySaveConfigFailedCBList;
std::list<ArFunctor *> myGotConfigDefaultsCBList;
ArCallbackList myGotLastEditablePriorityCBList;
ArClientBase *myClient;
ArConfig myConfig;
ArConfig *myDefaultConfig;
ArPriority::Priority myLastEditablePriority;
ArMutex myDataMutex;
ArMutex myCallbackMutex;
bool myHaveRequestedLastEditablePriority;
bool myHaveGottenLastEditablePriority;
bool myHaveRequestedConfig;
bool myHaveGottenConfig;
bool myHaveRequestedDefaults;
bool myHaveGottenDefaults;
bool myHaveRequestedDefaultCopy;
bool myIsQuiet;
ArFunctor1C<ArClientHandlerConfig, ArNetPacket *> myHandleGetConfigBySectionsV3CB;
ArFunctor1C<ArClientHandlerConfig, ArNetPacket *> myHandleGetConfigBySectionsV2CB;
ArFunctor1C<ArClientHandlerConfig, ArNetPacket *> myHandleGetConfigBySectionsCB;
ArFunctor1C<ArClientHandlerConfig, ArNetPacket *> myHandleGetConfigCB;
ArFunctor1C<ArClientHandlerConfig, ArNetPacket *> myHandleSetConfigCB;
ArFunctor1C<ArClientHandlerConfig, ArNetPacket *> myHandleSetConfigBySectionsCB;
ArFunctor1C<ArClientHandlerConfig, ArNetPacket *> myHandleSetConfigBySectionsV2CB;
ArFunctor1C<ArClientHandlerConfig,
ArNetPacket *> myHandleGetConfigDefaultsCB;
ArFunctor1C<ArClientHandlerConfig,
ArNetPacket *> myHandleGetDefaultConfigCB;
ArFunctor1C<ArClientHandlerConfig,
ArNetPacket *> myHandleGetConfigSectionFlagsCB;
ArFunctor1C<ArClientHandlerConfig,
ArNetPacket *> myHandleGetLastEditablePriorityCB;
};
#endif