Add metering information from osmo-cc to B-Netz and C-Netz
Untested!
This commit is contained in:
@@ -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);
|
||||
|
@@ -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 */
|
||||
|
@@ -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");
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user