Przeglądaj źródła

Update counter parsing

DocSystem 11 miesięcy temu
rodzic
commit
e670a9efab

+ 5 - 4
api/calypso/transit/navigo.c

@@ -591,19 +591,20 @@ void show_navigo_special_event_info(NavigoCardSpecialEvent* event, FuriString* p
 
 void show_navigo_contract_info(NavigoCardContract* contract, FuriString* parsed_data) {
     furi_string_cat_printf(parsed_data, "Type: %s\n", get_navigo_tariff(contract->tariff));
-    if(is_ticket_count_available(contract->tariff)) {
+    if(contract->counter_present) {
         furi_string_cat_printf(parsed_data, "Remaining Tickets: %d\n", contract->counter.count);
+        furi_string_cat_printf(parsed_data, "Last load: %d\n", contract->counter.last_load);
     }
     if(contract->serial_number_available) {
         furi_string_cat_printf(parsed_data, "TCN Number: %d\n", contract->serial_number);
     }
+    if(contract->price_amount_available) {
+        furi_string_cat_printf(parsed_data, "Amount: %.2f EUR\n", contract->price_amount);
+    }
     if(contract->pay_method_available) {
         furi_string_cat_printf(
             parsed_data, "Payment Method: %s\n", get_pay_method(contract->pay_method));
     }
-    if(contract->price_amount_available) {
-        furi_string_cat_printf(parsed_data, "Amount: %.2f EUR\n", contract->price_amount);
-    }
     if(contract->end_date_available) {
         furi_string_cat_printf(parsed_data, "Valid\nfrom: ");
         locale_format_datetime_cat(parsed_data, &contract->start_date, false);

+ 2 - 0
api/calypso/transit/navigo_i.h

@@ -59,6 +59,7 @@ typedef struct {
     int count;
     int relative_first_stamp_15mn;
     int struct_number;
+    int last_load;
 } NavigoCardContractCounter;
 
 typedef struct {
@@ -80,6 +81,7 @@ typedef struct {
     int status;
     int authenticator;
     NavigoCardContractCounter counter;
+    bool counter_present;
     bool present;
 } NavigoCardContract;
 

+ 27 - 1
scenes/metroflip_scene_calypso.c

@@ -710,7 +710,27 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
                             card->navigo->contracts[i - 1].zones_available = true;
                         }
 
-                        // 13.7. ContractValidityJourneys  -- pas sûr de le mettre lui
+                        // 13.7. ContractValidityJourneys
+                        contract_key = "ContractValidityJourneys";
+                        if(is_calypso_node_present(
+                               bit_representation, contract_key, IntercodeContractStructure)) {
+                            int positionOffset = get_calypso_node_offset(
+                                bit_representation, contract_key, IntercodeContractStructure);
+                            int start = positionOffset,
+                                end = positionOffset +
+                                      get_calypso_node_size(
+                                          contract_key, IntercodeContractStructure) -
+                                      1;
+                            int decimal_value = bit_slice_to_dec(bit_representation, start, end);
+                            // first 5 bits -> CounterStructureNumber
+                            // last 8 bits -> CounterLastLoad
+                            // other bits -> RFU
+                            card->navigo->contracts[i - 1].counter.struct_number = decimal_value >>
+                                                                                   11;
+                            card->navigo->contracts[i - 1].counter.last_load = decimal_value &
+                                                                               0xFF;
+                            card->navigo->contracts[i - 1].counter_present = true;
+                        }
 
                         // 15.0. ContractValiditySaleDate
                         contract_key = "ContractValiditySaleDate";
@@ -830,6 +850,12 @@ static NfcCommand metroflip_scene_navigo_poller_callback(NfcGenericEvent event,
 
                     // Ticket counts (contracts 1-4)
                     for(int i = 0; i < 4; i++) {
+                        if(card->navigo->contracts[i].present == 0) {
+                            continue;
+                        }
+                        if(card->navigo->contracts[i].counter_present == 0) {
+                            continue;
+                        }
                         start = 0;
                         end = 5;
                         card->navigo->contracts[i].counter.count = bit_slice_to_dec(