bnetz: Simplifying 'telegramm' handling

This commit is contained in:
Andreas Eversberg 2016-03-05 09:57:11 +01:00
parent d21be383a6
commit 287b914b56
4 changed files with 28 additions and 18 deletions

View File

@ -350,7 +350,7 @@ static void bnetz_go_idle(bnetz_t *bnetz)
PDEBUG(DBNETZ, DEBUG_INFO, "Entering IDLE state, sending 'Gruppenfreisignal' %d.\n", bnetz->gfs); PDEBUG(DBNETZ, DEBUG_INFO, "Entering IDLE state, sending 'Gruppenfreisignal' %d.\n", bnetz->gfs);
bnetz->state = BNETZ_FREI; bnetz->state = BNETZ_FREI;
bnetz->dsp_mode = DSP_MODE_TELEGRAMM; bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
switch_channel_19(bnetz, 0); switch_channel_19(bnetz, 0);
bnetz->station_id[0] = '\0'; bnetz->station_id[0] = '\0';
} }
@ -362,7 +362,7 @@ static void bnetz_release(bnetz_t *bnetz)
PDEBUG(DBNETZ, DEBUG_INFO, "Entering release state, sending 'Trennsignal'.\n"); PDEBUG(DBNETZ, DEBUG_INFO, "Entering release state, sending 'Trennsignal'.\n");
bnetz->state = BNETZ_TRENNEN; bnetz->state = BNETZ_TRENNEN;
bnetz->dsp_mode = DSP_MODE_TELEGRAMM; bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
switch_channel_19(bnetz, 0); switch_channel_19(bnetz, 0);
bnetz->trenn_count = 0; bnetz->trenn_count = 0;
bnetz->station_id[0] = '\0'; bnetz->station_id[0] = '\0';
@ -373,7 +373,7 @@ static void bnetz_page(bnetz_t *bnetz, const char *dial_string, int try)
{ {
PDEBUG(DBNETZ, DEBUG_INFO, "Entering paging state (try %d), sending 'Selektivruf' to '%s'.\n", try, dial_string); PDEBUG(DBNETZ, DEBUG_INFO, "Entering paging state (try %d), sending 'Selektivruf' to '%s'.\n", try, dial_string);
bnetz->state = BNETZ_SELEKTIVRUF; bnetz->state = BNETZ_SELEKTIVRUF;
bnetz->dsp_mode = DSP_MODE_0; bnetz_set_dsp_mode(bnetz, DSP_MODE_0);
bnetz->page_mode = PAGE_MODE_NUMBER; bnetz->page_mode = PAGE_MODE_NUMBER;
bnetz->page_try = try; bnetz->page_try = try;
strcpy(bnetz->station_id, dial_string); strcpy(bnetz->station_id, dial_string);
@ -400,7 +400,7 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
break; break;
case BNETZ_WAHLABRUF: case BNETZ_WAHLABRUF:
if (bnetz->station_id_pos == 5) { if (bnetz->station_id_pos == 5) {
bnetz->dsp_mode = DSP_MODE_1; bnetz_set_dsp_mode(bnetz, DSP_MODE_1);
return NULL; return NULL;
} }
it = bnetz_telegramm(bnetz->station_id[bnetz->station_id_pos++]); it = bnetz_telegramm(bnetz->station_id[bnetz->station_id_pos++]);
@ -409,7 +409,7 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
if (bnetz->page_mode == PAGE_MODE_KANALBEFEHL) { if (bnetz->page_mode == PAGE_MODE_KANALBEFEHL) {
PDEBUG(DBNETZ, DEBUG_INFO, "Paging mobile station %s complete, waiting for answer.\n", bnetz->station_id); PDEBUG(DBNETZ, DEBUG_INFO, "Paging mobile station %s complete, waiting for answer.\n", bnetz->station_id);
bnetz->state = BNETZ_RUFBESTAETIGUNG; bnetz->state = BNETZ_RUFBESTAETIGUNG;
bnetz->dsp_mode = DSP_MODE_SILENCE; bnetz_set_dsp_mode(bnetz, DSP_MODE_SILENCE);
switch_channel_19(bnetz, 0); switch_channel_19(bnetz, 0);
timer_start(&bnetz->timer, PAGING_TO); timer_start(&bnetz->timer, PAGING_TO);
return NULL; return NULL;
@ -470,8 +470,7 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
PDEBUG(DBNETZ, DEBUG_INFO, "Received signal 'Kanalbelegung' from mobile station, sending signal 'Wahlabruf'.\n"); PDEBUG(DBNETZ, DEBUG_INFO, "Received signal 'Kanalbelegung' from mobile station, sending signal 'Wahlabruf'.\n");
bnetz->state = BNETZ_WAHLABRUF; bnetz->state = BNETZ_WAHLABRUF;
bnetz->dial_mode = DIAL_MODE_START; bnetz->dial_mode = DIAL_MODE_START;
bnetz->telegramm = NULL; bnetz_set_dsp_mode(bnetz, DSP_MODE_1);
bnetz->dsp_mode = DSP_MODE_1;
timer_start(&bnetz->timer, DIALING_TO); timer_start(&bnetz->timer, DIALING_TO);
break; break;
} }
@ -481,7 +480,7 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
PDEBUG(DBNETZ, DEBUG_INFO, "Received signal 'Rufbestaetigung' from mobile station, call is ringing.\n"); PDEBUG(DBNETZ, DEBUG_INFO, "Received signal 'Rufbestaetigung' from mobile station, call is ringing.\n");
timer_stop(&bnetz->timer); timer_stop(&bnetz->timer);
bnetz->state = BNETZ_RUFHALTUNG; bnetz->state = BNETZ_RUFHALTUNG;
bnetz->dsp_mode = DSP_MODE_1; bnetz_set_dsp_mode(bnetz, DSP_MODE_1);
call_in_alerting(bnetz->sender.callref); call_in_alerting(bnetz->sender.callref);
timer_start(&bnetz->timer, ALERTING_TO); timer_start(&bnetz->timer, ALERTING_TO);
break; break;
@ -492,7 +491,7 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
PDEBUG(DBNETZ, DEBUG_INFO, "Received signal 'Beginnsignal' from mobile station, call establised.\n"); PDEBUG(DBNETZ, DEBUG_INFO, "Received signal 'Beginnsignal' from mobile station, call establised.\n");
timer_stop(&bnetz->timer); timer_stop(&bnetz->timer);
bnetz->state = BNETZ_GESPRAECH; bnetz->state = BNETZ_GESPRAECH;
bnetz->dsp_mode = DSP_MODE_AUDIO; bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
call_in_answer(bnetz->sender.callref, bnetz->station_id); call_in_answer(bnetz->sender.callref, bnetz->station_id);
break; break;
} }
@ -568,7 +567,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double quality,
PDEBUG(DBNETZ, DEBUG_INFO, "Received number from mobile phone: %s\n", bnetz->dial_number); PDEBUG(DBNETZ, DEBUG_INFO, "Received number from mobile phone: %s\n", bnetz->dial_number);
bnetz->dial_mode = DIAL_MODE_START2; bnetz->dial_mode = DIAL_MODE_START2;
PDEBUG(DBNETZ, DEBUG_INFO, "Sending station id back to phone: %s.\n", bnetz->station_id); PDEBUG(DBNETZ, DEBUG_INFO, "Sending station id back to phone: %s.\n", bnetz->station_id);
bnetz->dsp_mode = DSP_MODE_TELEGRAMM; bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
bnetz->station_id_pos = 0; bnetz->station_id_pos = 0;
break; break;
} }
@ -629,7 +628,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double quality,
} }
PDEBUG(DBNETZ, DEBUG_INFO, "Dialing complete %s->%s, call established.\n", bnetz->station_id, dialing); PDEBUG(DBNETZ, DEBUG_INFO, "Dialing complete %s->%s, call established.\n", bnetz->station_id, dialing);
timer_stop(&bnetz->timer); timer_stop(&bnetz->timer);
bnetz->dsp_mode = DSP_MODE_AUDIO; bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
bnetz->state = BNETZ_GESPRAECH; bnetz->state = BNETZ_GESPRAECH;
/* setup call */ /* setup call */
@ -689,7 +688,7 @@ static void bnetz_timeout(struct timer *timer)
break; break;
case BNETZ_SELEKTIVRUF: case BNETZ_SELEKTIVRUF:
PDEBUG(DBNETZ, DEBUG_DEBUG, "Transmitter switched to channel 19, starting paging telegramms.\n"); PDEBUG(DBNETZ, DEBUG_DEBUG, "Transmitter switched to channel 19, starting paging telegramms.\n");
bnetz->dsp_mode = DSP_MODE_TELEGRAMM; bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
break; break;
case BNETZ_RUFBESTAETIGUNG: case BNETZ_RUFBESTAETIGUNG:
if (bnetz->page_try == PAGE_TRIES) { if (bnetz->page_try == PAGE_TRIES) {

View File

@ -70,7 +70,7 @@ typedef struct bnetz {
int fsk_filter_pos; /* current sample position in filter_spl */ int fsk_filter_pos; /* current sample position in filter_spl */
int fsk_filter_step; /* number of samples for each analyzation */ int fsk_filter_step; /* number of samples for each analyzation */
int fsk_filter_bit; /* last bit, so we detect a bit change */ int fsk_filter_bit; /* last bit, so we detect a bit change */
int fsk_filter_sample; /* sample counter for shifting receive bits */ int fsk_filter_sample; /* count until it is time to sample bit */
uint16_t fsk_filter_telegramm; /* rx shift register for receiveing telegramm */ uint16_t fsk_filter_telegramm; /* rx shift register for receiveing telegramm */
double fsk_filter_quality[16]; /* quality of each bit in telegramm */ double fsk_filter_quality[16]; /* quality of each bit in telegramm */
double fsk_filter_level[16]; /* level of each bit in telegramm */ double fsk_filter_level[16]; /* level of each bit in telegramm */
@ -79,7 +79,7 @@ typedef struct bnetz {
int tone_count; /* how long has that tone been detected */ int tone_count; /* how long has that tone been detected */
double phaseshift256[2]; /* how much the phase of sine wave changes per sample */ double phaseshift256[2]; /* how much the phase of sine wave changes per sample */
double phase256; /* current phase */ double phase256; /* current phase */
const char *telegramm; /* current telegramm sequence */ int telegramm; /* set, if there is a valid telegram */
int16_t *telegramm_spl; /* 16 * samples_per_bit */ int16_t *telegramm_spl; /* 16 * samples_per_bit */
int telegramm_pos; /* current sample position in telegramm_spl */ int telegramm_pos; /* current sample position in telegramm_spl */

View File

@ -331,6 +331,7 @@ static void fsk_tone(bnetz_t *bnetz, int16_t *samples, int length, int tone)
static int fsk_telegramm(bnetz_t *bnetz, int16_t *samples, int length) static int fsk_telegramm(bnetz_t *bnetz, int16_t *samples, int length)
{ {
int16_t *spl; int16_t *spl;
const char *telegramm;
int i, j; int i, j;
double phaseshift, phase; double phaseshift, phase;
int count, max; int count, max;
@ -339,17 +340,18 @@ next_telegramm:
if (!bnetz->telegramm) { if (!bnetz->telegramm) {
/* request telegramm */ /* request telegramm */
// PDEBUG(DFSK, DEBUG_DEBUG, "Request new 'Telegramm'.\n"); // PDEBUG(DFSK, DEBUG_DEBUG, "Request new 'Telegramm'.\n");
bnetz->telegramm = bnetz_get_telegramm(bnetz); telegramm = bnetz_get_telegramm(bnetz);
if (!bnetz->telegramm) { if (!telegramm) {
PDEBUG(DFSK, DEBUG_DEBUG, "Stop sending 'Telegramm'.\n"); PDEBUG(DFSK, DEBUG_DEBUG, "Stop sending 'Telegramm'.\n");
return length; return length;
} }
bnetz->telegramm = 1;
bnetz->telegramm_pos = 0; bnetz->telegramm_pos = 0;
spl = bnetz->telegramm_spl; spl = bnetz->telegramm_spl;
/* render telegramm */ /* render telegramm */
phase = bnetz->phase256; phase = bnetz->phase256;
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
phaseshift = bnetz->phaseshift256[bnetz->telegramm[i] == '1']; phaseshift = bnetz->phaseshift256[telegramm[i] == '1'];
for (j = 0; j < bnetz->samples_per_bit; j++) { for (j = 0; j < bnetz->samples_per_bit; j++) {
*spl++ = dsp_sine[((uint8_t)phase) & 0xff]; *spl++ = dsp_sine[((uint8_t)phase) & 0xff];
phase += phaseshift; phase += phaseshift;
@ -372,7 +374,7 @@ next_telegramm:
bnetz->telegramm_pos += count; bnetz->telegramm_pos += count;
/* check for end of telegramm */ /* check for end of telegramm */
if (bnetz->telegramm_pos == max) { if (bnetz->telegramm_pos == max) {
bnetz->telegramm = NULL; bnetz->telegramm = 0;
/* we need more ? */ /* we need more ? */
if (length) if (length)
goto next_telegramm; goto next_telegramm;
@ -414,3 +416,11 @@ again:
} }
} }
void bnetz_set_dsp_mode(bnetz_t *bnetz, enum dsp_mode mode)
{
/* reset telegramm */
if (mode == DSP_MODE_TELEGRAMM && bnetz->dsp_mode != mode)
bnetz->telegramm = 0;
bnetz->dsp_mode = mode;
}

View File

@ -2,4 +2,5 @@
void dsp_init(void); void dsp_init(void);
int dsp_init_sender(bnetz_t *bnetz); int dsp_init_sender(bnetz_t *bnetz);
void dsp_cleanup_sender(bnetz_t *bnetz); void dsp_cleanup_sender(bnetz_t *bnetz);
void bnetz_set_dsp_mode(bnetz_t *bnetz, enum dsp_mode mode);