Przeglądaj źródła

More intercode parsing + set calypso first page to card environment

DocSystem 11 miesięcy temu
rodzic
commit
5aa8b0202f

+ 72 - 0
api/calypso/cards/intercode.c

@@ -581,6 +581,8 @@ const char* get_intercode_string_transition_type(int transition) {
         return "Entry (First validation)";
     case 0x2:
         return "Exit";
+    case 0x3:
+        return "Validation";
     case 0x4:
         return "Inspection";
     case 0x5:
@@ -637,3 +639,73 @@ const char* get_intercode_string_event_result(int result) {
     }
     }
 }
+
+const char* get_intercode_string_version(int version) {
+    // version is a 6 bits int
+    // if the first 3 bits are 000, it's a 1.x version
+    // if the first 3 bits are 001, it's a 2.x version
+    // else, it's unknown
+    int major = (version >> 3) & 0x07;
+    if(major == 0) {
+        return "Intercode I";
+    } else if(major == 1) {
+        return "Intercode II";
+    }
+    return "Unknown";
+}
+
+int get_intercode_string_subversion(int version) {
+    // subversion is a 3 bits int
+    return version & 0x07;
+}
+
+const char* get_intercode_string_holder_type(int card_status) {
+    // b3 -> RFU
+    // b2 -> linked to an organization
+    // b1..b0 -> personalization status (0: anonymous, 1: identified, 2: personalized, 3: networkSpecific)
+    int status = card_status & 0x03;
+    switch(status) {
+    case 0:
+        return "Anonymous";
+    case 1:
+        return "Identified";
+    case 2:
+        return "Personalized";
+    case 3:
+        return "Network Specific";
+    default:
+        return "Unknown";
+    }
+}
+
+bool is_intercode_string_holder_linked(int card_status) {
+    // b3 -> RFU
+    // b2 -> linked to an organization
+    // b1..b0 -> personalization status (0: anonymous, 1: identified, 2: personalized, 3: networkSpecific)
+    return card_status & 0x04;
+}
+
+const char* get_intercode_string_contract_status(int status) {
+    switch(status) {
+    case 0x0:
+        return "Valid (never used)";
+    case 0x1:
+        return "Valid (used)";
+    case 0x3:
+        return "Renewal required";
+    case 0xD:
+        return "Not validable";
+    case 0x13:
+        return "Blocked";
+    case 0x3F:
+        return "Suspended";
+    case 0x58:
+        return "Invalid";
+    case 0x7F:
+        return "Refunded";
+    case 0xFF:
+        return "Erasable";
+    default:
+        return "Unknown";
+    }
+}

+ 10 - 0
api/calypso/cards/intercode.h

@@ -15,6 +15,16 @@ const char* get_intercode_string_transition_type(int transition);
 
 const char* get_intercode_string_event_result(int result);
 
+const char* get_intercode_string_version(int version);
+
+int get_intercode_string_subversion(int version);
+
+const char* get_intercode_string_holder_type(int card_status);
+
+bool is_intercode_string_holder_linked(int card_status);
+
+const char* get_intercode_string_contract_status(int status);
+
 typedef enum {
     URBAN_BUS = 1,
     INTERURBAN_BUS = 2,

+ 13 - 27
api/calypso/transit/navigo.c

@@ -192,25 +192,6 @@ const char* get_zones(int* zones) {
     }
 }
 
-const char* get_intercode_version(int version) {
-    // version is a 6 bits int
-    // if the first 3 bits are 000, it's a 1.x version
-    // if the first 3 bits are 001, it's a 2.x version
-    // else, it's unknown
-    int major = (version >> 3) & 0x07;
-    if(major == 0) {
-        return "Intercode I";
-    } else if(major == 1) {
-        return "Intercode II";
-    }
-    return "Unknown";
-}
-
-int get_intercode_subversion(int version) {
-    // subversion is a 3 bits int
-    return version & 0x07;
-}
-
 char* get_token(char* psrc, const char* delimit, void* psave) {
     static char sret[512];
     register char* ptr = psave;
@@ -625,20 +606,25 @@ void show_navigo_contract_info(NavigoCardContract* contract, FuriString* parsed_
     furi_string_cat_printf(
         parsed_data, "Sales Agent: %s\n", get_navigo_service_provider(contract->sale_agent));
     furi_string_cat_printf(parsed_data, "Sales Terminal: %d\n", contract->sale_device);
-    if(contract->status == 1) {
-        furi_string_cat_printf(parsed_data, "Status: OK\n");
-    } else {
-        furi_string_cat_printf(parsed_data, "Status: Unknown (%d)\n", contract->status);
-    }
+    furi_string_cat_printf(
+        parsed_data, "Status: %s\n", get_intercode_string_contract_status(contract->status));
     furi_string_cat_printf(parsed_data, "Authenticity Code: %d\n", contract->authenticator);
 }
 
-void show_navigo_environment_info(NavigoCardEnv* environment, FuriString* parsed_data) {
+void show_navigo_environment_info(
+    NavigoCardEnv* environment,
+    NavigoCardHolder* holder,
+    FuriString* parsed_data) {
+    furi_string_cat_printf(
+        parsed_data, "Card status: %s\n", get_intercode_string_holder_type(holder->card_status));
+    if(is_intercode_string_holder_linked(holder->card_status)) {
+        furi_string_cat_printf(parsed_data, "Linked to an organization\n");
+    }
     furi_string_cat_printf(
         parsed_data,
         "App Version: %s - v%d\n",
-        get_intercode_version(environment->app_version),
-        get_intercode_subversion(environment->app_version));
+        get_intercode_string_version(environment->app_version),
+        get_intercode_string_subversion(environment->app_version));
     furi_string_cat_printf(
         parsed_data, "Country: %s\n", get_country_string(environment->country_num));
     furi_string_cat_printf(

+ 4 - 1
api/calypso/transit/navigo.h

@@ -31,7 +31,10 @@ void show_navigo_special_event_info(NavigoCardSpecialEvent* event, FuriString* p
 
 void show_navigo_contract_info(NavigoCardContract* contract, FuriString* parsed_data);
 
-void show_navigo_environment_info(NavigoCardEnv* environment, FuriString* parsed_data);
+void show_navigo_environment_info(
+    NavigoCardEnv* environment,
+    NavigoCardHolder* holder,
+    FuriString* parsed_data);
 
 typedef enum {
     NAVIGO_EASY = 0,

+ 18 - 20
scenes/metroflip_scene_calypso.c

@@ -107,22 +107,19 @@ void update_page_info(void* context, FuriString* parsed_data) {
             ctx->card->card_number);
         return;
     }
-    if(ctx->page_id == 0 || ctx->page_id == 1 || ctx->page_id == 2 || ctx->page_id == 3) {
+    if(ctx->page_id == 0) {
         switch(ctx->card->card_type) {
         case CALYPSO_CARD_NAVIGO: {
-            furi_string_cat_printf(
-                parsed_data,
-                "\e#%s %u:\n",
-                get_navigo_type(ctx->card->navigo->holder.card_status),
-                ctx->card->card_number);
-            furi_string_cat_printf(parsed_data, "\e#Contract %d:\n", ctx->page_id + 1);
-            show_navigo_contract_info(&ctx->card->navigo->contracts[ctx->page_id], parsed_data);
+            furi_string_cat_printf(parsed_data, "\e#Navigo %u:\n", ctx->card->card_number);
+            furi_string_cat_printf(parsed_data, "\e#Environment:\n");
+            show_navigo_environment_info(
+                &ctx->card->navigo->environment, &ctx->card->navigo->holder, parsed_data);
             break;
         }
         case CALYPSO_CARD_OPUS: {
             furi_string_cat_printf(parsed_data, "\e#Opus %u:\n", ctx->card->card_number);
-            furi_string_cat_printf(parsed_data, "\e#Contract %d:\n", ctx->page_id + 1);
-            show_opus_contract_info(&ctx->card->opus->contracts[ctx->page_id], parsed_data);
+            furi_string_cat_printf(parsed_data, "\e#Environment:\n");
+            show_opus_environment_info(&ctx->card->opus->environment, parsed_data);
             break;
         }
         default: {
@@ -130,15 +127,16 @@ void update_page_info(void* context, FuriString* parsed_data) {
             break;
         }
         }
-    } else if(ctx->page_id == 4) {
-        furi_string_cat_printf(parsed_data, "\e#Environment:\n");
+    } else if(ctx->page_id == 1 || ctx->page_id == 2 || ctx->page_id == 3 || ctx->page_id == 4) {
+        furi_string_cat_printf(parsed_data, "\e#Contract %d:\n", ctx->page_id);
         switch(ctx->card->card_type) {
         case CALYPSO_CARD_NAVIGO: {
-            show_navigo_environment_info(&ctx->card->navigo->environment, parsed_data);
+            show_navigo_contract_info(
+                &ctx->card->navigo->contracts[ctx->page_id - 1], parsed_data);
             break;
         }
         case CALYPSO_CARD_OPUS: {
-            show_opus_environment_info(&ctx->card->opus->environment, parsed_data);
+            show_opus_contract_info(&ctx->card->opus->contracts[ctx->page_id - 1], parsed_data);
             break;
         }
         default: {
@@ -234,13 +232,13 @@ void metroflip_back_button_widget_callback(GuiButtonType result, InputType type,
             if(ctx->page_id == 6 && ctx->card->events_count < 1) {
                 ctx->page_id -= 1;
             }
-            if(ctx->page_id == 4 && ctx->card->contracts_count < 4) {
+            if(ctx->page_id == 5 && ctx->card->contracts_count < 4) {
                 ctx->page_id -= 1;
             }
-            if(ctx->page_id == 3 && ctx->card->contracts_count < 3) {
+            if(ctx->page_id == 4 && ctx->card->contracts_count < 3) {
                 ctx->page_id -= 1;
             }
-            if(ctx->page_id == 2 && ctx->card->contracts_count < 2) {
+            if(ctx->page_id == 3 && ctx->card->contracts_count < 2) {
                 ctx->page_id -= 1;
             }
             ctx->page_id -= 1;
@@ -285,13 +283,13 @@ void metroflip_next_button_widget_callback(GuiButtonType result, InputType type,
             return;
         }
         if(ctx->page_id < 10) {
-            if(ctx->page_id == 0 && ctx->card->contracts_count < 2) {
+            if(ctx->page_id == 1 && ctx->card->contracts_count < 2) {
                 ctx->page_id += 1;
             }
-            if(ctx->page_id == 1 && ctx->card->contracts_count < 3) {
+            if(ctx->page_id == 2 && ctx->card->contracts_count < 3) {
                 ctx->page_id += 1;
             }
-            if(ctx->page_id == 2 && ctx->card->contracts_count < 4) {
+            if(ctx->page_id == 3 && ctx->card->contracts_count < 4) {
                 ctx->page_id += 1;
             }
             if(ctx->page_id == 4 && ctx->card->events_count < 1) {