Skip to content

Commit

Permalink
Merge pull request #33 from DocSystem/dev
Browse files Browse the repository at this point in the history
  • Loading branch information
luu176 authored Jan 25, 2025
2 parents 55fa8a5 + 5aa8b02 commit 6e77a42
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 48 deletions.
72 changes: 72 additions & 0 deletions api/calypso/cards/intercode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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 changes: 10 additions & 0 deletions api/calypso/cards/intercode.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
40 changes: 13 additions & 27 deletions api/calypso/transit/navigo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(
Expand Down
5 changes: 4 additions & 1 deletion api/calypso/transit/navigo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
38 changes: 18 additions & 20 deletions scenes/metroflip_scene_calypso.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,38 +107,36 @@ 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: {
furi_string_cat_printf(parsed_data, "\e#Unknown %u:\n", ctx->card->card_number);
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: {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 6e77a42

Please sign in to comment.