diff --git a/src/dsd_main.c b/src/dsd_main.c index b80c6f0..1e8502b 100644 --- a/src/dsd_main.c +++ b/src/dsd_main.c @@ -546,7 +546,7 @@ memset(state->m17_meta, 0, sizeof(state->m17_meta)); //misc str storage - sprintf (state->str50a, "%s", ""); + // sprintf (state->str50a, "%s", ""); // memset (state->str50b, 0, 50*sizeof(char)); // memset (state->str50c, 0, 50*sizeof(char)); // memset (state->m17sms, 0, 800*sizeof(char)); @@ -1288,7 +1288,7 @@ state->m17_str_dt = 9; //misc str storage - sprintf (state->str50a, "%s", ""); + // sprintf (state->str50a, "%s", ""); memset (state->str50b, 0, 50*sizeof(char)); memset (state->str50c, 0, 50*sizeof(char)); memset (state->m17sms, 0, 800*sizeof(char)); diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index afeaa21..0a0e63b 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -28,25 +28,15 @@ uint32_t temp_freq = -1; //struct for checking existence of directory to write to struct stat st_wav = {0}; -static char alias_ch[10][50]; int reset = 0; uint8_t eh_slot = 0; //testing only, have a toggle slot for history uint8_t eh_off = 0; //testing only, index offset for scrolling history -int tg; -int tgR; -int tgn; -int rd; -int rdR; -int rn; -int nc; -int src; int lls = -1; -int dcc = -1; int i = 0; char versionstr[25]; -unsigned long long int call_matrix[33][6]; +unsigned long long int edacs_channel_tree[33][6]; char * FM_bannerN[9] = { " ", @@ -154,6 +144,12 @@ void beeper (dsd_opts * opts, dsd_state * state, int lr, int id, int ad, int len n = 0; //rolling sine wave 'degree' + //double len if not using Pulse Audio, + //anything over UDP or using OSS may + //not clear the buffer at the shorter len + if (opts->audio_out_type != 0) + len *= 2; + //each j increment is 20 ms at 160 samples / 8 kHz for (j = 0; j < len; j++) { @@ -161,7 +157,7 @@ void beeper (dsd_opts * opts, dsd_state * state, int lr, int id, int ad, int len memset (samp_fs, 0.1f, sizeof(samp_fs)); memset (samp_ss, 0, sizeof(samp_ss)); - //generate a tone (ID=45, AD=103, rolling n value) + //generate a tone with supplied tone ID and AD value soft_tonef(samp_f, n, id, ad); //convert float to short if required @@ -404,7 +400,7 @@ char *choices[] = { "Decode YSF", "Toggle Signal Inversion", "Key Entry", - "Reset Call History", + "Reset Event History", "Toggle Payloads to Console", "Manually Set p2 Parameters", //16 "Input & Output Options", @@ -462,10 +458,6 @@ void print_menuc(WINDOW *menu_win, int highlight) void ncursesOpen (dsd_opts * opts, dsd_state * state) { - //terminate all values - for (int i = 0; i < 10; i++) - sprintf (alias_ch[i], "%s", ""); - UNUSED(opts); UNUSED(state); // state->menuopen = 1; //flag the menu is open, stop processing getFrameSync @@ -535,7 +527,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) state->payload_keyid = 0; state->payload_keyidR = 0; - //zero out to fix call history 'scrolling' bug when changing decoding types + //zero out state->nxdn_last_tg = 0; state->nxdn_last_ran = -1; //0 state->nxdn_last_rid = 0; //0 @@ -1803,35 +1795,11 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state) } } - if (choice == 15) //reset call history (usually if janky output when switching modes) + if (choice == 15) //reset event history { - for (short int k = 0; k < 10; k++) - { - call_matrix[k][0] = 0; - call_matrix[k][1] = 0; - call_matrix[k][2] = 0; - call_matrix[k][3] = 0; - call_matrix[k][4] = 0; - call_matrix[k][5] = 0; - sprintf (alias_ch[k], "%s", ""); - } - src = 0; - rn = 0; - tgn = 0; - dcc = -1; - tg = 0; - tgR = 0; - rd = 0; - rdR = 0; - state->lastsrc = 0; - state->lastsrcR = 0; - state->lasttg = 0; - state->lasttgR = 0; - state->nxdn_last_ran = -1; - state->nxdn_last_rid = 0; - state->nxdn_last_tg = 0; - sprintf (state->str50a, "%s", ""); - memset (state->str50b, 0, 50*sizeof(char)); + //initialize event history items (0 to 255) + for (uint8_t i = 0; i < 2; i++) + init_event_history(&state->event_history_s[i], 0, 255); } if (choice == 16) //toggle payload printing @@ -2040,10 +2008,6 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) char * timestr = getTime(); char * datestr = getDate(); - //NOTE: Any times associates with call history are stored - //in the array and need to be set by passing those values into - //getTimeN and getDateN - if (opts->audio_in_type != 1) //can't run getch/menu when using STDIN - { timeout(0); // @@ -2062,274 +2026,32 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) //Variable reset/set section //set lls sync types - if (state->synctype >= 0 && state->synctype < 39) - { + if (state->synctype >= 0) lls = state->synctype; - } - //NXDN -- I really need to fix this better, but this is good enough for today - if (state->nxdn_last_rid != src) - { - src = state->nxdn_last_rid; - } - if (state->nxdn_last_ran != -1 ) - { - rn = state->nxdn_last_ran; - } - if (state->nxdn_last_tg != tgn) - { - tgn = state->nxdn_last_tg; - } - - //DMR CC - if (state->color_code_ok && state->dmr_color_code != 16 && (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 32 || lls == 33) ) - { - dcc = state->dmr_color_code; - } - - //DMR SRC - if ( (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 32) ) - //if ( (lls == 12 || lls == 11 || lls == 32) ) - { - //if (state->dmrburstL == 16 && state->lastsrc > 0) //state->currentslot == 0 && - if (state->lastsrc > 0) - { - rd = state->lastsrc; - } - - //if (state->dmrburstR == 16 && state->lastsrcR > 0) //state->currentslot == 1 && - if (state->lastsrcR > 0) - { - rdR = state->lastsrcR; - } - - } - - //DMR TG - if ( (lls == 12 || lls == 13 || lls == 10 || lls == 11 || lls == 32) ) - //if ( (lls == 12 || lls == 11 || lls == 32) ) - { - //if (state->dmrburstL == 16 && state->lasttg > 0) //state->currentslot == 0 && - if (state->lasttg > 0) - { - tg = state->lasttg; - } - - //if (state->dmrburstR == 16 && state->lasttgR > 0) //state->currentslot == 1 && - if (state->lasttgR > 0) - { - tgR = state->lasttgR; - - } - - } - - //P25 P1 and VCH0 - if (state->p2_cc > 0) - { - nc = state->p2_cc; - } - if ( state->lasttg > 0 && (lls == 0 || lls == 1 || lls == 35 || lls == 36) ) - { - tg = state->lasttg; - } - if ( state->lastsrc > 0 && (lls == 0 || lls == 1 || lls == 35 || lls == 36) ) - { - rd = state->lastsrc; - } - //P25 P2 VCH2 - if (state->lasttgR > 0 && (lls == 35 || lls == 36) ) - { - tgR = state->lasttgR; - } - if (state->lastsrcR > 0 && (lls == 35 || lls == 36) ) - { - rdR = state->lastsrcR; - } - //P25 P2 NAC to dcc for matrix shim - if (state->p2_cc > 0 && (lls == 35 || lls == 36) ) - { - dcc = state->p2_cc; - } - - //Call History Matrix Shuffling - //Edacs - ProVoice + //EDACS Channel Tree if ( (lls == 14 || lls == 15 || lls == 37 || lls == 38) && state->carrier == 1) { if (state->edacs_vc_lcn != -1) { - call_matrix[state->edacs_vc_lcn][0] = lls; - call_matrix[state->edacs_vc_lcn][1] = state->edacs_vc_lcn; - call_matrix[state->edacs_vc_lcn][2] = state->lasttg; + edacs_channel_tree[state->edacs_vc_lcn][0] = lls; + edacs_channel_tree[state->edacs_vc_lcn][1] = state->edacs_vc_lcn; + edacs_channel_tree[state->edacs_vc_lcn][2] = state->lasttg; //EDACS standard does not provide source LIDs on channel update messages; instead, for the sake of display, let's //assume the prior source for a given LCN is still accurate, unless we have an updated one provided (or the call //type has changed under us). // //If you MUST have perfectly-accurate source LIDs, look at the logged CC messages yourself - incorrect source LIDs //may be displayed if we miss an initial call channel assignment. - if (state->ea_mode == 1 || (state->lastsrc != 0 || call_matrix[state->edacs_vc_lcn][4] != state->edacs_vc_call_type)) - call_matrix[state->edacs_vc_lcn][3] = state->lastsrc; - call_matrix[state->edacs_vc_lcn][4] = state->edacs_vc_call_type; - call_matrix[state->edacs_vc_lcn][5] = time(NULL); + if (state->ea_mode == 1 || (state->lastsrc != 0 || edacs_channel_tree[state->edacs_vc_lcn][4] != state->edacs_vc_call_type)) + edacs_channel_tree[state->edacs_vc_lcn][3] = state->lastsrc; + edacs_channel_tree[state->edacs_vc_lcn][4] = state->edacs_vc_call_type; + edacs_channel_tree[state->edacs_vc_lcn][5] = time(NULL); } } - //DSTAR - // if ( (lls == 6 || lls == 7 || lls == 18 || lls == 19) && (time(NULL) - call_matrix[9][5] > 5) && state->carrier == 1) - // { - // for (short int k = 0; k < 9; k++) - // { - // call_matrix[k][0] = call_matrix[k+1][0]; - // call_matrix[k][1] = call_matrix[k+1][1]; - // call_matrix[k][2] = call_matrix[k+1][2]; - // call_matrix[k][3] = call_matrix[k+1][3]; - // call_matrix[k][4] = call_matrix[k+1][4]; - // call_matrix[k][5] = call_matrix[k+1][5]; - // } - - // call_matrix[9][0] = lls; - // call_matrix[9][1] = 1; - // call_matrix[9][2] = 1; - // call_matrix[9][3] = 1; - // call_matrix[9][4] = 1; - // call_matrix[9][5] = time(NULL); - - // } - - //NXDN -- I really need to fix this better, but this is good enough for today - if ( call_matrix[9][2] != src && src != 0 && rn != -1 ) - { - for (short int k = 0; k < 9; k++) - { - call_matrix[k][0] = call_matrix[k+1][0]; - call_matrix[k][1] = call_matrix[k+1][1]; - call_matrix[k][2] = call_matrix[k+1][2]; - call_matrix[k][3] = call_matrix[k+1][3]; - call_matrix[k][4] = call_matrix[k+1][4]; - call_matrix[k][5] = call_matrix[k+1][5]; - sprintf (alias_ch[k], "%s", alias_ch[k+1]); - } - call_matrix[9][0] = lls; - call_matrix[9][1] = tgn; //was rn, switch to tgn so it'll show tg in call history - call_matrix[9][2] = src; - call_matrix[9][3] = 0; - call_matrix[9][4] = rn; //was tgn, switched with rn - call_matrix[9][5] = time(NULL); - sprintf (alias_ch[9], "%s", ""); - sprintf (state->str50a, "%s", ""); - - } - - //TODO: Find better placement for these - if ( strcmp(state->str50a, "") != 0 ) - sprintf (alias_ch[9], "%s", state->str50a); - - //tdma only - // if ( strcmp(state->str50b, "") != 0 ) - // sprintf (alias_ch[5], "%s", state->str50a); - - //DMR MS - if ( call_matrix[9][2] != rd && lls == 32) - { - - for (short int k = 0; k < 10; k++) - { - call_matrix[k][0] = call_matrix[k+1][0]; - call_matrix[k][1] = call_matrix[k+1][1]; - call_matrix[k][2] = call_matrix[k+1][2]; - call_matrix[k][3] = call_matrix[k+1][3]; - call_matrix[k][4] = call_matrix[k+1][4]; - call_matrix[k][5] = call_matrix[k+1][5]; - } - - call_matrix[9][0] = lls; - call_matrix[9][1] = tg; - call_matrix[9][2] = rd; - call_matrix[9][3] = 1; //hard set slot number - call_matrix[9][4] = dcc; - call_matrix[9][5] = time(NULL); - - memset(state->dmr_alias_block_segment[0], 0, sizeof(state->dmr_alias_block_segment[0])); - sprintf (state->dmr_embedded_gps[0], "%s", ""); - - } - - //DMR BS Slot 1 - matrix 0-4 - if ( call_matrix[4][2] != rd && (lls == 11 || lls == 12 || lls == 10 || lls == 13 || lls == 35 || lls == 36) ) - { - - for (short int k = 0; k < 4; k++) - { - call_matrix[k][0] = call_matrix[k+1][0]; - call_matrix[k][1] = call_matrix[k+1][1]; - call_matrix[k][2] = call_matrix[k+1][2]; - call_matrix[k][3] = call_matrix[k+1][3]; - call_matrix[k][4] = call_matrix[k+1][4]; - call_matrix[k][5] = call_matrix[k+1][5]; - } - - call_matrix[4][0] = lls; - call_matrix[4][1] = tg; - call_matrix[4][2] = rd; - call_matrix[4][3] = 1; //hard set slot number - call_matrix[4][4] = dcc; - call_matrix[4][5] = time(NULL); - - memset(state->dmr_alias_block_segment[0], 0, sizeof(state->dmr_alias_block_segment[0])); - sprintf (state->dmr_embedded_gps[0], "%s", ""); - - } - - //DMR BS Slot 2 - matrix 5-9 - if ( call_matrix[9][2] != rdR && (lls == 11 || lls == 12 || lls == 10 || lls == 13 || lls == 35 || lls == 36) ) - { - - for (short int k = 5; k < 9; k++) - { - call_matrix[k][0] = call_matrix[k+1][0]; - call_matrix[k][1] = call_matrix[k+1][1]; - call_matrix[k][2] = call_matrix[k+1][2]; - call_matrix[k][3] = call_matrix[k+1][3]; - call_matrix[k][4] = call_matrix[k+1][4]; - call_matrix[k][5] = call_matrix[k+1][5]; - } - - call_matrix[9][0] = lls; - call_matrix[9][1] = tgR; - call_matrix[9][2] = rdR; - call_matrix[9][3] = 2; //hard set slot number - call_matrix[9][4] = dcc; - call_matrix[9][5] = time(NULL); - - memset(state->dmr_alias_block_segment[1], 0, sizeof(state->dmr_alias_block_segment[1])); - sprintf (state->dmr_embedded_gps[1], "%s", ""); - - } - - //P25 P1 - if ( (lls == 0 || lls == 1) && call_matrix[9][2] != rd && nc > 0 && tg > 0 && state->dmrburstL == 26) - { - for (short int k = 0; k < 9; k++) - { - call_matrix[k][0] = call_matrix[k+1][0]; - call_matrix[k][1] = call_matrix[k+1][1]; - call_matrix[k][2] = call_matrix[k+1][2]; - call_matrix[k][3] = call_matrix[k+1][3]; - call_matrix[k][4] = call_matrix[k+1][4]; - call_matrix[k][5] = call_matrix[k+1][5]; - } - - call_matrix[9][0] = lls; - call_matrix[9][1] = tg; - call_matrix[9][2] = rd; - call_matrix[9][3] = 0; - call_matrix[9][4] = nc; - call_matrix[9][5] = time(NULL); - - } - //Start Printing Section erase(); if (opts->ncurses_compact == 1) @@ -2966,22 +2688,21 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) printw ("\n"); printw ("| "); - printw ("TGT: [%5d] ", tgn); - printw ("SRC: [%5d] ", src); - // if (state->nxdn_alias_block_segment[0][0] > 0) //consider disabling this - printw ("Alias: [%s]", alias_ch[9]); + printw ("TGT: [%5d] ", state->nxdn_last_tg); + printw ("SRC: [%5d] ", state->nxdn_last_rid); + printw ("Alias: [%s]", state->generic_talker_alias[0]); //Group Name Labels from CSV import for (int k = 0; k < state->group_tally; k++) { - if (state->group_array[k].groupNumber == tgn) + if (state->group_array[k].groupNumber == state->nxdn_last_tg) { printw ("TG: "); attron(COLOR_PAIR(4)); printw (" [%s]", state->group_array[k].groupName); printw ("[%s] ", state->group_array[k].groupMode); } - else if (state->group_array[k].groupNumber == src) + else if (state->group_array[k].groupNumber == state->nxdn_last_rid) { attron(COLOR_PAIR(4)); printw (" [%s]", state->group_array[k].groupName); @@ -3074,7 +2795,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) printw ("| "); if (lls > 1 && lls < 30) { - printw ("DMR BS - DCC: %02i; ", dcc); + printw ("DMR BS - DCC: %02i; ", state->dmr_color_code); // printw ("%s %s", state->dmr_branding, state->dmr_branding_sub); printw ("%s ", state->dmr_branding); printw ("%s", state->dmr_branding_sub); @@ -3095,7 +2816,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) } else if (lls == 32 || lls == 33 || lls == 34) { - printw ("DMR MS - DCC: %02i; ", dcc); + printw ("DMR MS - DCC: %02i; ", state->dmr_color_code); } else if (lls == 0 || lls == 1) //P1 { @@ -3108,7 +2829,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) //load talker aliases here (Moto, Tait, Harris) for (int16_t i = 0; i < state->group_tally; i++) { - if (state->group_array[i].groupNumber == rd) //or state->lastsrc + if (state->group_array[i].groupNumber == state->lastsrc) //or state->lastsrc { sprintf (state->generic_talker_alias[0], "%s", state->group_array[i].groupName); break; @@ -3142,7 +2863,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) //load talker aliases here (Moto, Tait, Harris) for (int16_t i = 0; i < state->group_tally; i++) { - if (state->group_array[i].groupNumber == rd) //or state->lastsrc + if (state->group_array[i].groupNumber == state->lastsrc) { sprintf (state->generic_talker_alias[0], "%s", state->group_array[i].groupName); break; @@ -3152,7 +2873,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) //load talker aliases here (Moto, Tait, Harris) for (int16_t i = 0; i < state->group_tally; i++) { - if (state->group_array[i].groupNumber == rdR) //or state->lastsrc + if (state->group_array[i].groupNumber == state->lastsrcR) { sprintf (state->generic_talker_alias[1], "%s", state->group_array[i].groupName); break; @@ -3589,7 +3310,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) { printw ("| Monitoring VC - LCN [%02d]\n", state->edacs_tuned_lcn); //since we are tuned, keep updating the time so it doesn't disappear during call - call_matrix[state->edacs_tuned_lcn][5] = time(NULL); + edacs_channel_tree[state->edacs_tuned_lcn][5] = time(NULL); } printw ("| SITE [%03lld][%02llX]", state->edacs_site_id, state->edacs_site_id); @@ -3608,9 +3329,9 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) for (i = 1; i <= state->edacs_lcn_count; i++) { // Compute AFS for display purposes only - int a = (call_matrix[i][2] >> state->edacs_a_shift) & state->edacs_a_mask; - int f = (call_matrix[i][2] >> state->edacs_f_shift) & state->edacs_f_mask; - int s = call_matrix[i][2] & state->edacs_s_mask; + int a = (edacs_channel_tree[i][2] >> state->edacs_a_shift) & state->edacs_a_mask; + int f = (edacs_channel_tree[i][2] >> state->edacs_f_shift) & state->edacs_f_mask; + int s = edacs_channel_tree[i][2] & state->edacs_s_mask; printw ("| - LCN [%02d][%010.06lf] MHz", i, (double)state->trunk_lcn_freq[i-1]/1000000); //print Control Channel on LCN line with the current Control Channel @@ -3623,13 +3344,13 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) int print_call = 0; //print active calls on corresponding LCN line - if ((i != state->edacs_cc_lcn) && time(NULL) - call_matrix[i][5] < 2) + if ((i != state->edacs_cc_lcn) && time(NULL) - edacs_channel_tree[i][5] < 2) { print_call = 3; attron (COLOR_PAIR(3)); } //print dying or dead calls in red for x seconds longer - else if ( (i != state->edacs_cc_lcn) && (time(NULL) - call_matrix[i][5] >= 2) && (time(NULL) - call_matrix[i][5] < 5) ) + else if ( (i != state->edacs_cc_lcn) && (time(NULL) - edacs_channel_tree[i][5] >= 2) && (time(NULL) - edacs_channel_tree[i][5] < 5) ) { print_call = 2; attron (COLOR_PAIR(2)); @@ -3640,69 +3361,69 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (state->ea_mode == 1) { // Voice call - if ((call_matrix[i][4] & EDACS_IS_VOICE) != 0) + if ((edacs_channel_tree[i][4] & EDACS_IS_VOICE) != 0) { // Group call - if ((call_matrix[i][4] & EDACS_IS_GROUP) != 0) - printw (" TGT [%8lld] SRC [%8lld]", call_matrix[i][2], call_matrix[i][3] ); + if ((edacs_channel_tree[i][4] & EDACS_IS_GROUP) != 0) + printw (" TGT [%8lld] SRC [%8lld]", edacs_channel_tree[i][2], edacs_channel_tree[i][3] ); // I-Call - else if ((call_matrix[i][4] & EDACS_IS_INDIVIDUAL) != 0) - printw (" TGT [%8lld] SRC [%8lld] I-Call", call_matrix[i][2], call_matrix[i][3] ); + else if ((edacs_channel_tree[i][4] & EDACS_IS_INDIVIDUAL) != 0) + printw (" TGT [%8lld] SRC [%8lld] I-Call", edacs_channel_tree[i][2], edacs_channel_tree[i][3] ); // System all-call - else if ((call_matrix[i][4] & EDACS_IS_ALL_CALL) != 0) - printw (" TGT [ SYSTEM ] SRC [%8lld] All-Call", call_matrix[i][3] ); + else if ((edacs_channel_tree[i][4] & EDACS_IS_ALL_CALL) != 0) + printw (" TGT [ SYSTEM ] SRC [%8lld] All-Call", edacs_channel_tree[i][3] ); // Interconnect call - else if ((call_matrix[i][4] & EDACS_IS_INTERCONNECT) != 0) - printw (" TGT [ SYSTEM ] SRC [%8lld] Interconnect", call_matrix[i][3] ); + else if ((edacs_channel_tree[i][4] & EDACS_IS_INTERCONNECT) != 0) + printw (" TGT [ SYSTEM ] SRC [%8lld] Interconnect", edacs_channel_tree[i][3] ); // Test call - else if ((call_matrix[i][4] & EDACS_IS_TEST_CALL) != 0) + else if ((edacs_channel_tree[i][4] & EDACS_IS_TEST_CALL) != 0) printw (" TGT [ SYSTEM ] SRC [ SYSTEM ] Test Call"); // Unknown call else printw (" Unknown call type" ); // Call flags - if ((call_matrix[i][4] & EDACS_IS_TEST_CALL) != 0) {} - else if ((call_matrix[i][4] & EDACS_IS_DIGITAL) == 0) printw (" [Ana]"); + if ((edacs_channel_tree[i][4] & EDACS_IS_TEST_CALL) != 0) {} + else if ((edacs_channel_tree[i][4] & EDACS_IS_DIGITAL) == 0) printw (" [Ana]"); else printw (" [Dig]"); - if ((call_matrix[i][4] & EDACS_IS_EMERGENCY) != 0) printw ("[EM]"); + if ((edacs_channel_tree[i][4] & EDACS_IS_EMERGENCY) != 0) printw ("[EM]"); } else // Data call - printw (" TGT [ DATA ] SRC [%8lld] Data", call_matrix[i][3] ); + printw (" TGT [ DATA ] SRC [%8lld] Data", edacs_channel_tree[i][3] ); } else { // Voice call - if ((call_matrix[i][4] & EDACS_IS_VOICE) != 0) + if ((edacs_channel_tree[i][4] & EDACS_IS_VOICE) != 0) { // Group call - if ((call_matrix[i][4] & EDACS_IS_GROUP) != 0) + if ((edacs_channel_tree[i][4] & EDACS_IS_GROUP) != 0) { char afs_str[8]; getAfsString(state, afs_str, a, f, s); - printw (" TGT [%6lld][%s] SRC [%5lld]", call_matrix[i][2], afs_str, call_matrix[i][3] ); + printw (" TGT [%6lld][%s] SRC [%5lld]", edacs_channel_tree[i][2], afs_str, edacs_channel_tree[i][3] ); } // I-Call - else if ((call_matrix[i][4] & EDACS_IS_INDIVIDUAL) != 0) + else if ((edacs_channel_tree[i][4] & EDACS_IS_INDIVIDUAL) != 0) if (getAfsStringLength(state) == 6) - printw (" TGT [%6lld][ UNIT ] SRC [%5lld] I-Call", call_matrix[i][2], call_matrix[i][3] ); + printw (" TGT [%6lld][ UNIT ] SRC [%5lld] I-Call", edacs_channel_tree[i][2], edacs_channel_tree[i][3] ); else - printw (" TGT [%6lld][ UNIT ] SRC [%5lld] I-Call", call_matrix[i][2], call_matrix[i][3] ); + printw (" TGT [%6lld][ UNIT ] SRC [%5lld] I-Call", edacs_channel_tree[i][2], edacs_channel_tree[i][3] ); // System all-call - else if ((call_matrix[i][4] & EDACS_IS_ALL_CALL) != 0) + else if ((edacs_channel_tree[i][4] & EDACS_IS_ALL_CALL) != 0) if (getAfsStringLength(state) == 6) - printw (" TGT [ SYSTEM ] SRC [%5lld] All-Call", call_matrix[i][3] ); + printw (" TGT [ SYSTEM ] SRC [%5lld] All-Call", edacs_channel_tree[i][3] ); else - printw (" TGT [ SYSTEM ] SRC [%5lld] All-Call", call_matrix[i][3] ); + printw (" TGT [ SYSTEM ] SRC [%5lld] All-Call", edacs_channel_tree[i][3] ); // Interconnect call - else if ((call_matrix[i][4] & EDACS_IS_INTERCONNECT) != 0) + else if ((edacs_channel_tree[i][4] & EDACS_IS_INTERCONNECT) != 0) if (getAfsStringLength(state) == 6) - printw (" TGT [ SYSTEM ] SRC [%5lld] Interconnect", call_matrix[i][3] ); + printw (" TGT [ SYSTEM ] SRC [%5lld] Interconnect", edacs_channel_tree[i][3] ); else - printw (" TGT [ SYSTEM ] SRC [%5lld] Interconnect", call_matrix[i][3] ); + printw (" TGT [ SYSTEM ] SRC [%5lld] Interconnect", edacs_channel_tree[i][3] ); // Test call - else if ((call_matrix[i][4] & EDACS_IS_TEST_CALL) != 0) + else if ((edacs_channel_tree[i][4] & EDACS_IS_TEST_CALL) != 0) if (getAfsStringLength(state) == 6) printw (" TGT [ SYSTEM ] SRC [ SYS ] Test Call"); else @@ -3712,29 +3433,29 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) printw (" Unknown call type" ); // Call flags - if ((call_matrix[i][4] & EDACS_IS_TEST_CALL) != 0) {} - else if ((call_matrix[i][4] & EDACS_IS_DIGITAL) == 0) printw (" [Ana]"); + if ((edacs_channel_tree[i][4] & EDACS_IS_TEST_CALL) != 0) {} + else if ((edacs_channel_tree[i][4] & EDACS_IS_DIGITAL) == 0) printw (" [Ana]"); else printw (" [Dig]"); - if ((call_matrix[i][4] & EDACS_IS_AGENCY_CALL) != 0) printw ("[A]"); - if ((call_matrix[i][4] & EDACS_IS_FLEET_CALL) != 0) printw ("[F]"); - if ((call_matrix[i][4] & EDACS_IS_EMERGENCY) != 0) printw ("[EM]"); + if ((edacs_channel_tree[i][4] & EDACS_IS_AGENCY_CALL) != 0) printw ("[A]"); + if ((edacs_channel_tree[i][4] & EDACS_IS_FLEET_CALL) != 0) printw ("[F]"); + if ((edacs_channel_tree[i][4] & EDACS_IS_EMERGENCY) != 0) printw ("[EM]"); } // Data call else if (getAfsStringLength(state) == 6) - printw (" TGT [ DATA ] SRC [%5lld] Data", call_matrix[i][3] ); + printw (" TGT [ DATA ] SRC [%5lld] Data", edacs_channel_tree[i][3] ); else - printw (" TGT [ DATA ] SRC [%5lld] Data", call_matrix[i][3] ); + printw (" TGT [ DATA ] SRC [%5lld] Data", edacs_channel_tree[i][3] ); } for (int k = 0; k < state->group_tally; k++) { - if (state->group_array[k].groupNumber == call_matrix[i][2] && call_matrix[i][2] != 0) + if (state->group_array[k].groupNumber == edacs_channel_tree[i][2] && edacs_channel_tree[i][2] != 0) { printw (" [%s]", state->group_array[k].groupName); printw ("[%s]", state->group_array[k].groupMode); break; } - else if (state->group_array[k].groupNumber == call_matrix[i][3] && call_matrix[i][3] != 0) + else if (state->group_array[k].groupNumber == edacs_channel_tree[i][3] && edacs_channel_tree[i][3] != 0) { printw (" [%s]", state->group_array[k].groupName); printw ("[%s]", state->group_array[k].groupMode); @@ -3763,7 +3484,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state) if (state->carrier == 1){ //same as above attroff(COLOR_PAIR(3)); } - //only print call history if enabled + //only print event history if enabled if (opts->ncurses_history == 1) { attron(COLOR_PAIR(4)); //cyan for history @@ -4833,7 +4554,7 @@ void watchdog_event_history (dsd_opts * opts, dsd_state * state, uint8_t slot) //call alert beep when new call detected if (last_source_id == 0 && source_id != 0 && opts->call_alert == 1) - beeper (opts, state, slot, 45, 103, 6); + beeper (opts, state, slot, 40, 86, 3); if (source_id != last_source_id && last_source_id != 0) { @@ -4864,7 +4585,7 @@ void watchdog_event_history (dsd_opts * opts, dsd_state * state, uint8_t slot) //end of voice call alert if (opts->call_alert == 1) - beeper (opts, state, slot, 35, 103, 6); + beeper (opts, state, slot, 40, 86, 3); } } @@ -5433,5 +5154,5 @@ void watchdog_event_datacall (dsd_opts * opts, dsd_state * state, uint32_t src, //call alert on data calls if (opts->call_alert) - beeper (opts, state, slot, 25, 103, 6); //TODO: Find good souding Tone ID and AD values + beeper (opts, state, slot, 80, 20, 3); } diff --git a/src/nxdn_element.c b/src/nxdn_element.c index 740fd4f..fe505a8 100644 --- a/src/nxdn_element.c +++ b/src/nxdn_element.c @@ -779,12 +779,8 @@ void NXDN_decode_Alias(dsd_opts * opts, dsd_state * state, uint8_t * Message) //juggle strings here so we don't get compiler warnings on assignment size memcpy (str_b, str_a, 48); str_b[49] = '\0'; - //one noteable issue is that on conventional, its possible to decode an alias before decong the src id - //just depends on reception and if VCALL is decoded before Alias, this will lead to alias being assigned - //to incorrect src values or placement in the ncurses terminal's call history section - - if (state->nxdn_last_rid != 0) - sprintf (state->str50a, "%s", str_b); + sprintf (state->generic_talker_alias[0], "%s", str_b); + sprintf (state->event_history_s[0].Event_History_Items[0].alias, "%s; ", str_b); } @@ -1326,7 +1322,7 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message) state->nxdn_last_rid = 0; state->nxdn_last_tg = 0; state->gi[0] = -1; - sprintf (state->str50a, "%s", ""); + sprintf (state->generic_talker_alias[0], "%s", ""); memset (state->nxdn_alias_block_segment, 0, sizeof(state->nxdn_alias_block_segment)); }