diff --git a/src/isdn/dss1.c b/src/isdn/dss1.c index f05bd1e..2586492 100644 --- a/src/isdn/dss1.c +++ b/src/isdn/dss1.c @@ -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);