Il formato OpenPass
Struttura del formato
Di seguito si riportano tutti i formati OpenPass utilizzati negli anni.
Formato 1
Il Formato 1 è stato il primo formato redatto ed è stato usato solo come versione di prova, quindi non è mai stato utilizzato sul mercato. Per questo motivo il formato 1 non viene riportato.
Formato 2
Anche il Formato 2 di OpenPass è stato utilizzato solo in fase di test e non è attualmente usato, quindi non viene riportato.
Formato 3
Il Formato 3 è il formato attualmente attivo, strutturato come segue.
Clicca su Espandi di sinistra per visualizzare la struttura del formato.
Clicca su Espandi di destra per visualizzare il significato dei campi e l'area di memoria a cui appartengono.
<?xml version="1.0"?>
<FormatDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Identifier>3</Identifier>
<Description>Common compatible format for season passes, day/time pass and point passes - V0.25 (DRAFT)</Description>
<Creator>Axess Alfi SkiData</Creator>
<LastTouch>2010-09-15T13:23:00</LastTouch>
<!-- Change history -->
<!-- V0.10 Apr 15th, 2010: initial version (Axess AG) -->
<!-- V0.11 Apr 26th, 2010: changes from first review (Skidata, Axess AG) -->
<!-- V0.12 May 10th, 2010: remove reloading of point tickets (Skidata, Axess AG) -->
<!-- V0.13 May 11th, 2010: Group renamed to Region (Skidata AG) -->
<!-- V0.14 May 26th, 2010: changes from review with Alfi: constant value for Root.Group, changed Root.TicketType, renamed Root.SerialNumberEx, minor changes (Axess AG, Alfi) -->
<!-- V0.15 June 11th, 2010: decrease size of Root.Region, change syntax of variable area (add new tokens Root.BlockCRC, ...), use Root.Season+Root.SerialNumberEx in Lombardia (Axess AG, Alfi)-->
<!-- V0.16 June 15th, 2010: removed Root.PriceType, correct bitaddress in variable area, added comments (Axess AG, Skidata AG)-->
<!-- V0.17 June 16th, 2010: added Root.TargetRegion, modified Root.UserID, defined enumerations for Root.Region (Axess AG)-->
<!-- V0.18 June 18th, 2010: renamed Root.Region to Root.IssuerRegion (Axess AG)-->
<!-- V0.19 July 13th, 2010: introduced format 4 (point pass) - identical to format 3 but increased width for Root.RemainingDuration to 20 bits + skipped Root.CurrentDay (SkiData, Axess AG)-->
<!-- V0.20 July 19th, 2010: splitted Root.UserID in Root.UserIDRegion, Root.UserIDWorkstation, Root.UserID, splitted VariableArea parts to support automatic checksum calculations, removed format 4 (SkiData)-->
<!-- V0.21 July 19th, 2010: changed Root.RemainingDuration to 14, Root.CurrentDay to 12 and Root.CRC to 6 bits (Axess AG, SkiData)-->
<!-- V0.22 July 21th, 2010: changed Root.Duration to 14 bits, reverted some changes (Root.UserID + VariableArea definition) from V0.20 and V0.21 to stay compatible with OpenPass (Axess AG)-->
<!-- V0.23 August 17th, 2010: added Root.DateIssued, Root.TimeIssued (Axess AG, SkiData)-->
<!-- V0.24 August 23rd, 2010: renamed Root.BlockCRC tokens to have unique names (Axess AG, SkiData)-->
<!-- V0.25 September 15th, 2010: added currency code (Axess AG)-->
<FixedArea>
<TokenAllocation>
<Name>Root.CRC</Name>
<BitAddress>0</BitAddress>
<BitWidth>16</BitWidth>
</TokenAllocation>
<TokenAllocation>
<Name>Root.IssuerRegion</Name>
<BitAddress>16</BitAddress>
<BitWidth>13</BitWidth>
<!-- Note: in SkiData/Axess compatibilty replaces 'Root.Region' the earlier field 'Root.Group': worldwide unique number for region, also stored in header -->
<!-- (0=Test, 1=Lombardia, ...) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Group</Name>
<ConstantValue>1</ConstantValue>
<!-- Note: no usage for coding Root.Group, therefor define constant value for it -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.UsageDomain</Name>
<BitAddress>29</BitAddress>
<BitWidth>9</BitWidth>
<!-- pool (group of companies having gates) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.SubDomain</Name>
<BitAddress>38</BitAddress>
<BitWidth>7</BitWidth>
<!-- 0 = NotUsed (All gates within usage domain) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Workstation</Name>
<BitAddress>45</BitAddress>
<BitWidth>11</BitWidth>
<!-- unique ID of the workstation (0-2047) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.StartDate</Name>
<BitAddress>56</BitAddress>
<BitWidth>14</BitWidth>
<!-- ticket is valid starting from this date (days since 1/1/2008) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.ExpiryDate</Name>
<BitAddress>70</BitAddress>
<BitWidth>14</BitWidth>
<!-- ticket is valid until this date (days since 1/1/2008), also stored in header (SkiData/Axess compatibilty only) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.StartTime</Name>
<BitAddress>84</BitAddress>
<BitWidth>11</BitWidth>
<!-- ticket is valid from this time (minutes since midnight), only applicable if Root.Unit = Hours/Minutes -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.StartMode</Name>
<BitAddress>95</BitAddress>
<BitWidth>4</BitWidth>
<!-- 1 = ValidFromIssue (directly use Root.StartDate, Root.StartTime, Root.ExpiryDate) -->
<!-- 2 = ValidFromFirstUsage (day pass depot ticket, use Root.DateOfFirstEntry + Root.StartTime/Root.TimeOfFirstEntry [dependent on Root.Unit]; Root.StartDate and Root.ExpiryDate specify absolute limits only) -->
<!-- only applicable if Root.Unit = Days -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Duration</Name>
<BitAddress>99</BitAddress>
<BitWidth>14</BitWidth>
<!-- duration (in days/hours/points) - only used if countable (Days, Hours, Minutes, Years, Month, Points, SingleRides), otherwise set to 1 (Seasons, ...) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TicketType</Name>
<BitAddress>113</BitAddress>
<BitWidth>4</BitWidth>
<!-- 0 = time pass, 1 = consumable (point pass, non-consecutive time pass) -->
<!-- Note: if multiple formats are used, this token can be ommited -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Unit</Name>
<BitAddress>117</BitAddress>
<BitWidth>4</BitWidth>
<!-- unit for Root.Duration (0 = Days, 1 = Reserved, 2 = Reserved, 3 = Points, 4 = SingleRides, 5 = Seasons, 6 = Reserved, 7 = Hours, 8 = Minutes, 9 = Year, 10 = Month) -->
<!-- currently only supported: 0 = Days, 3 = Points, 5 = Seasons, 7 = Hours, 8 = Minutes -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.SerialNumberEx2</Name>
<BitAddress>121</BitAddress>
<BitWidth>32</BitWidth>
<!-- unique serial number of ticket (based on used workstation ID) -->
<!-- Note: no longer dependent on season! (SkiData/Axess compatibilty only) -->
<!-- TODO: in Lombardia replaced by Root.Season (4 bit) + Root.SerialNumberEx (28 bit); needs final confirmation from Alfi -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Restrictions</Name>
<BitAddress>153</BitAddress>
<BitWidth>16</BitWidth>
<!-- 0 = No Restrictions; restriction ID defined on central server (valid season, days, time, ...) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TicketID</Name>
<BitAddress>169</BitAddress>
<BitWidth>32</BitWidth>
<!-- unique ticket/product identifier -->
<!-- has to match with Region, UsageDomain, Duration, Unit, Restriction and UserType -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Price</Name>
<BitAddress>201</BitAddress>
<BitWidth>23</BitWidth>
<!-- tariff in 1/100 Root.Currency units -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.UserID</Name>
<BitAddress>224</BitAddress>
<BitWidth>56</BitWidth>
<!-- unique user ID (this is a bitfield, upper 13 bits contain the region, middle 11 bits contain workstation ID, lower 32 bit contain a local ID) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.UserType</Name>
<BitAddress>280</BitAddress>
<BitWidth>8</BitWidth>
<!-- only used for visualization on gate, e.g. Adult, child, senior, ... -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TargetRegion</Name>
<BitAddress>288</BitAddress>
<BitWidth>13</BitWidth>
<!-- region for interpretation of UsageDomain, TicketID, Restrictions (typically same as Root.Region) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.DateIssued</Name>
<BitAddress>301</BitAddress>
<BitWidth>14</BitWidth>
<!-- date when the ticket has been sold; used for identification of e.g. pre-selling of season passes ... -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TimeIssued</Name>
<BitAddress>315</BitAddress>
<BitWidth>11</BitWidth>
<!-- time when the ticket has been sold; used for identification of e.g. 'gestaffelten Tageskarten' -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.CurrencyCode</Name>
<BitAddress>326</BitAddress>
<BitWidth>15</BitWidth>
<!-- ISO 4217 alphanumeric currency code converted to 3*5 bit numeric value ('A'=0x00, 'B'=0x01, ...) -->
<!-- e.g. 'EUR': 'E' (0x04) + 'U' (0x14) + 'R' (0x11) -> Root.CurrencyCode = 001001010010001b = 0x1291) -->
</TokenAllocation>
</FixedArea>
<VariableArea>
<!-- ********* START of VARIABLE AREA ********** -->
<TokenAllocation>
<Name>Root.BlockCRC</Name>
<BitAddress>0</BitAddress>
<BitWidth>16</BitWidth>
<!-- CRC calculated from this token until the next Root.BlockCRC -->
<!-- (CRC calculated from BitAddress 0-63) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Initialized</Name>
<BitAddress>16</BitAddress>
<BitWidth>1</BitWidth>
</TokenAllocation>
<TokenAllocation>
<Name>Root.TicketState</Name>
<BitAddress>17</BitAddress>
<BitWidth>2</BitWidth>
<!-- 0 = Valid, 1 = Cancelled, 2 = Refunded -->
<!-- Note: this value needs to be evaluated by each vendor, even if it is not set by all vendors; gate must only be opened if ticket state is 0! -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.DateOfFirstEntry</Name>
<BitAddress>19</BitAddress>
<BitWidth>14</BitWidth>
<!-- date of first usage (days since 1/1/2008) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TimeOfFirstEntry</Name>
<BitAddress>33</BitAddress>
<BitWidth>11</BitWidth>
<!-- time of first usage (minutes since midnight) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Reserved</Name>
<BitAddress>44</BitAddress>
<BitWidth>20</BitWidth>
<!-- padding to match chip block boundary -->
</TokenAllocation>
<!-- ********* START of SHADOW A ********** -->
<TokenAllocation>
<Name>Root.BlockCRCA</Name>
<BitAddress>64</BitAddress>
<BitWidth>6</BitWidth>
<!-- (CRC calculated from BitAddress 64-95) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.CurrentDayA</Name>
<BitAddress>70</BitAddress>
<BitWidth>12</BitWidth>
<!-- last usage of the ticket (days since Root.DateOfFirstEntry) -->
<!-- required field -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.RemainingDurationA</Name>
<BitAddress>82</BitAddress>
<BitWidth>14</BitWidth>
<!-- remaing duration -->
</TokenAllocation>
<!-- ********* PADDING ********** -->
<TokenAllocation>
<Name>Root.BlockCRCP</Name>
<BitAddress>96</BitAddress>
<BitWidth>32</BitWidth>
<!-- dummy entry: used for padding to match chip block boundary (on 64bit chips) -->
<!-- (CRC calculated from BitAddress 96-127) -->
</TokenAllocation>
<!-- ********* START of SHADOW B ********** -->
<TokenAllocation>
<Name>Root.BlockCRCB</Name>
<BitAddress>128</BitAddress>
<BitWidth>6</BitWidth>
<!-- (CRC calculated from BitAddress 128-159) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.CurrentDayB</Name>
<BitAddress>134</BitAddress>
<BitWidth>12</BitWidth>
<!-- last usage of the ticket (days since Root.DateOfFirstEntry) -->
<!-- required field -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.RemainingDurationB</Name>
<BitAddress>146</BitAddress>
<BitWidth>14</BitWidth>
<!-- remaing duration -->
</TokenAllocation>
</VariableArea>
</FormatDefinition>
| Nome | Significato | Area |
|---|---|---|
| Root.CRC | CRC dell'area fissa | Fissa |
| Root.IssuerRegion | Codice numerico del gruppo (es. RegioneLombardia = 1) | Fissa |
| Root.Group | Valore costante parti a 1 | Fissa |
| Root.UsageDomain | Il codice numerico identificativo del dominio di abilitazione del biglietto (es. 0=solo stazione, 4=Skipass Lombardia) | Fissa |
| Root.Subdomain | Il codice che indica per ogni dominio di abilitazione quale sottoinsieme di impianti/servizi utilizzare all’interno di quelli a disposizione. | Fissa |
| Root.Workstation | Codice numerico della postazione emittente | Fissa |
| Root.StartDate | Data di inizio del biglietto espressa in giorni trascorsi dal 1.1.2008 | Fissa |
| Root.ExpiryDate | Data di scadenza del biglietto espressa in giorni trascorsi dal 1.1.2008 | Fissa |
| Root.StartTime | Biglietto valido a partire da questo tempo (minuti dalla mezzanotte), applicabile solo se Root.Unit = Hours/Minutes | Fissa |
| Root.StartMode | 1 = ValidFromIssue (usare Root.StartDate, Root.StartTime, Root.ExpiryDate)
2 = ValidFromFirstUsage (biglietto di deposito pass giornaliero, usare Root.DateOfFirstEntry + Root.StartTime/Root.TimeOfFirstEntry [dipende da Root.Unit]; Root.StartDate e Root.ExpiryDate specificano solo limiti assoluti). Applicabile solo se Root.Unit = Days || Fissa | |
| Root.Duration | Durata del biglietto (in giorni/ore/punti), espressa in unità di Root.Unit. | Fissa |
| Root.TicketType | 0 = time pass, 1 = consumable (point pass, non-consecutive time pass). Nota: se sono usati formati multipli, questo token può essere omesso. | Fissa |
| Root.Unit | Unità di durata del biglietto, 0=giorni, 1=mattine, 2=pomeriggi, 3=punti, 4=corse, 5=stagioni, 6=anni,....
Attualmente only supported: 0 = giorni, 3 = punti, 5 = stagioni, 7 = ore, 8 = minuti. || Fissa | |
| Root.SerialNumberEx2 | Il codice univoco di identificazione del biglietto (lo identifica relativamente a Root.Workstation e all’anno/stagione di emissione) | Fissa |
| Root.Restrictions | 0 = No restrizioni; restriction ID definito dal server centrale (stagione valida, giorni, tempo, ...) | Fissa |
| Root.TicketID | Identificativo univoco del ticket | Fissa |
| Root.Price | Il prezzo di acquisto, in centesimi di euro | Fissa |
| Root.UserID | L’identificativo numerico dell’utente nel database anagrafico. Composto da 3 campi: regione (13 bit), workstation (11 bit) e local id (32 bit). | Fissa |
| Root.UserType | Il tipo di utente, es. adulti, bambini | Fissa |
| Root.TargetRegion | Regione per interpretazione di UsageDomain, TicketID, Restrictions (solitamente uguale a Root.IssuerRegion) | Fissa |
| Root.DateIssued | Data di vendita del biglietto | Fissa |
| Root.TimeIssued | Orario di vendita del biglietto | Fissa |
| Root.CurrencyCode | Valuta utilizzata (es: EUR) | Fissa |
| Root.BlockCRC | CRC calcolato dal bit 0 al bit 63 | Variabile |
| Root.Initialized | I dati nell’area variabile sono stati compilati utilizzando per la prima volta un biglietto | Variabile |
| Root.TicketState | 0 = Valido, 1 = Cancellato, 2 = Rimborsato | Variabile |
| Root.DateOfFirstEntry | Data di primo utilizzo (dal 1/1/2008) | Variabile |
| Root.TimeOfFirstEntry | Orario di primo utilizzo (minuti dalla mezzanotte) | Variabile |
| Root.Reserved | Padding | Variabile |
| Root.BlockCRCA | CRC dal bit 64 al bit 95 | Variabile |
| Root.CurrentDayA | Ultimo utilizzo del biglietto (giorni da Root.DateOfFirstEntry) | Variabile |
| Root.RemainingDurationA | Durata rimasta | Variabile |
| Root.BlockCRCP | CRC dal bit 96 al bit 127 | Variabile |
| Root.BlockCRCB | CRC dal bit 128 al bit 159 | Variabile |
| Root.CurrentDayB | Ultimo utilizzo del biglietto (giorni da Root.DateOfFirstEntry) | Variabile |
| Root.RemainingDurationB | Durata rimasta | Variabile |
Formato 4
A seguito della variazione dell’intestazione del settore e della necessità di introdurre i nuovi token : Root.DaysLimit e Root.Insurance si rende necessario variare la struttura del formato.
Clicca su Espandi per visualizzare la struttura del formato.
<?xml version="1.0"?>
<FormatDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Identifier>4</Identifier>
<Description>Common compatible format for season passes, day/time pass and point passes - V4.1 (DRAFT)</Description>
<Creator>Anef Ski Lombardia</Creator>
<LastTouch>2016-07-01T12:00:00</LastTouch>
<!-- Change history -->
<!-- V0.10 Apr 15th, 2010: initial version (Axess AG) -->
<!-- V0.11 Apr 26th, 2010: changes from first review (Skidata, Axess AG) -->
<!-- V0.12 May 10th, 2010: remove reloading of point tickets (Skidata, Axess AG) -->
<!-- V0.13 May 11th, 2010: Group renamed to Region (Skidata AG) -->
<!-- V0.14 May 26th, 2010: changes from review with Alfi: constant value for Root.Group, changed Root.TicketType, renamed Root.SerialNumberEx, minor changes (Axess AG, Alfi) -->
<!-- V0.15 June 11th, 2010: decrease size of Root.Region, change syntax of variable area (add new tokens Root.BlockCRC, ...), use Root.Season+Root.SerialNumberEx in Lombardia (Axess AG, Alfi)-->
<!-- V0.16 June 15th, 2010: removed Root.PriceType, correct bitaddress in variable area, added comments (Axess AG, Skidata AG)-->
<!-- V0.17 June 16th, 2010: added Root.TargetRegion, modified Root.UserID, defined enumerations for Root.Region (Axess AG)-->
<!-- V0.18 June 18th, 2010: renamed Root.Region to Root.IssuerRegion (Axess AG)-->
<!-- V0.19 July 13th, 2010: introduced format 4 (point pass) - identical to format 3 but increased width for Root.RemainingDuration to 20 bits + skipped Root.CurrentDay (SkiData, Axess AG)-->
<!-- V0.20 July 19th, 2010: splitted Root.UserID in Root.UserIDRegion, Root.UserIDWorkstation, Root.UserID, splitted VariableArea parts to support automatic checksum calculations, removed format 4 (SkiData)-->
<!-- V0.21 July 19th, 2010: changed Root.RemainingDuration to 14, Root.CurrentDay to 12 and Root.CRC to 6 bits (Axess AG, SkiData)-->
<!-- V0.22 July 21th, 2010: changed Root.Duration to 14 bits, reverted some changes (Root.UserID + VariableArea definition) from V0.20 and V0.21 to stay compatible with OpenPass (Axess AG)-->
<!-- V0.23 August 17th, 2010: added Root.DateIssued, Root.TimeIssued (Axess AG, SkiData)-->
<!-- V0.24 August 23rd, 2010: renamed Root.BlockCRC tokens to have unique names (Axess AG, SkiData)-->
<!-- V0.25 September 15th, 2010: added currency code (Axess AG)-->
<!-- V4.1 July 27th, 2016: changed Root.IssuerRegion from 13 to 5 bits, changed Root.TargetRegion from 13 to 5 bits, changed Root.UsageDomain from 9 to 12 bits, changed Root.Workstation from 11 to 14 bits, renamed Root.IssuerRegion to Root.Group, removed constant Root.Group, introduced Root.DaysLimit and Root.Insurance (Anef Ski Lombardia) -->
<FixedArea>
<TokenAllocation>
<Name>Root.CRC</Name>
<BitAddress>0</BitAddress>
<BitWidth>16</BitWidth>
</TokenAllocation>
<TokenAllocation>
<Name>Root.Group</Name>
<BitAddress>16</BitAddress>
<BitWidth>5</BitWidth>
<!-- Note: in SkiData/Axess compatibilty replaces 'Root.Region' the earlier field 'Root.Group': worldwide unique number for region, also stored in header -->
<!-- (0=Test, 1=Lombardia, ...) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.UsageDomain</Name>
<BitAddress>21</BitAddress>
<BitWidth>12</BitWidth>
<!-- pool (group of companies having gates) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.SubDomain</Name>
<BitAddress>33</BitAddress>
<BitWidth>7</BitWidth>
<!-- 0 = NotUsed (All gates within usage domain) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Workstation</Name>
<BitAddress>40</BitAddress>
<BitWidth>14</BitWidth>
<!-- unique ID of the workstation (0-2047) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.StartDate</Name>
<BitAddress>54</BitAddress>
<BitWidth>14</BitWidth>
<!-- ticket is valid starting from this date (days since 1/1/2008) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.ExpiryDate</Name>
<BitAddress>68</BitAddress>
<BitWidth>14</BitWidth>
<!-- ticket is valid until this date (days since 1/1/2008), also stored in header (SkiData/Axess compatibilty only) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.StartTime</Name>
<BitAddress>82</BitAddress>
<BitWidth>11</BitWidth>
<!-- ticket is valid from this time (minutes since midnight), only applicable if Root.Unit = Hours/Minutes -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.StartMode</Name>
<BitAddress>93</BitAddress>
<BitWidth>4</BitWidth>
<!-- 1 = ValidFromIssue (directly use Root.StartDate, Root.StartTime, Root.ExpiryDate) -->
<!-- 2 = ValidFromFirstUsage (day pass depot ticket, use Root.DateOfFirstEntry + Root.StartTime/Root.TimeOfFirstEntry [dependent on Root.Unit]; Root.StartDate and Root.ExpiryDate specify absolute limits only) -->
<!-- only applicable if Root.Unit = Days -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Duration</Name>
<BitAddress>97</BitAddress>
<BitWidth>14</BitWidth>
<!-- duration (in days/hours/points) - only used if countable (Days, Hours, Minutes, Years, Month, Points, SingleRides), otherwise set to 1 (Seasons, ...) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TicketType</Name>
<BitAddress>111</BitAddress>
<BitWidth>4</BitWidth>
<!-- 0 = time pass, 1 = consumable (point pass, non-consecutive time pass) -->
<!-- Note: if multiple formats are used, this token can be ommited -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Unit</Name>
<BitAddress>115</BitAddress>
<BitWidth>4</BitWidth>
<!-- unit for Root.Duration (0 = Days, 1 = Reserved, 2 = Reserved, 3 = Points, 4 = SingleRides, 5 = Seasons, 6 = Reserved, 7 = Hours, 8 = Minutes, 9 = Year, 10 = Month) -->
<!-- currently only supported: 0 = Days, 3 = Points, 5 = Seasons, 7 = Hours, 8 = Minutes -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.SerialNumberEx2</Name>
<BitAddress>119</BitAddress>
<BitWidth>32</BitWidth>
<!-- unique serial number of ticket (based on used workstation ID) -->
<!-- Note: no longer dependent on season! (SkiData/Axess compatibilty only) -->
<!-- TODO: in Lombardia replaced by Root.Season (4 bit) + Root.SerialNumberEx (28 bit); needs final confirmation from Alfi -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Restrictions</Name>
<BitAddress>151</BitAddress>
<BitWidth>16</BitWidth>
<!-- 0 = No Restrictions; restriction ID defined on central server (valid season, days, time, ...) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TicketID</Name>
<BitAddress>167</BitAddress>
<BitWidth>32</BitWidth>
<!-- unique ticket/product identifier -->
<!-- has to match with Region, UsageDomain, Duration, Unit, Restriction and UserType -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Price</Name>
<BitAddress>199</BitAddress>
<BitWidth>23</BitWidth>
<!-- tariff in 1/100 Root.Currency units -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.UserID</Name>
<BitAddress>222</BitAddress>
<BitWidth>56</BitWidth>
<!-- unique user ID (this is a bitfield, upper 13 bits contain the region, middle 11 bits contain workstation ID, lower 32 bit contain a local ID) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.UserType</Name>
<BitAddress>278</BitAddress>
<BitWidth>8</BitWidth>
<!-- only used for visualization on gate, e.g. Adult, child, senior, ... -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TargetRegion</Name>
<BitAddress>286</BitAddress>
<BitWidth>5</BitWidth>
<!-- region for interpretation of UsageDomain, TicketID, Restrictions (typically same as Root.Region) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.DateIssued</Name>
<BitAddress>291</BitAddress>
<BitWidth>14</BitWidth>
<!-- date when the ticket has been sold; used for identification of e.g. pre-selling of season passes ... -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TimeIssued</Name>
<BitAddress>305</BitAddress>
<BitWidth>11</BitWidth>
<!-- time when the ticket has been sold; used for identification of e.g. 'gestaffelten Tageskarten' -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.CurrencyCode</Name>
<BitAddress>316</BitAddress>
<BitWidth>15</BitWidth>
<!-- ISO 4217 alphanumeric currency code converted to 3*5 bit numeric value ('A'=0x00, 'B'=0x01, ...) -->
<!-- e.g. 'EUR': 'E' (0x04) + 'U' (0x14) + 'R' (0x11) -> Root.CurrencyCode = 001001010010001b = 0x1291) -->
</TokenAllocation>
<TokenAllocation>
<Name> Root.DaysLimit </Name>
<BitAddress>331</BitAddress>
<BitWidth>9</BitWidth>
<!-- giorni di validità a partire dal primo utilizzo, se 0 nessun limite -->
</TokenAllocation>
<TokenAllocation>
<Name> Root.Insurance </Name>
<BitAddress>340</BitAddress>
<BitWidth>1</BitWidth>
<!-- 0 =non assicurato , 1 assicurato -->
</TokenAllocation>
</FixedArea>
<VariableArea>
<!-- ********* START of VARIABLE AREA ********** -->
<TokenAllocation>
<Name>Root.BlockCRC</Name>
<BitAddress>0</BitAddress>
<BitWidth>16</BitWidth>
<!-- CRC calculated from this token until the next Root.BlockCRC -->
<!-- (CRC calculated from BitAddress 0-63) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Initialized</Name>
<BitAddress>16</BitAddress>
<BitWidth>1</BitWidth>
</TokenAllocation>
<TokenAllocation>
<Name>Root.TicketState</Name>
<BitAddress>17</BitAddress>
<BitWidth>2</BitWidth>
<!-- 0 = Valid, 1 = Cancelled, 2 = Refunded -->
<!-- Note: this value needs to be evaluated by each vendor, even if it is not set by all vendors; gate must only be opened if ticket state is 0! -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.DateOfFirstEntry</Name>
<BitAddress>19</BitAddress>
<BitWidth>14</BitWidth>
<!-- date of first usage (days since 1/1/2008) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.TimeOfFirstEntry</Name>
<BitAddress>33</BitAddress>
<BitWidth>11</BitWidth>
<!-- time of first usage (minutes since midnight) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.Reserved</Name>
<BitAddress>44</BitAddress>
<BitWidth>20</BitWidth>
<!-- padding to match chip block boundary -->
</TokenAllocation>
<!-- ********* START of SHADOW A ********** -->
<TokenAllocation>
<Name>Root.BlockCRCA</Name>
<BitAddress>64</BitAddress>
<BitWidth>6</BitWidth>
<!-- (CRC calculated from BitAddress 64-95) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.CurrentDayA</Name>
<BitAddress>70</BitAddress>
<BitWidth>12</BitWidth>
<!-- last usage of the ticket (days since Root.DateOfFirstEntry) -->
<!-- required field -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.RemainingDurationA</Name>
<BitAddress>82</BitAddress>
<BitWidth>14</BitWidth>
<!-- remaing duration -->
</TokenAllocation>
<!-- ********* PADDING ********** -->
<TokenAllocation>
<Name>Root.BlockCRCP</Name>
<BitAddress>96</BitAddress>
<BitWidth>32</BitWidth>
<!-- dummy entry: used for padding to match chip block boundary (on 64bit chips) -->
<!-- (CRC calculated from BitAddress 96-127) -->
</TokenAllocation>
<!-- ********* START of SHADOW B ********** -->
<TokenAllocation>
<Name>Root.BlockCRCB</Name>
<BitAddress>128</BitAddress>
<BitWidth>6</BitWidth>
<!-- (CRC calculated from BitAddress 128-159) -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.CurrentDayB</Name>
<BitAddress>134</BitAddress>
<BitWidth>12</BitWidth>
<!-- last usage of the ticket (days since Root.DateOfFirstEntry) -->
<!-- required field -->
</TokenAllocation>
<TokenAllocation>
<Name>Root.RemainingDurationB</Name>
<BitAddress>146</BitAddress>
<BitWidth>14</BitWidth>
<!-- remaing duration -->
</TokenAllocation>
</VariableArea>
</FormatDefinition>
Nuovo metodo di calcolo per ticketid:
A seguito della variazione di dimensioni del token Root.UsageDomain si rende necessario ridefinire l’algoritmo di calcolo per la generazione dei blocchi di TicketId preassegnati a ciascun dominio (Root.UsageDomain).
Il metodo di calcolo è il seguente: Root.UsageDomain * 220 + IDD
NB: Massimo valore di IDD = 220-1 = 1.048.575
Assegnando quindi 220 (1.048.576) possibili tipi di biglietto (TicketID) a ciascun dominio anziché i precedenti 223 (8.388.608).