Add metering information from osmo-cc to B-Netz and C-Netz

Untested!
This commit is contained in:
Andreas Eversberg
2024-01-27 22:53:24 +01:00
parent da9b0a0f8d
commit 2dcf10b1b1
24 changed files with 122 additions and 36 deletions

View File

@@ -667,8 +667,35 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
return 0;
}
void call_down_answer(int __attribute__((unused)) callref)
void call_down_answer(int callref, struct timeval *tv_meter)
{
sender_t *sender;
cnetz_t *cnetz;
transaction_t *trans;
LOGP(DCNETZ, LOGL_INFO, "Call has been answered by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
cnetz = (cnetz_t *) sender;
trans = search_transaction_callref(cnetz, callref);
if (trans)
break;
}
if (!sender) {
LOGP(DCNETZ, LOGL_NOTICE, "Incoming answer, but no callref!\n");
return;
}
/* At least tone second! */
if (tv_meter->tv_sec) {
LOGP(DCNETZ, LOGL_INFO, "Network starts metering pulses every %lu.%03lu seconds.\n", tv_meter->tv_sec, tv_meter->tv_usec / 1000);
trans->meter_start = get_time();
trans->metering_time = (double)tv_meter->tv_sec + (double)tv_meter->tv_usec / 1000000.0;
} else if (cnetz->metering) {
LOGP(DCNETZ, LOGL_INFO, "Command line options starts metering pulses every %d seconds.\n", cnetz->metering);
trans->meter_start = get_time();
trans->metering_time = (double)cnetz->metering;
}
}
/* Call control sends disconnect (with tones).
@@ -700,6 +727,8 @@ void call_down_disconnect(int callref, int cause)
switch (cnetz->dsp_mode) {
case DSP_MODE_SPK_V:
/* stop metering */
trans->meter_end = get_time();
return;
case DSP_MODE_SPK_K:
LOGP(DCNETZ, LOGL_INFO, "Call control disconnects on speech channel, releasing towards mobile station.\n");
@@ -1667,11 +1696,11 @@ const telegramm_t *cnetz_transmit_telegramm_spk_v(cnetz_t *cnetz)
memset(&telegramm, 0, sizeof(telegramm));
if (cnetz->metering) {
double now = get_time();
if (!trans->call_start)
trans->call_start = now;
meter = (now - trans->call_start) / (double)cnetz->metering + 1;
if (trans->metering_time) {
/* get end time. if not set, use current time. (still running) */
double end = (trans->meter_end) ? : get_time();
/* add one unit, because when metering is started, the first unit is counted. */
meter = (end - trans->meter_start) / (double)trans->metering_time + 1.0;
}
telegramm.max_sendeleistung = cnetz_power2bits(cnetz->ms_power);

View File

@@ -82,7 +82,7 @@ struct cnetz {
int response_valid; /* expect authorizaton response */
uint64_t response; /* authorization response */
int warteschlange; /* use queue */
int metering; /* use metering pulses in seconds 0 = off */
int metering; /* send metering units in seconds 0 = off */
/* all cnetz states */
enum cnetz_state state; /* main state of sender */

View File

@@ -122,8 +122,10 @@ void print_help(const char *arg0)
printf(" Enable queue support. If no channel is available, calls will be kept\n");
printf(" in a queue for maximum of 60 seconds. (default = %d)\n", warteschlange);
printf(" -G --gebuehren <seconds> | 0\n");
printf(" Increment metering counter every given number of seconds.\n");
printf(" Increment metering counter every given number of seconds.\n");
printf(" To turn off, use 0. (default = %d)\n", metering);
printf(" If metering pulses are sent via Osmo-CC interface, pulses are always\n");
printf(" increment metering counter. This overrides this option.\n");
printf(" -V --voice-deviation <2400..4000 Hz>\n");
printf(" It is unclear what the actual voice deviation is. Please increase, if\n");
printf(" mobile's earpiece is too quiet and the microphone is too loud.\n");

View File

@@ -54,7 +54,9 @@ typedef struct transaction {
int mo_call; /* flags a moile originating call */
int mt_call; /* flags a moile terminating call */
int page_failed; /* failed to get a response from MS */
double call_start; /* when did the call start? (used for metering) */
double metering_time; /* time between units (0.0 if no metering set) */
double meter_start; /* when did the metering start? (0.0 if not yet started) */
double meter_end; /* when did the metering end? (0.0 if not yet ended) */
int queue_position; /* to find next transaction in queue */
double rf_level_db; /* level of first contact, so we can detect correct channel at multiple receptions */
} transaction_t;