リモコン移動作業ロボット:ソースコード:SerialSupport.cpp

//SerialSupport.cpp
 //copyright 2022 https://robot-creation-diary.com/

 #include "SerialSupport.h"
 #include <string.h>
 //error 0 :エラーなし
 //error 1 :GetIndexData でデータ範囲を超えている
 //error 2 :AddData 確保済みデータ範囲を超えた
 //error 3 :SetDataPosition 確保済みデータ範囲の外にデータ位置を設定しようとした。
 //error 4 :CheckError 読み込んだデータが小さすぎる。
 //error 5 :CheckError データサイズが読み込んだデータと異なっている。
 //error 6 :CheckError データ開始フラグがおかしい
 //error 7 :CheckError データ終了フラグがおかしい
 //error 8 :__CheckChecksum 読み込んだデータが小さすぎる。//本来呼ばれないはず
 //error 9 :__CheckChecksum チェックサムがあっていない
 
 CSerialSupport::CSerialSupport():
    mData(0),
    mSize(0),
    mDataPosition(0),
    mError(0){
      
 }
 CSerialSupport::~CSerialSupport(){
  if (mData){
    delete [] mData;
  }
 }
      
void CSerialSupport::SetSize(unsigned int dsize){
      
  if (mSize != dsize){
    if (mData){
        delete [] mData;
    }
    mData = new unsigned char[dsize];
    memset(mData, 0, mSize);
  }else{
    memset(mData, 0, mSize);
  }
      
  mSize = dsize;
  mDataPosition = -1;
            
}

//データサイズ変更:データは維持される。
void CSerialSupport::StretchSize(unsigned  int dsize){
  unsigned char *newData;
  if ( mSize < dsize ){
    newData = new unsigned char[dsize];
    memset(newData,0,mSize);
    memcpy(newData,mData,mSize);
    delete [] mData;
    mData = newData;
  }
  mSize = dsize;
  mDataPosition = -1;
}

//指定番号のデータを取得する
unsigned char CSerialSupport::GetIndexData(unsigned  int i){
  if (mDataPosition < i){
    mError = 1;
    return 0;
  }
  mError = 0;
  return mData[i];
}

//データの生データを取得する
unsigned char* CSerialSupport::GetData(){
  return mData;
}

//データ追加場所を初期化する。
void CSerialSupport::ResetDataPosition(){
  mDataPosition = -1; 
}

//データ追加場所を指定する
void CSerialSupport::SetDataPosition(unsigned int pos){
  if ((0 <= pos) && (pos < mSize)){
    mDataPosition=pos;
    mError = 0;
  }else{
    mError = 3;
  }
}
int  CSerialSupport::GetDataPosition(){
  return mDataPosition;
}
//データを追加する。
bool CSerialSupport::AddData(unsigned char d){
  mDataPosition++;
 if (mDataPosition < mSize){
    mData[mDataPosition]  = d;
    mError = 0;
    return true;
  }else{
    mError = 2;
    mDataPosition = mSize - 1;
    return false;
  }
}

///////////////ここから先は特化コード 汎用性が低い
bool CSerialSupport::CheckDataError(){
   //一番目と最後のチェックデータが違うときエラーチェックサムが違うときエラー  
   if (mDataPosition < 4  ){
      mError = 4;
      return false;
   }
   //データサイズが読み込んだデータと異なっている。
   if (mDataPosition != mData[1] - 1){
      mError = 5;
      return false;
   }
   if (START_FLAG    != mData[0] ){
      mError = 6;
      return false;
   }
   if (END_FLAG      != mData[mDataPosition] ){
      mError = 7;
      return false;
   }
   if (__CheckChecksum()){
    mError = 0;
    return true;
   }
   return false;
}
int CSerialSupport::GetLatestError(){
  return mError;
}

bool CSerialSupport::__CheckChecksum(){//チェックサムを確認
  int i;
  unsigned char cdata;
  cdata = 0;
  if(mDataPosition < 4){
    //サイズがおかしい。
    mError = 8;
    return false;
  }
  for  (i = 2 ; i <= mDataPosition - 2 ; i++){
    cdata = cdata ^ mData[i];
  }
  if (mData[mDataPosition-1] == cdata){
    mError = 0;
    return true;
  }
  //チェックサムが合わなかった
  mError = 9;

  return false;
}
bool CSerialSupport::CheckPositionisChecksum(int position){
  if(2 < position){
    if (mData[1] - 2 == position) {
        return true;
    }
  }
  return false;
}
bool CSerialSupport::CheckPositionisEnd(int position){
  if(2 < position){
    if (mData[1] - 1  == position) {
        return true;
    }
  }
  return false;
}

int CSerialSupport::__GetDataDataSize(){
  return mData[1];
}