00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "Aria.h"
00027 #include "ArExport.h"
00028 #include "ArServerHandlerCameraCollection.h"
00029
00030
00031 #include <ArConfigArg.h>
00032 #include "ArClientArgUtils.h"
00033
00034 AREXPORT const char *ArServerHandlerCameraCollection::GET_COLLECTION_PACKET_NAME =
00035 "getCameraList";
00036 AREXPORT const char *ArServerHandlerCameraCollection::COLLECTION_UPDATED_PACKET_NAME =
00037 "cameraListUpdated";
00038 AREXPORT const char *ArServerHandlerCameraCollection::SET_PARAMS_PACKET_NAME =
00039 "setCameraParams";
00040 AREXPORT const char *ArServerHandlerCameraCollection::PARAMS_UPDATED_PACKET_NAME =
00041 "cameraParamUpdated";
00042
00043 AREXPORT const char *ArServerHandlerCameraCollection::COMMAND_GROUP =
00044 "CameraInfo";
00045
00046
00047 AREXPORT ArServerHandlerCameraCollection::ArServerHandlerCameraCollection
00048 (ArServerBase *server,
00049 ArCameraCollection *cameraCollection) :
00050 myServer(server),
00051 myCameraCollection(cameraCollection),
00052 myGetCameraListCB(NULL),
00053 mySetParamCB(NULL),
00054 myCollectionModifiedCB(NULL)
00055 {
00056 if (myServer != NULL)
00057 {
00058 myGetCameraListCB = new ArFunctor2C<ArServerHandlerCameraCollection,
00059 ArServerClient *,
00060 ArNetPacket *>
00061 (this,
00062 &ArServerHandlerCameraCollection::getCameraList);
00063
00064 myServer->addData(GET_COLLECTION_PACKET_NAME,
00065 "Gets information about the robot's cameras.",
00066 myGetCameraListCB,
00067 "none",
00068 "byte2: numCameras, repeating for numCameras: { string: cameraName, string: cameraType, string: displayName, string: displayType, byte2: numCommands, repeating for numCommands: {string: command, string: cameraCommandName byte4: requestInterval } byte2: numParams, repeating for numParams: {see ArConfigArg format}}",
00069 COMMAND_GROUP, "RETURN_SINGLE");
00070
00071
00072 mySetParamCB = new ArFunctor2C<ArServerHandlerCameraCollection,
00073 ArServerClient *,
00074 ArNetPacket *>
00075 (this,
00076 &ArServerHandlerCameraCollection::setParams);
00077
00078 myServer->addData(SET_PARAMS_PACKET_NAME,
00079 "Sets the specified camera parameters.",
00080 mySetParamCB,
00081 "string: cameraName, repeating for each param: { string: paramName, <param value - see ArConfigArg format> }, empty paramName terminates list",
00082 "string: cameraName, repeating for each modified param: { string: paramName, <param value - see ArConfigArg format> }, empty paramName terminates list",
00083 COMMAND_GROUP, "RETURN_SINGLE");
00084
00085
00086 myServer->addData(COLLECTION_UPDATED_PACKET_NAME,
00087 "Single packet is sent when the camera collection has been modified.",
00088 NULL,
00089 "none",
00090 "none",
00091 COMMAND_GROUP, "RETURN_SINGLE");
00092
00093 myServer->addData(PARAMS_UPDATED_PACKET_NAME,
00094 "Packet is sent when the camera parameters have been modified.",
00095 NULL,
00096 "none",
00097 "string: cameraName, repeating for each modified param: { string: paramName, <param value - see ArConfigArg format> }, empty paramName terminates list",
00098 COMMAND_GROUP, "RETURN_SINGLE");
00099
00100 }
00101
00102 if (myCameraCollection != NULL) {
00103
00104 myCollectionModifiedCB = new ArFunctorC<ArServerHandlerCameraCollection>
00105 (this,
00106 &ArServerHandlerCameraCollection::handleCameraCollectionModified);
00107
00108 myCameraCollection->addModifiedCB(myCollectionModifiedCB);
00109
00110 }
00111
00112 }
00113
00114 AREXPORT ArServerHandlerCameraCollection::~ArServerHandlerCameraCollection()
00115 {
00116 if ((myCameraCollection != NULL) &&
00117 (myCollectionModifiedCB != NULL)) {
00118
00119 myCameraCollection->removeModifiedCB(myCollectionModifiedCB);
00120 delete myCollectionModifiedCB;
00121 myCollectionModifiedCB = NULL;
00122
00123 }
00124
00125
00126
00127 }
00128
00129
00130 AREXPORT void ArServerHandlerCameraCollection::getCameraList(ArServerClient *client,
00131 ArNetPacket *packet)
00132 {
00133 if (client == NULL) {
00134 return;
00135 }
00136
00137 ArNetPacket sendPacket;
00138
00139 if (myCameraCollection == NULL) {
00140 sendPacket.byte2ToBuf(0);
00141 client->sendPacketTcp(&sendPacket);
00142 }
00143
00144
00145
00146
00147 std::list<std::string> cameraNames;
00148 myCameraCollection->getCameraNames(cameraNames);
00149
00150 sendPacket.byte2ToBuf(cameraNames.size());
00151
00152 for (std::list<std::string>::iterator iter = cameraNames.begin();
00153 iter != cameraNames.end();
00154 iter++) {
00155
00156 const char *curName = iter->c_str();
00157
00158 sendPacket.strToBuf(curName);
00159
00160
00161
00162
00163 sendPacket.strToBuf(myCameraCollection->getCameraType(curName));
00164 sendPacket.strToBuf(myCameraCollection->getDisplayName(curName));
00165 sendPacket.strToBuf(myCameraCollection->getDisplayType(curName));
00166
00167
00168
00169 std::list<std::string> commands;
00170 myCameraCollection->getCameraCommands(curName, commands);
00171
00172 sendPacket.byte2ToBuf(commands.size());
00173
00174 for (std::list<std::string>::iterator comIter = commands.begin();
00175 comIter != commands.end();
00176 comIter++) {
00177
00178 const char *curCommand = comIter->c_str();
00179
00180 sendPacket.strToBuf(curCommand);
00181 sendPacket.strToBuf(myCameraCollection->getCommandName(curName, curCommand));
00182 sendPacket.byte4ToBuf(myCameraCollection->getRequestInterval(curName, curCommand));
00183
00184 }
00185
00186
00187
00188 std::list<std::string> params;
00189 myCameraCollection->getParameterNames(curName, params);
00190
00191 sendPacket.byte2ToBuf(params.size());
00192
00193 ArConfigArg arg;
00194 ArClientArg clientArg;
00195
00196 bool isSuccess = true;
00197
00198 for (std::list<std::string>::iterator paramIter = params.begin();
00199 paramIter != params.end();
00200 paramIter++) {
00201
00202 const char *paramName = paramIter->c_str();
00203
00204 isSuccess = myCameraCollection->getParameter(curName,
00205 paramName,
00206 arg);
00207 if (!isSuccess) {
00208 ArLog::log(ArLog::Normal,
00209 "ArServerHandlerCameraCollection::getCameraList() could not find param %s", paramName);
00210 continue;
00211 }
00212
00213
00214 isSuccess = clientArg.createPacket(arg, &sendPacket);
00215
00216 }
00217
00218 }
00219
00220 client->sendPacketTcp(&sendPacket);
00221
00222 }
00223
00224
00225
00226 AREXPORT void ArServerHandlerCameraCollection::setParams(ArServerClient *client,
00227 ArNetPacket *packet)
00228 {
00229 if ((packet == NULL) || (myCameraCollection == NULL)) {
00230 return;
00231 }
00232 char buffer[512];
00233
00234 packet->bufToStr(buffer, sizeof(buffer));
00235 std::string cameraName = buffer;
00236
00237 ArNetPacket paramUpdatedPacket;
00238 paramUpdatedPacket.strToBuf(cameraName.c_str());
00239
00240 ArConfigArg arg;
00241 ArClientArg clientArg;
00242 bool isSuccess = true;
00243 bool isParamUpdated = false;
00244
00245 bool isDone = false;
00246
00247 while (!isDone) {
00248
00249 packet->bufToStr(buffer, sizeof(buffer));
00250 std::string paramName = buffer;
00251
00252 if (paramName.empty()) {
00253 isDone = true;
00254 break;
00255 }
00256
00257 isSuccess = myCameraCollection->getParameter(cameraName.c_str(),
00258 paramName.c_str(),
00259 arg);
00260
00261 if (!isSuccess) {
00262 ArLog::log(ArLog::Verbose,
00263 "ArServerHandlerCameraCollection::setParams() could not find camera %s, param %s",
00264 cameraName.c_str(), paramName.c_str());
00265 continue;
00266 }
00267
00268 isSuccess = clientArg.bufToArgValue(packet, arg);
00269
00270 if (!isSuccess) {
00271 continue;
00272 }
00273
00274 isSuccess = myCameraCollection->setParameter(cameraName.c_str(), arg);
00275
00276 if (!isSuccess) {
00277 continue;
00278 }
00279
00280 paramUpdatedPacket.strToBuf(arg.getName());
00281 clientArg.argValueToBuf(arg, ¶mUpdatedPacket);
00282 isParamUpdated = true;
00283
00284 }
00285
00286
00287
00288
00289
00290 paramUpdatedPacket.strToBuf("");
00291
00292
00293 client->sendPacketTcp(¶mUpdatedPacket);
00294
00295
00296 if (isParamUpdated) {
00297
00298
00299
00300 myServer->broadcastPacketTcp(¶mUpdatedPacket,
00301 PARAMS_UPDATED_PACKET_NAME);
00302 }
00303
00311 }
00312
00313
00314 AREXPORT void ArServerHandlerCameraCollection::handleCameraCollectionModified()
00315 {
00316 if (myServer == NULL) {
00317 return;
00318 }
00319 ArNetPacket emptyPacket;
00320 myServer->broadcastPacketTcp(&emptyPacket, COLLECTION_UPDATED_PACKET_NAME);
00321
00322 }
00323
00324
00325