35#define MOCK_R(value) \
41#define SERVICE(ClassName) \
44 DependencyManager<ClassName>
47#define VOID_SINGLETON_INVOKER(Decl, Call) \
50 getInstance()->Call; \
54#define SINGLETON_INVOKER(ReturnType, Decl, Call) \
55 static ReturnType Decl \
57 return getInstance()->Call; \
61#define ALL_INVOKER(Decl, Call) \
64 auto instances = getAllInstances(); \
65 for (auto instance : instances) \
70#define BOTH_INVOKER(Decl, Call) \
73 getInstance()->Call; \
74 auto instances = getAllInstances(); \
75 for (auto instance : instances) \
88template <
typename Service>
102 if constexpr ((std::is_abstract<Service>::value) || (!std::is_default_constructible<Service>::value))
104 assert((_singleton !=
nullptr) &&
"Provider not injected to Service");
108 if (_singleton ==
nullptr)
109 _singleton =
new Service();
130 template <
typename Prov
ider>
131 static void inject(Provider *instance,
bool multipleInstances =
false)
133 static_assert(std::is_base_of<Service, Provider>::value,
"Provider is not derived from Service");
134 assert((instance !=
nullptr) &&
"A null provider is not allowed");
135 if (multipleInstances)
137 _instanceSet.push_back(instance);
141 assert((_singleton ==
nullptr) &&
"Provider already injected to service");
142 _singleton = instance;
153 if (_singleton !=
nullptr)
156 _singleton =
nullptr;
158 for (
auto instance : _instanceSet)
160 _instanceSet.clear();
167 inline static Service *_singleton =
nullptr;
178class SERVICE(InputService)
185 virtual void recalibrateAxes()
MOCK;
192 virtual
void reverseLeftAxis()
MOCK;
199 virtual
void reverseRightAxis()
MOCK;
209 virtual
void setRotaryPulseWidthMultiplier(
233 virtual
bool getAxisCalibration(
237 int &maxRight)
MOCK_R(false);
250 virtual
void setAxisCalibration(
263 virtual
void getAxisPolarity(
264 bool &leftAxisReversed,
265 bool &rightAxisReversed)
MOCK;
274 virtual
void setAxisPolarity(
275 bool leftAxisReversed,
276 bool rightAxisReversed,
283 virtual
void update()
MOCK;
294 setRotaryPulseWidthMultiplier(multiplier, save))
297 getRotaryPulseWidthMultiplier(),
298 getRotaryPulseWidthMultiplier())
306 getAxisCalibration(minLeft, maxLeft, minRight, maxRight))
314 setAxisCalibration(minLeft, maxLeft, minRight, maxRight, save))
317 bool &leftAxisReversed,
318 bool &rightAxisReversed),
324 bool leftAxisReversed,
325 bool rightAxisReversed,
349 virtual bool getSecurityLock()
MOCK_R(false);
354 virtual
void setBitePoint(uint8_t value,
bool save)
MOCK;
358 virtual
void setSecurityLock(
bool value,
bool save)
MOCK;
373 setClutchWorkingMode(mode, save))
376 setAltButtonsWorkingMode(mode, save))
379 setDPadWorkingMode(mode, save))
381 setSecurityLock(
bool value,
bool save = true),
382 setSecurityLock(value, save))
401 uint8_t firmware_defined,
402 uint8_t user_defined,
403 uint8_t user_defined_alt)
MOCK;
405 uint8_t firmware_defined,
406 uint8_t &user_defined,
407 uint8_t &user_defined_alt)
409 user_defined = firmware_defined;
410 user_defined_alt = firmware_defined + 64;
412 virtual void resetMap()
MOCK;
417 setMap(uint8_t firmware_defined, uint8_t user_defined, uint8_t user_defined_alt),
418 setMap(firmware_defined, user_defined, user_defined_alt))
420 getMap(uint8_t firmware_defined, uint8_t &user_defined, uint8_t &user_defined_alt),
421 getMap(firmware_defined, user_defined, user_defined_alt))
434class SERVICE(PowerService)
437 virtual void shutdown()
MOCK;
453class SERVICE(BatteryService)
460 virtual int getLastBatteryLevel()
MOCK_R(0);
470 virtual
bool hasBattery()
MOCK_R(false);
482 virtual
bool isBatteryPresent()
MOCK_R(false);
510class
SERVICE(BatteryCalibrationService)
517 virtual void restartAutoCalibration()
MOCK;
526 virtual
int getBatteryLevel(
int reading)
MOCK_R(-1);
541 virtual
int getBatteryLevelAutoCalibrated(
int reading)
MOCK_R(0);
547 virtual uint8_t getCalibrationDataCount()
MOCK_R(0);
555 virtual uint16_t getCalibrationData(uint8_t index)
MOCK_R(0);
564 virtual
void setCalibrationData(uint8_t index, uint16_t data,
bool save)
MOCK;
571 virtual
int getAutoCalibrationParameter()
MOCK_R(-1);
579 virtual
void setAutoCalibrationParameter(
int value,
bool save)
MOCK;
587 SINGLETON_INVOKER(
int, getBatteryLevelAutoCalibrated(
int reading), getBatteryLevelAutoCalibrated(reading))
589 SINGLETON_INVOKER(uint16_t, getCalibrationData(uint8_t index), getCalibrationData(index))
591 setCalibrationData(uint8_t index, uint16_t data,
bool save = true),
592 setCalibrationData(index, data, save))
593 SINGLETON_INVOKER(
int, getAutoCalibrationParameter(), getAutoCalibrationParameter())
595 setAutoCalibrationParameter(
int value,
bool save = true),
596 setAutoCalibrationParameter(value, save))
619 virtual void getCustomHardwareID(
621 uint16_t &customPID)
MOCK;
634 virtual void setCustomHardwareID(
642 getCustomHardwareID(uint16_t &customVID, uint16_t &customPID),
643 getCustomHardwareID(customVID, customPID))
645 setCustomHardwareID(uint16_t customVID, uint16_t customPID,
bool save =
true),
646 setCustomHardwareID(customVID, customPID, save))
658class SERVICE(UIService)
661 virtual uint8_t getMaxFPS()
MOCK_R(0);
677class SERVICE(FirmwareService)
679 friend void firmwareSetIsRunningState(
bool state);
682 virtual bool isRunning()
MOCK_R(_is_running);
690 inline static bool _is_running =
false;
#define VOID_SINGLETON_INVOKER(Decl, Call)
Macro to declare a void static method in a service class.
#define SINGLETON_INVOKER(ReturnType, Decl, Call)
Macro to declare a non-void static method in a service class.
#define SERVICE(ClassName)
Macro to declare an internal service class.
#define MOCK
Macro to mark a mock implementation for void methods.
#define MOCK_R(value)
Macro to mark a mock implementation for non-void methods.
Types and constants used everywhere for firmware implementation.
ClutchWorkingMode
User-selected working mode of the clutch paddles.
PulseWidthMultiplier
User-selected pulse width multiplier.
AltButtonsWorkingMode
User-selected working mode of "ALT" buttons.
DPadWorkingMode
User-selected working mode of directional pads.
#define CLUTCH_DEFAULT_VALUE
Default bite point value.
static void inject(Provider *instance, bool multipleInstances=false)
Inject an instance of the service provider to the service interface.
static const InstanceSet getAllInstances()
Get all instances of the service provider.
static Service * getInstance()
Get a singleton instance of the service provider.
std::vector< Service * > InstanceSet
Type of the set of injected instances.
static void reset()
Remove all injected service providers (for testing)