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
00027
00028
00029
00030
00031 #ifdef ROS
00032 #include "simple_message/byte_array.h"
00033 #include "simple_message/simple_serialize.h"
00034 #include "simple_message/log_wrapper.h"
00035 #endif
00036
00037 #ifdef MOTOPLUS
00038 #include "motoPlus.h"
00039 #include "byte_array.h"
00040 #include "simple_serialize.h"
00041 #include "log_wrapper.h"
00042 #endif
00043
00044 #include "string.h"
00045
00046 namespace industrial
00047 {
00048 namespace byte_array
00049 {
00050
00051 using namespace industrial::simple_serialize;
00052 using namespace industrial::shared_types;
00053 using namespace industrial::byte_array;
00054
00055 ByteArray::ByteArray(void)
00056 {
00057 this->init();
00058 }
00059
00060 ByteArray::~ByteArray(void)
00061 {
00062 }
00063
00064 void ByteArray::init()
00065 {
00066 memset(&(buffer_[0]), 0, this->MAX_SIZE);
00067 this->setBufferSize(0);
00068 }
00069
00070 bool ByteArray::init(const char* buffer, const shared_int byte_size)
00071 {
00072 bool rtn;
00073
00074 if (this->MAX_SIZE >= byte_size)
00075 {
00076 LOG_COMM("Initializing buffer to size: %d", byte_size);
00077 this->load((void*)buffer, byte_size);
00078 rtn = true;
00079 }
00080 else
00081 {
00082 LOG_ERROR("Failed to initialize byte array, buffer size: %u greater than max: %u",
00083 byte_size, this->getMaxBufferSize());
00084 rtn = false;
00085 }
00086 return rtn;
00087 }
00088
00089 void ByteArray::copyFrom(ByteArray & buffer)
00090 {
00091 if (buffer.getBufferSize() != 0)
00092 {
00093 this->setBufferSize(buffer.getBufferSize());
00094 memcpy(this->getRawDataPtr(), buffer.getRawDataPtr(), this->buffer_size_);
00095 }
00096 else
00097 {
00098 LOG_WARN("Byte array copy not performed, buffer to copy is empty");
00099 }
00100 }
00101
00102 char* ByteArray::getRawDataPtr()
00103 {
00104 return &this->buffer_[0];
00105 }
00106
00107
00108
00109
00110
00111
00112
00113 bool ByteArray::load(shared_bool value)
00114 {
00115 return this->load(&value, sizeof(shared_bool));
00116 }
00117
00118 bool ByteArray::load(shared_real value)
00119 {
00120 return this->load(&value, sizeof(shared_real));
00121 }
00122
00123 bool ByteArray::load(shared_int value)
00124 {
00125 return this->load(&value, sizeof(shared_int));
00126 }
00127
00128 bool ByteArray::load(simple_serialize::SimpleSerialize &value)
00129 {
00130 LOG_COMM("Executing byte array load through simple serialize");
00131 return value.load(this);
00132 }
00133
00134 bool ByteArray::load(ByteArray &value)
00135 {
00136 LOG_COMM("Executing byte array load through byte array");
00137 return this->load(value.getRawDataPtr(), value.getBufferSize());
00138 }
00139
00140 bool ByteArray::load(void* value, const shared_int byte_size)
00141 {
00142
00143 bool rtn;
00144
00145 char* loadPtr;
00146
00147 LOG_COMM("Executing byte array load through void*, size: %d", byte_size);
00148
00149 if (NULL == value)
00150 {
00151 LOG_ERROR("NULL point passed into load method");
00152 return false;
00153 }
00154
00155 loadPtr = this->getLoadPtr();
00156
00157 if (this->extendBufferSize(byte_size))
00158 {
00159 memcpy(loadPtr, value, byte_size);
00160 rtn = true;
00161 }
00162 else
00163 {
00164 LOG_ERROR("Failed to load byte array");
00165 rtn = false;
00166 }
00167
00168 return rtn;
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 bool ByteArray::unload(shared_bool & value)
00180 {
00181 return this->unload(&value, sizeof(shared_bool));
00182 }
00183
00184 bool ByteArray::unload(shared_real &value)
00185 {
00186 return this->unload(&value, sizeof(shared_real));
00187 }
00188
00189 bool ByteArray::unload(shared_int &value)
00190 {
00191 return this->unload(&value, sizeof(shared_int));
00192 }
00193
00194 bool ByteArray::unload(simple_serialize::SimpleSerialize &value)
00195 {
00196 LOG_COMM("Executing byte array unload through simple serialize");
00197 return value.unload(this);
00198 }
00199
00200 bool ByteArray::unload(ByteArray &value, const shared_int byte_size)
00201 {
00202 LOG_COMM("Executing byte array unload through byte array");
00203 char* unloadPtr = this->getUnloadPtr(byte_size);
00204 bool rtn;
00205
00206 if (NULL != unloadPtr)
00207 {
00208 if (this->shortenBufferSize(byte_size))
00209 {
00210
00211 rtn = value.load(unloadPtr, byte_size);
00212 rtn = true;
00213 }
00214 else
00215 {
00216 LOG_ERROR("Failed to shorten array");
00217 rtn = false;
00218 }
00219 }
00220 else
00221 {
00222 LOG_ERROR("Unload pointer returned NULL");
00223 rtn = false;
00224 }
00225
00226 return rtn;
00227 }
00228
00229 bool ByteArray::unload(void* value, shared_int byteSize)
00230 {
00231 bool rtn;
00232 char* unloadPtr;
00233
00234 LOG_COMM("Executing byte array unload through void*, size: %d", byteSize);
00235
00236 if (NULL == value)
00237 {
00238 LOG_ERROR("NULL point passed into unload method");
00239 return false;
00240 }
00241
00242 unloadPtr = this->getUnloadPtr(byteSize);
00243
00244 if (NULL != unloadPtr)
00245 {
00246
00247 if (this->shortenBufferSize(byteSize))
00248 {
00249 memcpy(value, unloadPtr, byteSize);
00250 rtn = true;
00251 }
00252 else
00253 {
00254 LOG_ERROR("Failed to shorten array");
00255 rtn = false;
00256 }
00257 }
00258 else
00259 {
00260 LOG_ERROR("Unload pointer returned NULL");
00261 rtn = false;
00262 }
00263
00264 return rtn;
00265 }
00266
00267 bool ByteArray::unloadFront(void* value, const industrial::shared_types::shared_int byteSize)
00268 {
00269 bool rtn;
00270 char* unloadPtr = NULL;
00271 char* nextPtr = NULL;
00272 shared_int sizeRemain;
00273
00274
00275 if (NULL == value)
00276 {
00277 LOG_ERROR("NULL point passed into unload method");
00278 return false;
00279 }
00280
00281 unloadPtr = &this->buffer_[0];
00282
00283 if (NULL != unloadPtr)
00284 {
00285 nextPtr = unloadPtr + byteSize;
00286 sizeRemain = this->getBufferSize() - byteSize;
00287
00288 LOG_DEBUG("Unloading: %d bytes, %d bytes remain", byteSize, sizeRemain);
00289 if (this->shortenBufferSize(byteSize))
00290 {
00291 LOG_COMM("Preparing to copy value");
00292 memcpy(value, unloadPtr, byteSize);
00293 LOG_COMM("Value is unloaded, performing move");
00294 memmove(unloadPtr, nextPtr, sizeRemain);
00295 LOG_COMM("Move operation completed");
00296 rtn = true;
00297 }
00298 else
00299 {
00300 LOG_ERROR("Failed to shorten array");
00301 rtn = false;
00302 }
00303 }
00304 else
00305 {
00306 LOG_ERROR("Unload pointer returned NULL");
00307 rtn = false;
00308 }
00309
00310 return rtn;
00311 }
00312
00313 unsigned int ByteArray::getBufferSize()
00314 {
00315 return this->buffer_size_;
00316 }
00317
00318 unsigned int ByteArray::getMaxBufferSize()
00319 {
00320 return this->MAX_SIZE;
00321 }
00322
00323 bool ByteArray::setBufferSize(shared_int size)
00324 {
00325 bool rtn;
00326
00327 if (this->MAX_SIZE >= size)
00328 {
00329 this->buffer_size_ = size;
00330 rtn = true;
00331 }
00332 else
00333 {
00334 LOG_ERROR("Set buffer size: %u, larger than MAX:, %u", size, this->MAX_SIZE);
00335 rtn = false;
00336 }
00337
00338 return rtn;
00339
00340 }
00341
00342 bool ByteArray::extendBufferSize(shared_int size)
00343 {
00344 unsigned int newSize;
00345
00346 newSize = this->getBufferSize() + size;
00347 return this->setBufferSize(newSize);
00348
00349 }
00350
00351 bool ByteArray::shortenBufferSize(shared_int size)
00352 {
00353 unsigned int newSize;
00354 bool rtn;
00355
00356
00357
00358
00359
00360 if (size <= (shared_int)this->getBufferSize())
00361 {
00362 newSize = this->getBufferSize() - size;
00363 rtn = this->setBufferSize(newSize);
00364 }
00365 else
00366 {
00367 LOG_ERROR("Failed to shorten buffer by %u bytes, buffer too small, %u bytes", size, this->getBufferSize());
00368 rtn = false;
00369 }
00370
00371 return rtn;
00372
00373 }
00374
00375 char* ByteArray::getLoadPtr()
00376 {
00377
00378 return &this->buffer_[this->buffer_size_];
00379 }
00380
00381 char* ByteArray::getUnloadPtr(shared_int byteSize)
00382 {
00383 char* rtn;
00384
00385 if (byteSize <= (shared_int)this->getBufferSize())
00386 {
00387 rtn = this->getLoadPtr() - byteSize;
00388 }
00389 else
00390 {
00391 LOG_ERROR("Get unload pointer failed, buffer size: %d, smaller than byte size: %d",
00392 this->getBufferSize(), byteSize);
00393 rtn = NULL;
00394 }
00395
00396 return rtn;
00397 }
00398
00399 }
00400 }