@@ -71,7 +71,6 @@ bool NID::decode(const uint8_t* data)
7171 // handle digital "squelch" NAC
7272 if ((m_nac == NAC_DIGITAL_SQ) || (m_nac == NAC_REUSE_RX_NAC)) {
7373 uint32_t nac = ((nid[0U ] << 4 ) + (nid[1U ] >> 4 )) & 0xFFFU ;
74- cleanupArrays ();
7574 createRxTxNID (nac); // bryanb: I hate this and it'll be slow
7675 }
7776
@@ -144,7 +143,6 @@ void NID::encode(uint8_t* data, defines::DUID::E duid)
144143 else {
145144 // handle digital "squelch" NAC
146145 if (m_nac == NAC_DIGITAL_SQ) {
147- cleanupArrays ();
148146 createRxTxNID (DEFAULT_NAC);
149147 }
150148
@@ -202,49 +200,63 @@ void NID::createRxTxNID(uint32_t nac)
202200{
203201 edac::BCH bch;
204202
205- m_rxTx[DUID::HDU] = new uint8_t [P25_NID_LENGTH_BYTES];
203+ if (m_rxTx[DUID::HDU] == nullptr )
204+ m_rxTx[DUID::HDU] = new uint8_t [P25_NID_LENGTH_BYTES];
205+ ::memset (m_rxTx[DUID::HDU], 0 , P25_NID_LENGTH_BYTES);
206206 m_rxTx[DUID::HDU][0U ] = (nac >> 4 ) & 0xFFU ;
207207 m_rxTx[DUID::HDU][1U ] = (nac << 4 ) & 0xF0U ;
208208 m_rxTx[DUID::HDU][1U ] |= DUID::HDU;
209209 bch.encode (m_rxTx[DUID::HDU]);
210210 m_rxTx[DUID::HDU][7U ] &= 0xFEU ; // Clear the parity bit
211211
212- m_rxTx[DUID::TDU] = new uint8_t [P25_NID_LENGTH_BYTES];
212+ if (m_rxTx[DUID::TDU] == nullptr )
213+ m_rxTx[DUID::TDU] = new uint8_t [P25_NID_LENGTH_BYTES];
214+ ::memset (m_rxTx[DUID::TDU], 0 , P25_NID_LENGTH_BYTES);
213215 m_rxTx[DUID::TDU][0U ] = (nac >> 4 ) & 0xFFU ;
214216 m_rxTx[DUID::TDU][1U ] = (nac << 4 ) & 0xF0U ;
215217 m_rxTx[DUID::TDU][1U ] |= DUID::TDU;
216218 bch.encode (m_rxTx[DUID::TDU]);
217219 m_rxTx[DUID::TDU][7U ] &= 0xFEU ; // Clear the parity bit
218220
219- m_rxTx[DUID::LDU1] = new uint8_t [P25_NID_LENGTH_BYTES];
221+ if (m_rxTx[DUID::LDU1] == nullptr )
222+ m_rxTx[DUID::LDU1] = new uint8_t [P25_NID_LENGTH_BYTES];
223+ ::memset (m_rxTx[DUID::LDU1], 0 , P25_NID_LENGTH_BYTES);
220224 m_rxTx[DUID::LDU1][0U ] = (nac >> 4 ) & 0xFFU ;
221225 m_rxTx[DUID::LDU1][1U ] = (nac << 4 ) & 0xF0U ;
222226 m_rxTx[DUID::LDU1][1U ] |= DUID::LDU1;
223227 bch.encode (m_rxTx[DUID::LDU1]);
224228 m_rxTx[DUID::LDU1][7U ] |= 0x01U ; // Set the parity bit
225229
226- m_rxTx[DUID::PDU] = new uint8_t [P25_NID_LENGTH_BYTES];
230+ if (m_rxTx[DUID::PDU] == nullptr )
231+ m_rxTx[DUID::PDU] = new uint8_t [P25_NID_LENGTH_BYTES];
232+ ::memset (m_rxTx[DUID::PDU], 0 , P25_NID_LENGTH_BYTES);
227233 m_rxTx[DUID::PDU][0U ] = (nac >> 4 ) & 0xFFU ;
228234 m_rxTx[DUID::PDU][1U ] = (nac << 4 ) & 0xF0U ;
229235 m_rxTx[DUID::PDU][1U ] |= DUID::PDU;
230236 bch.encode (m_rxTx[DUID::PDU]);
231237 m_rxTx[DUID::PDU][7U ] &= 0xFEU ; // Clear the parity bit
232238
233- m_rxTx[DUID::TSDU] = new uint8_t [P25_NID_LENGTH_BYTES];
239+ if (m_rxTx[DUID::TSDU] == nullptr )
240+ m_rxTx[DUID::TSDU] = new uint8_t [P25_NID_LENGTH_BYTES];
241+ ::memset (m_rxTx[DUID::TSDU], 0 , P25_NID_LENGTH_BYTES);
234242 m_rxTx[DUID::TSDU][0U ] = (nac >> 4 ) & 0xFFU ;
235243 m_rxTx[DUID::TSDU][1U ] = (nac << 4 ) & 0xF0U ;
236244 m_rxTx[DUID::TSDU][1U ] |= DUID::TSDU;
237245 bch.encode (m_rxTx[DUID::TSDU]);
238246 m_rxTx[DUID::TSDU][7U ] &= 0xFEU ; // Clear the parity bit
239247
240- m_rxTx[DUID::LDU2] = new uint8_t [P25_NID_LENGTH_BYTES];
248+ if (m_rxTx[DUID::LDU2] == nullptr )
249+ m_rxTx[DUID::LDU2] = new uint8_t [P25_NID_LENGTH_BYTES];
250+ ::memset (m_rxTx[DUID::LDU2], 0 , P25_NID_LENGTH_BYTES);
241251 m_rxTx[DUID::LDU2][0U ] = (nac >> 4 ) & 0xFFU ;
242252 m_rxTx[DUID::LDU2][1U ] = (nac << 4 ) & 0xF0U ;
243253 m_rxTx[DUID::LDU2][1U ] |= DUID::LDU2;
244254 bch.encode (m_rxTx[DUID::LDU2]);
245255 m_rxTx[DUID::LDU2][7U ] |= 0x01U ; // Set the parity bit
246256
247- m_rxTx[DUID::TDULC] = new uint8_t [P25_NID_LENGTH_BYTES];
257+ if (m_rxTx[DUID::TDULC] == nullptr )
258+ m_rxTx[DUID::TDULC] = new uint8_t [P25_NID_LENGTH_BYTES];
259+ ::memset (m_rxTx[DUID::TDULC], 0 , P25_NID_LENGTH_BYTES);
248260 m_rxTx[DUID::TDULC][0U ] = (nac >> 4 ) & 0xFFU ;
249261 m_rxTx[DUID::TDULC][1U ] = (nac << 4 ) & 0xF0U ;
250262 m_rxTx[DUID::TDULC][1U ] |= DUID::TDULC;
@@ -258,49 +270,63 @@ void NID::createTxNID(uint32_t nac)
258270{
259271 edac::BCH bch;
260272
261- m_tx[DUID::HDU] = new uint8_t [P25_NID_LENGTH_BYTES];
273+ if (m_tx[DUID::HDU] == nullptr )
274+ m_tx[DUID::HDU] = new uint8_t [P25_NID_LENGTH_BYTES];
275+ ::memset (m_tx[DUID::HDU], 0 , P25_NID_LENGTH_BYTES);
262276 m_tx[DUID::HDU][0U ] = (nac >> 4 ) & 0xFFU ;
263277 m_tx[DUID::HDU][1U ] = (nac << 4 ) & 0xF0U ;
264278 m_tx[DUID::HDU][1U ] |= DUID::HDU;
265279 bch.encode (m_tx[DUID::HDU]);
266280 m_tx[DUID::HDU][7U ] &= 0xFEU ; // Clear the parity bit
267281
268- m_tx[DUID::TDU] = new uint8_t [P25_NID_LENGTH_BYTES];
282+ if (m_tx[DUID::TDU] == nullptr )
283+ m_tx[DUID::TDU] = new uint8_t [P25_NID_LENGTH_BYTES];
284+ ::memset (m_tx[DUID::TDU], 0 , P25_NID_LENGTH_BYTES);
269285 m_tx[DUID::TDU][0U ] = (nac >> 4 ) & 0xFFU ;
270286 m_tx[DUID::TDU][1U ] = (nac << 4 ) & 0xF0U ;
271287 m_tx[DUID::TDU][1U ] |= DUID::TDU;
272288 bch.encode (m_tx[DUID::TDU]);
273289 m_tx[DUID::TDU][7U ] &= 0xFEU ; // Clear the parity bit
274290
275- m_tx[DUID::LDU1] = new uint8_t [P25_NID_LENGTH_BYTES];
291+ if (m_tx[DUID::LDU1] == nullptr )
292+ m_tx[DUID::LDU1] = new uint8_t [P25_NID_LENGTH_BYTES];
293+ ::memset (m_tx[DUID::LDU1], 0 , P25_NID_LENGTH_BYTES);
276294 m_tx[DUID::LDU1][0U ] = (nac >> 4 ) & 0xFFU ;
277295 m_tx[DUID::LDU1][1U ] = (nac << 4 ) & 0xF0U ;
278296 m_tx[DUID::LDU1][1U ] |= DUID::LDU1;
279297 bch.encode (m_tx[DUID::LDU1]);
280298 m_tx[DUID::LDU1][7U ] |= 0x01U ; // Set the parity bit
281299
282- m_tx[DUID::PDU] = new uint8_t [P25_NID_LENGTH_BYTES];
300+ if (m_tx[DUID::PDU] == nullptr )
301+ m_tx[DUID::PDU] = new uint8_t [P25_NID_LENGTH_BYTES];
302+ ::memset (m_tx[DUID::PDU], 0 , P25_NID_LENGTH_BYTES);
283303 m_tx[DUID::PDU][0U ] = (nac >> 4 ) & 0xFFU ;
284304 m_tx[DUID::PDU][1U ] = (nac << 4 ) & 0xF0U ;
285305 m_tx[DUID::PDU][1U ] |= DUID::PDU;
286306 bch.encode (m_tx[DUID::PDU]);
287307 m_tx[DUID::PDU][7U ] &= 0xFEU ; // Clear the parity bit
288308
289- m_tx[DUID::TSDU] = new uint8_t [P25_NID_LENGTH_BYTES];
309+ if (m_tx[DUID::TSDU] == nullptr )
310+ m_tx[DUID::TSDU] = new uint8_t [P25_NID_LENGTH_BYTES];
311+ ::memset (m_tx[DUID::TSDU], 0 , P25_NID_LENGTH_BYTES);
290312 m_tx[DUID::TSDU][0U ] = (nac >> 4 ) & 0xFFU ;
291313 m_tx[DUID::TSDU][1U ] = (nac << 4 ) & 0xF0U ;
292314 m_tx[DUID::TSDU][1U ] |= DUID::TSDU;
293315 bch.encode (m_tx[DUID::TSDU]);
294316 m_tx[DUID::TSDU][7U ] &= 0xFEU ; // Clear the parity bit
295317
296- m_tx[DUID::LDU2] = new uint8_t [P25_NID_LENGTH_BYTES];
318+ if (m_tx[DUID::LDU2] == nullptr )
319+ m_tx[DUID::LDU2] = new uint8_t [P25_NID_LENGTH_BYTES];
320+ ::memset (m_tx[DUID::LDU2], 0 , P25_NID_LENGTH_BYTES);
297321 m_tx[DUID::LDU2][0U ] = (nac >> 4 ) & 0xFFU ;
298322 m_tx[DUID::LDU2][1U ] = (nac << 4 ) & 0xF0U ;
299323 m_tx[DUID::LDU2][1U ] |= DUID::LDU2;
300324 bch.encode (m_tx[DUID::LDU2]);
301325 m_tx[DUID::LDU2][7U ] |= 0x01U ; // Set the parity bit
302326
303- m_tx[DUID::TDULC] = new uint8_t [P25_NID_LENGTH_BYTES];
327+ if (m_tx[DUID::TDULC] == nullptr )
328+ m_tx[DUID::TDULC] = new uint8_t [P25_NID_LENGTH_BYTES];
329+ ::memset (m_tx[DUID::TDULC], 0 , P25_NID_LENGTH_BYTES);
304330 m_tx[DUID::TDULC][0U ] = (nac >> 4 ) & 0xFFU ;
305331 m_tx[DUID::TDULC][1U ] = (nac << 4 ) & 0xF0U ;
306332 m_tx[DUID::TDULC][1U ] |= DUID::TDULC;
0 commit comments