AOC-S: Changed typeOfCharging to stepFunction
The durationCurrency typeOfCharging=stepFunction is more suitable to a per-unit metering than continuousCharging. stepFunction implies start of the first unit at call connect - for normal calls without additional unit charges for call setup, chargedItem CallSetup is set to FreeOfCharge. Source: ETS 300 178 Tested with Bluephone and Clubtelefon 5 ISDN.
This commit is contained in:
parent
a390e93d9a
commit
e39db4cffd
|
@ -201,48 +201,54 @@ static void generate_aocs_fac(call_t *call)
|
|||
|
||||
LOGP(DISDN, LOGL_DEBUG, "Sending AOC-S facility from metering data: connect_units=%d unit_period_decisecs=%d\n", call->metering_connect_units, call->metering_unit_period_decisecs);
|
||||
|
||||
if(call->metering_connect_units == 0) { // Free call
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm FreeOfCharge / CallSetup FreeOfCharge\n");
|
||||
if(call->metering_connect_units == 0) {
|
||||
/* Free call */
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm FreeOfCharge; CallSetup FreeOfCharge\n");
|
||||
fac.u.inv.o.AOCcuril.currencyInfoCount = 2;
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].chargedItem = 0x00; // basic comm
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].currencyType = 0x84; // free
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].chargedItem = 0x02; // call setup
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].currencyType = 0x84; // free
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].chargedItem = 0x00; // BasicComm
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].currencyType = 0x84; // Free
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].chargedItem = 0x02; // CallSetup
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].currencyType = 0x84; // Free
|
||||
}
|
||||
else if(call->metering_unit_period_decisecs == 0) { // CallSetup-only FlatRate
|
||||
/* note some payphones (e.g. BluePhone) only interpret 'basic comm' charged item, therefore we don't use 'call setup' charged item */
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm FlatRate / CallSetup FlatRate\n");
|
||||
else if(call->metering_unit_period_decisecs == 0) {
|
||||
/* Connect-only FlatRate call; note some payphones (e.g. BluePhone) only interpret 'BasicComm' charged item, therefore we don't use 'CallSetup' charged item */
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm FlatRate %d/100 EUR; CallSetup FreeOfCharge\n", AOCS_CURRENCY_AMOUNT_PER_UNIT * call->metering_connect_units);
|
||||
fac.u.inv.o.AOCcuril.currencyInfoCount = 2;
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].chargedItem = 0x00; // basic comm
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].currencyType = 0xA2; // FlatRate
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].chargedItem = 0x00; // BasicComm
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].currencyType = 0xA2; // FlatRate
|
||||
strncpy((char *)fac.u.inv.o.AOCcuril.currencyInfo[0].FlatRateCurrency.currency, "EUR", 10); // Currency value
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].FlatRateCurrency.currencyAmount = AOCS_CURRENCY_AMOUNT_PER_UNIT * call->metering_connect_units;
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].FlatRateCurrency.multiplier = 1; // 1/100 EUR
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].chargedItem = 0x02; // call setup
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].currencyType = 0xA2; // FlatRate
|
||||
strncpy((char *)fac.u.inv.o.AOCcuril.currencyInfo[0].FlatRateCurrency.currency, "EUR", 10); // Currency value
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.currencyAmount = AOCS_CURRENCY_AMOUNT_PER_UNIT * call->metering_connect_units;
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.multiplier = 1; // 1/100 EUR
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].FlatRateCurrency.multiplier = 1; // 1/100 EUR
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].chargedItem = 0x02; // CallSetup
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].currencyType = 0x84; // Free
|
||||
}
|
||||
else { // Normal call
|
||||
/* note some payphones (e.g. BluePhone) only interpret 'basic comm' charged item */
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm DurationCurrency / CallSetup FlatRate\n");
|
||||
else {
|
||||
/* Normal call; note some payphones (e.g. BluePhone) only interpret 'BasicComm' charged item */
|
||||
fac.u.inv.o.AOCcuril.currencyInfoCount = 2;
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].chargedItem = 0x00; // basic comm
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].currencyType = 0xA1; // DurationCurrency
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].chargedItem = 0x00; // BasicComm
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].currencyType = 0xA1; // DurationCurrency
|
||||
strncpy((char *)fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.currency, "EUR", 10); // Currency value
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.currencyAmount = AOCS_CURRENCY_AMOUNT_PER_UNIT;
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.multiplier = 1; // 1/100 EUR
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.typeOfCharging = 0x00; // Contin. Charging
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.multiplier = 1; // 1/100 EUR
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.typeOfCharging = 1; // StepFunction
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.durLengthTimeUnit = call->metering_unit_period_decisecs * 10; // Unit duration
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.durLengthTimeScale = 0; // 1/100 s
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.granLengthTimeUnit = call->metering_unit_period_decisecs * 10; // Granularity
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[0].durationCurrency.granLengthTimeScale = 0; // 1/100 s
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].chargedItem = 0x02; // call setup
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].currencyType = 0xA2; // FlatRate
|
||||
strncpy((char *)fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.currency, "EUR", 10); // Currency value
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.currencyAmount = AOCS_CURRENCY_AMOUNT_PER_UNIT * call->metering_connect_units;
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.multiplier = 1; // 1/100 EUR
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].chargedItem = 0x02; // CallSetup
|
||||
if(call->metering_connect_units > 1) {
|
||||
/* Additional CallSetup charge */
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm DurationCurrency %d/100 EUR per %d/100 seconds; CallSetup FlatRate %d/100 EUR\n", AOCS_CURRENCY_AMOUNT_PER_UNIT, call->metering_unit_period_decisecs * 10, AOCS_CURRENCY_AMOUNT_PER_UNIT * (call->metering_connect_units - 1));
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].currencyType = 0xA2; // FlatRate
|
||||
strncpy((char *)fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.currency, "EUR", 10); // Currency value
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.currencyAmount = AOCS_CURRENCY_AMOUNT_PER_UNIT * (call->metering_connect_units - 1);
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].FlatRateCurrency.multiplier = 1; // 1/100 EUR
|
||||
}
|
||||
else {
|
||||
/* No additional CallSetup charge */
|
||||
LOGP(DISDN, LOGL_DEBUG, "AOC-S currencyInfoList: BasicComm DurationCurrency %d/100 EUR per %d/100 seconds; CallSetup FreeOfCharge\n", AOCS_CURRENCY_AMOUNT_PER_UNIT, call->metering_unit_period_decisecs * 10);
|
||||
fac.u.inv.o.AOCcuril.currencyInfo[1].currencyType = 0x84; // Free
|
||||
}
|
||||
}
|
||||
|
||||
encodeFac(fac_ie, &fac);
|
||||
|
|
Loading…
Reference in New Issue