Jak to prościej zapisać? Wysyłanie danych różnego typu w zależności od wysłanej komendy.

0

Witam.
Napisałem pewną funkcję do komunikacji arduino z moim programem na PC. Wszystko działa tylko jestem ciekaw czy można np pominąć ręcznego dodawania przypadków do instrukcji switch, jak widać wszystkie przypadki wyglądają identycznie i różnią się jedynie wysyłaną zmienną. Jedyna różnica tkwi w typie zmiennych, niektóre to inty,chary czy floaty. Tak więc czy da się to jakoś zapisać za pomocą kilku linijek? To na razie jest tylko część zmiennych a dodawanie i edytowanie tego w obecnej formie zajmuje sporo czasu.

enum AHK_param {_PID_ROL_P,_PID_ROL_I,_PID_ROL_D,_REC_ROL,_REC_PIT,_REC_YAW,_REC_THR
,_PID_DIV,_PID_FS,_PID_DT,_MPU_FS,_MPU_DT,_GXCF,_GYCF,_GZCF
,_PID_ROL_P_VAL,_PID_ROL_I_VAL,_PID_ROL_D_VAL,_PID_ROL_OUT_VAL,_RX,_TX,_FIFO_CNT,_RF,_LF};
void drive(){
  int rx = Serial.available();
  if( rx>=0 ){
    int cmd = Serial.read();
    AHK_param co  = Serial.read();
    switch(cmd){
      case 0:{ //read
        switch(co){
          case _PID_ROL_P: SerialSendParam(co, PID_ROL_P); break;
          case _PID_ROL_I: SerialSendParam(co, PID_ROL_I); break;
          case _PID_ROL_D: SerialSendParam(co, PID_ROL_D); break;
          
          case _REC_ROL: SerialSendParam(co, REC_ROL); break;
          case _REC_PIT: SerialSendParam(co, REC_PIT); break;
          case _REC_YAW: SerialSendParam(co, REC_YAW); break;
          case _REC_THR: SerialSendParam(co, REC_THR); break;

          case _PID_DIV: SerialSendParam(co, PID_DIV); break;
          case _PID_FS: SerialSendParam(co, PID_FS); break;
          case _PID_DT: SerialSendParam(co, PID_DT); break;

          case _MPU_FS: SerialSendParam(co, MPU_FS); break;
          case _MPU_DT: SerialSendParam(co, MPU_DT); break;

          case _GXCF: SerialSendParam(co, gxcf); break;
          case _GYCF: SerialSendParam(co, gycf); break;
          case _GZCF: SerialSendParam(co, gzcf); break;

          case _PID_ROL_P_VAL: SerialSendParam(co, qqqq.P_VAL); break;
          case _PID_ROL_I_VAL: SerialSendParam(co, qqqq.I_VAL); break;
          case _PID_ROL_D_VAL: SerialSendParam(co, qqqq.D_VAL); break;
          case _PID_ROL_OUT_VAL: SerialSendParam(co, qqqq.OUT_VAL); break;
        }
        break;
      }
      case 1:{ //write
        float val = SerialReadFloat();
        switch(co){
          case _REC_ROL: REC_ROL=val;
        }
        break;
      }
    }
  }
//  SerialStreamQuaternion();
  
}

void SerialSendParam(uint8_t q,float val){
  Serial.write(q);
  SerialWriteFloat(val);
}
0

Widzę, że to C++, więc może użyć szablonów?

1 użytkowników online, w tym zalogowanych: 0, gości: 1