$search
00001 /* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright (c) 2011, Southwest Research Institute 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions are met: 00009 * 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in the 00014 * documentation and/or other materials provided with the distribution. 00015 * * Neither the name of the Southwest Research Institute, nor the names 00016 * of its contributors may be used to endorse or promote products derived 00017 * from this software without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00023 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00024 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00025 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00026 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00027 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00029 * POSSIBILITY OF SUCH DAMAGE. 00030 */ 00031 00032 #ifdef ROS 00033 #include "simple_message/simple_message.h" 00034 #include "simple_message/log_wrapper.h" 00035 #endif 00036 00037 #ifdef MOTOPLUS 00038 #include "motoPlus.h" 00039 #include "simple_message.h" 00040 #include "log_wrapper.h" 00041 #endif 00042 00043 00044 00045 using namespace industrial::byte_array; 00046 00047 namespace industrial 00048 { 00049 00050 namespace simple_message 00051 { 00052 00053 SimpleMessage::SimpleMessage(void) 00054 { 00055 } 00056 00057 SimpleMessage::~SimpleMessage(void) 00058 { 00059 } 00060 00061 00062 00063 bool SimpleMessage::init(int msgType, int commType, int replyCode) 00064 { 00065 ByteArray data; 00066 data.init(); 00067 return this->init(msgType, commType, replyCode, data); 00068 } 00069 00070 bool SimpleMessage::init(int msgType, int commType, int replyCode, ByteArray & data ) 00071 { 00072 LOG_COMM("SimpleMessage::init(type: %d, comm: %d, reply: %d, data[%d]...)", 00073 msgType, commType, replyCode, data.getBufferSize()); 00074 this->setMessageType(msgType); 00075 this->setCommType(commType); 00076 this->setReplyCode(replyCode); 00077 this->data_.copyFrom(data); 00078 00079 return this->validateMessage(); 00080 } 00081 00082 bool SimpleMessage::init(ByteArray & msg) 00083 { 00084 int dataSize = 0; 00085 bool rtn = false; 00086 00087 if (msg.getBufferSize() >= this->getHeaderSize()) 00088 { 00089 // Check to see if the message is larger than the standard header 00090 // If so, copy out the data portion. 00091 if (msg.getBufferSize() > this->getHeaderSize()) 00092 { 00093 dataSize = msg.getBufferSize() - this->getHeaderSize(); 00094 LOG_COMM("Unloading data portion of message: %d bytes", dataSize); 00095 msg.unload(this->data_, dataSize); 00096 } 00097 LOG_COMM("Unloading header data"); 00098 msg.unload(this->reply_code_); 00099 msg.unload(this->comm_type_); 00100 msg.unload(this->message_type_); 00101 LOG_COMM("SimpleMessage::init(type: %d, comm: %d, reply: %d, data[%d]...)", 00102 this->message_type_, this->comm_type_, this->reply_code_, this->data_.getBufferSize()); 00103 rtn = this->validateMessage(); 00104 } 00105 else 00106 { 00107 LOG_ERROR("Failed to init message, buffer size too small: %u", msg.getBufferSize()); 00108 rtn = false; 00109 } 00110 return rtn; 00111 } 00112 00113 void SimpleMessage::toByteArray(ByteArray & msg) 00114 { 00115 msg.init(); 00116 00117 msg.load(this->getMessageType()); 00118 msg.load(this->getCommType()); 00119 msg.load(this->getReplyCode()); 00120 if (this->data_.getBufferSize() > 0 ) 00121 { 00122 msg.load(this->getData().getRawDataPtr(), this->data_.getBufferSize()); 00123 } 00124 00125 } 00126 00127 00128 void SimpleMessage::setData( ByteArray & data) 00129 { 00130 this->data_.copyFrom(data); 00131 } 00132 00133 00134 bool SimpleMessage::validateMessage() 00135 { 00136 00137 if ( StandardMsgTypes::INVALID == this->getMessageType()) 00138 { 00139 LOG_WARN("Invalid message type: %u", this->getMessageType()); 00140 return false; 00141 } 00142 00143 if ( CommTypes::INVALID == this->getCommType()) 00144 { 00145 LOG_WARN("Invalid comms. type: %u", this->getCommType()); 00146 return false; 00147 } 00148 00149 if ( 00150 (CommTypes::SERVICE_REPLY == this->getCommType() && 00151 ReplyTypes::INVALID == this->getReplyCode()) || 00152 ((CommTypes::SERVICE_REPLY != this->getCommType() && 00153 ReplyTypes::INVALID != this->getReplyCode())) 00154 ) 00155 { 00156 LOG_WARN("Invalid reply. Comm type: %u, Reply type: %u", 00157 this->getCommType(), this->getReplyCode()); 00158 return false; 00159 } 00160 00161 return true; 00162 } 00163 00164 00165 00166 00167 } // namespace simple_message 00168 } // namespace industrial