ravkav.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "ravkav_lists.h"
  2. #include "../../../metroflip_i.h"
  3. #include "../../metroflip/metroflip_api.h"
  4. #include "../calypso_util.h"
  5. #include "ravkav_i.h"
  6. const char* get_ravkav_issuer(int issuer) {
  7. if(RAVKAV_ISSUERS_LIST[issuer]) {
  8. return RAVKAV_ISSUERS_LIST[issuer];
  9. } else {
  10. // Return hex
  11. char* issuer_str = malloc(9 * sizeof(char));
  12. if(!issuer_str) {
  13. return "Unknown";
  14. }
  15. snprintf(issuer_str, 9, "0x%02X", issuer);
  16. return issuer_str;
  17. }
  18. }
  19. void show_ravkav_contract_info(RavKavCardContract* contract, FuriString* parsed_data) {
  20. // Core contract validity period
  21. furi_string_cat_printf(parsed_data, "Valid from: ");
  22. locale_format_datetime_cat(parsed_data, &contract->start_date, false);
  23. if(contract->end_date_available) {
  24. furi_string_cat_printf(parsed_data, "\nto: ");
  25. locale_format_datetime_cat(parsed_data, &contract->end_date, false);
  26. }
  27. furi_string_cat_printf(parsed_data, "\n");
  28. // Issuer information
  29. furi_string_cat_printf(parsed_data, "Issuer: %s\n", get_ravkav_issuer(contract->provider));
  30. // Sale details
  31. furi_string_cat_printf(parsed_data, "Sold on: ");
  32. locale_format_datetime_cat(parsed_data, &contract->sale_date, false);
  33. furi_string_cat_printf(parsed_data, "\nSale device: %d\n", contract->sale_device);
  34. furi_string_cat_printf(parsed_data, "Sale number: %d\n", contract->sale_number);
  35. // Restriction details
  36. if(contract->restrict_code_available) {
  37. furi_string_cat_printf(parsed_data, "Restriction code: %d\n", contract->restrict_code);
  38. }
  39. if(contract->restrict_duration_available) {
  40. furi_string_cat_printf(
  41. parsed_data, "Restriction duration: \n%d minutes\n", contract->restrict_duration);
  42. }
  43. // Additional metadata
  44. furi_string_cat_printf(parsed_data, "Contract version: %d\n", contract->version);
  45. furi_string_cat_printf(parsed_data, "Journey interchanges flag: %d\n", contract->interchange);
  46. }
  47. void show_ravkav_environment_info(RavKavCardEnv* environment, FuriString* parsed_data) {
  48. // Validity information
  49. furi_string_cat_printf(parsed_data, "End of validity:\n");
  50. locale_format_datetime_cat(parsed_data, &environment->end_dt, false);
  51. furi_string_cat_printf(parsed_data, "\n");
  52. // Issue date
  53. furi_string_cat_printf(parsed_data, "Issue date:\n");
  54. locale_format_datetime_cat(parsed_data, &environment->issue_dt, false);
  55. furi_string_cat_printf(parsed_data, "\n");
  56. // Application details
  57. furi_string_cat_printf(parsed_data, "App version: %d\n", environment->app_version);
  58. furi_string_cat_printf(parsed_data, "App number: %d\n", environment->app_num);
  59. // Payment and network details
  60. furi_string_cat_printf(parsed_data, "Pay method: %d\n", environment->pay_method);
  61. }
  62. void show_ravkav_event_info(RavKavCardEvent* event, FuriString* parsed_data) {
  63. // Essential details first
  64. if(event->location_id_available) {
  65. furi_string_cat_printf(parsed_data, "Location:\n%d\n", event->location_id);
  66. }
  67. furi_string_cat_printf(parsed_data, "Time:\n");
  68. locale_format_datetime_cat(parsed_data, &event->time, true);
  69. furi_string_cat_printf(parsed_data, "\n");
  70. furi_string_cat_printf(parsed_data, "Service provider: %d\n", event->service_provider);
  71. // Fare and route-related information
  72. if(event->fare_code_available) {
  73. furi_string_cat_printf(parsed_data, "Fare Code: %d\n", event->fare_code);
  74. }
  75. if(event->route_number_available) {
  76. furi_string_cat_printf(parsed_data, "Route Number: %d\n", event->route_number);
  77. }
  78. if(event->debit_amount_available) {
  79. furi_string_cat_printf(parsed_data, "Debit Amount: %.2f\n", (double)event->debit_amount);
  80. }
  81. if(event->stop_en_route_available) {
  82. furi_string_cat_printf(parsed_data, "Stop en Route: %d\n", event->stop_en_route);
  83. }
  84. // Remaining event metadata
  85. furi_string_cat_printf(parsed_data, "Area ID: %d\n", event->area_id);
  86. furi_string_cat_printf(parsed_data, "Contract ID: %d\n", event->contract_id);
  87. furi_string_cat_printf(parsed_data, "Event Type: %d\n", event->type);
  88. furi_string_cat_printf(parsed_data, "Event Interchange Flag: %d\n", event->interchange_flag);
  89. }