Newer
Older
#include "Services/FunctionManagementService.hpp"
Grigoris Pavlakis
committed
/**
* Usage of the include() function:
*
* void foo(String<MAXARGLENGTH> b) {
* std::cout << "SPAAAACE!" << std::endl;
* }
*
* void bar(String<MAXARGLENGTH> b) {
* std::cout << "I HAZ A CUBESAT THAT SNAPS PIX!" << std::endl;
* }
*
* void baz(String<MAXARGLENGTH> b) {
* std::cout << "QWERTYUIOP" << std::endl;
* }
*
* FunctionManagementService::FunctionManagementService() {
* include(String<FUNCNAMELENGTH>("foo"), &foo);
* include(String<FUNCNAMELENGTH>("bar"), &bar);
* include(String<FUNCNAMELENGTH>("baz"), &baz);
* }
*/
/*
* FunctionManagementService::FunctionManagementService() {
* All the functions that should be included in the pointer map at initialization shall be here.
* and included as in the examples above.
*
* }
*/
Grigoris Pavlakis
committed
int FunctionManagementService::call(Message msg){
Grigoris Pavlakis
committed
assert(msg.messageType == 1);
assert(msg.serviceType == 8);
Grigoris Pavlakis
committed
uint8_t funcName[FUNCNAMELENGTH]; // the function's name
Grigoris Pavlakis
committed
uint8_t funcArgs[MAXARGLENGTH]; // arguments for the function
Grigoris Pavlakis
committed
Grigoris Pavlakis
committed
msg.readString(funcName, FUNCNAMELENGTH);
Grigoris Pavlakis
committed
msg.readString(funcArgs, MAXARGLENGTH);
Grigoris Pavlakis
committed
Grigoris Pavlakis
committed
if (msg.dataSize > FUNCNAMELENGTH + MAXARGLENGTH) {
Grigoris Pavlakis
committed
/**
* @todo Send failed start of execution (too long message)
*/
return 4; // arbitrary
Grigoris Pavlakis
committed
}
// locate the appropriate function pointer
Grigoris Pavlakis
committed
String<FUNCNAMELENGTH> name(funcName);
FunctionMap::iterator iter = funcPtrIndex.find(name);
void(*selected)(String<MAXARGLENGTH>);
Grigoris Pavlakis
committed
if (iter != funcPtrIndex.end()) {
Grigoris Pavlakis
committed
selected = *iter->second;
}
Grigoris Pavlakis
committed
* @todo Send failed start of execution (function not found)
Grigoris Pavlakis
committed
return 1; // arbitrary
}
// execute the function if there are no obvious flaws (defined in the standard, pg.158)
selected(funcArgs);
return 0;
}
Grigoris Pavlakis
committed
Grigoris Pavlakis
committed
int FunctionManagementService::include(String<FUNCNAMELENGTH> funcName, void(*ptr)
Grigoris Pavlakis
committed
(String<MAXARGLENGTH>)) {
if (funcPtrIndex.full()) {
/**
* @todo Generate suitable notification (index is full)
*/
return 2; // arbitrary, for testing purposes
}
Grigoris Pavlakis
committed
funcName.append(FUNCNAMELENGTH - funcName.length(), '\0');
Grigoris Pavlakis
committed
funcPtrIndex.insert(std::make_pair(funcName, ptr));
return 0;
}