diff --git a/include/AmptekSimulatorConnectionHandler.h b/include/AmptekSimulatorConnectionHandler.h index 411445b3dce00dc8ad70c9ad79e72f8ca0878487..5509b870dd0c70be1f0347a45c9e457e597d5490 100644 --- a/include/AmptekSimulatorConnectionHandler.h +++ b/include/AmptekSimulatorConnectionHandler.h @@ -24,7 +24,9 @@ private: void disable(); void clear(); int speclen = 1024; + int buffer_depth = 64; unsigned int* spectrum; + byte* spectrum_buffer; uint32_t total_counts; double acc_time = 0; diff --git a/src/AmptekSimulatorConnectionHandler.cpp b/src/AmptekSimulatorConnectionHandler.cpp index fec5a0c78d5730bdd79355c70cf2ba0869838b04..ca4d95f015770ff52e67565c5f522c23b263c055 100644 --- a/src/AmptekSimulatorConnectionHandler.cpp +++ b/src/AmptekSimulatorConnectionHandler.cpp @@ -69,13 +69,22 @@ Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){ p.setPid2( DP5_P2_SPECTRUM_RESPONSE_SPECTRUM8192_STATUS ); break; } - word16 len = 3*speclen + STATUS_SIZE; - byte arr[len]; - createSpectrumData(arr); - createStatusData(arr + 3*speclen); p.resize( MIN_PACKET_LEN + len ); - p.setData(arr, len); + if (pid2== DP5_P2_SPECTRUM_REQUEST_SPECTRUM_STATUS){ + byte arr[len]; + createSpectrumData(arr); + createStatusData(arr + 3*speclen); + p.setData(arr, len); + }else{ + size_t buffer_idx = (request.at(DATA) << 8) + request.at(DATA); + if (buffer_idx >=buffer_depth){ + return Packet(DP5_P1_ACK, DP5_P2_ACK_BADPARAM_ERR, nullptr, 0); + } + + byte* bufferslot = spectrum_buffer + ( (3*speclen + STATUS_SIZE)*buffer_idx ); + p.setData(bufferslot, len); + } } else if (pid1 == Packet::DP5_PKT_REQUEST_STATUS.at(PID1) && pid2 == Packet::DP5_PKT_REQUEST_STATUS.at(PID2)) @@ -134,6 +143,22 @@ Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){ readConfig(configs); return Packet(DP5_P1_ACK, DP5_P2_ACK_OK, nullptr, 0); } + + else if(pid1 == DP5_P1_SPECTRUM_REQUEST + && pid2 == DP5_P2_SPECTRUM_REQUEST_BUFFER_CLEAR) + { + size_t buffer_idx = (request.at(DATA) << 8) + request.at(DATA); + if (buffer_idx >=buffer_depth){ + return Packet(DP5_P1_ACK, DP5_P2_ACK_BADPARAM_ERR, nullptr, 0); + } + + byte* bufferslot_spectrum = spectrum_buffer + ( (3*speclen + STATUS_SIZE)*buffer_idx ); + byte* bufferslot_status = bufferslot_spectrum + 3*speclen; + createSpectrumData(bufferslot_spectrum); + createStatusData(bufferslot_status); + clear(); + + } else{ return Packet(DP5_P1_ACK, DP5_P2_ACK_OK, nullptr, 0); } @@ -144,6 +169,7 @@ Packet AmptekSimulatorConnectionHandler::sendAndReceive( const Packet& request){ AmptekSimulatorConnectionHandler::AmptekSimulatorConnectionHandler(){ spectrum = new unsigned int[speclen]; + spectrum_buffer = new byte[(3*speclen + STATUS_SIZE)*buffer_depth]; start_time = std::chrono::system_clock::now(); clear(); initConfigs();