Program Listing for File Command.h

Return to documentation for file (/tmp/ws/src/sick_safetyscanners_base/include/sick_safetyscanners_base/cola2/Command.h)

// this is for emacs file handling -*- mode: c++; indent-tabs-mode: nil -*-

// -- BEGIN LICENSE BLOCK ----------------------------------------------

// -- END LICENSE BLOCK ------------------------------------------------

//----------------------------------------------------------------------
//----------------------------------------------------------------------

#ifndef SICK_SAFETYSCANNERS_BASE_COLA2_COMMAND_H
#define SICK_SAFETYSCANNERS_BASE_COLA2_COMMAND_H

#include <vector>

#include "sick_safetyscanners_base/datastructure/PacketBuffer.h"

#include "sick_safetyscanners_base/Logging.h"
#include "sick_safetyscanners_base/data_processing/ParseTCPPacket.h"
#include "sick_safetyscanners_base/data_processing/ReadWriteHelper.hpp"

#include <boost/thread/mutex.hpp>

namespace sick {
namespace cola2 {

class Cola2Session;

class Command
{
public:
  Command(sick::cola2::Cola2Session& session, uint16_t command_type, uint16_t command_mode);

  virtual ~Command() {}

  void lockExecutionMutex();

  std::vector<uint8_t> constructTelegram(const std::vector<uint8_t>& telegram) const;

  void processReplyBase(const std::vector<uint8_t>& packet);

  void waitForCompletion();

  uint32_t getSessionID() const;

  void setSessionID(uint32_t session_id);

  bool wasSuccessful() const;

  uint8_t getCommandType() const;

  void setCommandType(const uint8_t& command_type);

  uint8_t getCommandMode() const;

  void setCommandMode(const uint8_t& command_mode);

  uint16_t getRequestID() const;

  void setRequestID(const uint16_t& request_id);

  std::vector<uint8_t> getDataVector() const;

  void setDataVector(const std::vector<uint8_t>& data);

protected:
  sick::cola2::Cola2Session& m_session;

  std::vector<uint8_t> expandTelegram(const std::vector<uint8_t>& telegram,
                                      size_t additional_bytes) const;

private:
  std::shared_ptr<sick::data_processing::ParseTCPPacket> m_tcp_parser_ptr;

  boost::mutex m_execution_mutex;

  bool m_was_successful;

  uint8_t m_command_mode;
  uint8_t m_command_type;

  uint32_t m_session_id;
  uint16_t m_request_id;

  std::vector<uint8_t> m_data_vector;

  virtual bool processReply()                                                              = 0;
  virtual std::vector<uint8_t> addTelegramData(const std::vector<uint8_t>& telegram) const = 0;

  std::vector<uint8_t> addTelegramHeader(const std::vector<uint8_t>& telegram) const;
  std::vector<uint8_t> prepareHeader() const;
  void writeCola2StxToDataPtr(std::vector<uint8_t>::iterator data_ptr) const;
  void writeLengthToDataPtr(std::vector<uint8_t>::iterator data_ptr,
                            const std::vector<uint8_t>& telegram) const;
  void writeCola2HubCntrToDataPtr(std::vector<uint8_t>::iterator data_ptr) const;
  void writeCola2NoCToDataPtr(std::vector<uint8_t>::iterator data_ptr) const;
  void writeSessionIdToDataPtr(std::vector<uint8_t>::iterator data_ptr) const;
  void writeRequestIdToDataPtr(std::vector<uint8_t>::iterator data_ptr) const;
  void writeCommandTypeToDataPtr(std::vector<uint8_t>::iterator data_ptr) const;
  void writeCommandModeToDataPtr(std::vector<uint8_t>::iterator data_ptr) const;
  void writeDataToDataPtr(std::vector<uint8_t>::iterator data_ptr,
                          const std::vector<uint8_t>& telegram) const;
};

} // namespace cola2
} // namespace sick

#endif // SICK_SAFETYSCANNERS_BASE_COLA2_COMMAND_H