ravkav.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. if(contract->balance != 0.0f) {
  22. furi_string_cat_printf(parsed_data, "Balance: %.2f ILS\n", (double)contract->balance);
  23. }
  24. furi_string_cat_printf(parsed_data, "Valid from: ");
  25. locale_format_datetime_cat(parsed_data, &contract->start_date, false);
  26. if(contract->end_date_available) {
  27. furi_string_cat_printf(parsed_data, "\nto: ");
  28. locale_format_datetime_cat(parsed_data, &contract->end_date, false);
  29. }
  30. furi_string_cat_printf(parsed_data, "\n");
  31. // Issuer information
  32. furi_string_cat_printf(parsed_data, "Issuer: %s\n", get_ravkav_issuer(contract->provider));
  33. // Sale details
  34. furi_string_cat_printf(parsed_data, "Sold on: ");
  35. locale_format_datetime_cat(parsed_data, &contract->sale_date, false);
  36. furi_string_cat_printf(parsed_data, "\nSale device: %d\n", contract->sale_device);
  37. furi_string_cat_printf(parsed_data, "Sale number: %d\n", contract->sale_number);
  38. // Restriction details
  39. if(contract->restrict_code_available) {
  40. furi_string_cat_printf(parsed_data, "Restriction code: %d\n", contract->restrict_code);
  41. }
  42. if(contract->restrict_duration_available) {
  43. furi_string_cat_printf(
  44. parsed_data, "Restriction duration: \n%d minutes\n", contract->restrict_duration);
  45. }
  46. // Additional metadata
  47. furi_string_cat_printf(parsed_data, "Contract version: %d\n", contract->version);
  48. furi_string_cat_printf(parsed_data, "Journey interchanges flag: %d\n", contract->interchange);
  49. }
  50. void show_ravkav_environment_info(RavKavCardEnv* environment, FuriString* parsed_data) {
  51. // Validity information
  52. furi_string_cat_printf(parsed_data, "End of validity:\n");
  53. locale_format_datetime_cat(parsed_data, &environment->end_dt, false);
  54. furi_string_cat_printf(parsed_data, "\n");
  55. // Issue date
  56. furi_string_cat_printf(parsed_data, "Issue date:\n");
  57. locale_format_datetime_cat(parsed_data, &environment->issue_dt, false);
  58. furi_string_cat_printf(parsed_data, "\n");
  59. // Application details
  60. furi_string_cat_printf(parsed_data, "App version: %d\n", environment->app_version);
  61. furi_string_cat_printf(parsed_data, "App number: %d\n", environment->app_num);
  62. // Payment and network details
  63. furi_string_cat_printf(parsed_data, "Pay method: %d\n", environment->pay_method);
  64. }
  65. void show_ravkav_event_info(RavKavCardEvent* event, FuriString* parsed_data) {
  66. // Essential details first
  67. if(event->location_id_available) {
  68. furi_string_cat_printf(parsed_data, "Location:\n%d\n", event->location_id);
  69. }
  70. furi_string_cat_printf(parsed_data, "Time:\n");
  71. locale_format_datetime_cat(parsed_data, &event->time, true);
  72. furi_string_cat_printf(parsed_data, "\n");
  73. furi_string_cat_printf(parsed_data, "Service provider: %d\n", event->service_provider);
  74. // Fare and route-related information
  75. if(event->fare_code_available) {
  76. furi_string_cat_printf(parsed_data, "Fare Code: %d\n", event->fare_code);
  77. }
  78. if(event->route_number_available) {
  79. furi_string_cat_printf(parsed_data, "Route Number: %d\n", event->route_number);
  80. }
  81. if(event->debit_amount_available) {
  82. furi_string_cat_printf(parsed_data, "Debit Amount: %.2f\n", (double)event->debit_amount);
  83. }
  84. if(event->stop_en_route_available) {
  85. furi_string_cat_printf(parsed_data, "Stop en Route: %d\n", event->stop_en_route);
  86. }
  87. // Remaining event metadata
  88. furi_string_cat_printf(parsed_data, "Area ID: %d\n", event->area_id);
  89. furi_string_cat_printf(parsed_data, "Contract ID: %d\n", event->contract_id);
  90. furi_string_cat_printf(parsed_data, "Event Type: %d\n", event->type);
  91. furi_string_cat_printf(parsed_data, "Event Interchange Flag: %d\n", event->interchange_flag);
  92. }