opus.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "opus_lists.h"
  2. #include "../../../metroflip_i.h"
  3. #include "../../metroflip/metroflip_api.h"
  4. #include "../calypso_util.h"
  5. #include "opus_i.h"
  6. const char* get_opus_service_provider(int provider) {
  7. switch(provider) {
  8. case 0x01:
  9. case 0x02:
  10. return "STM";
  11. case 0x03:
  12. return "RTL";
  13. case 0x04:
  14. return "RTM";
  15. case 0x05:
  16. return "RTC";
  17. case 0x06:
  18. return "STL";
  19. case 0x10:
  20. return "STLevis";
  21. case 0x20:
  22. return "Chrono";
  23. default: {
  24. char* provider_str = malloc(10 * sizeof(char));
  25. if(!provider_str) {
  26. return "Unknown";
  27. }
  28. snprintf(provider_str, 10, "0x%02X", provider);
  29. return provider_str;
  30. }
  31. }
  32. }
  33. const char* get_opus_transport_type(int location_id) {
  34. switch(location_id) {
  35. case 0x65:
  36. return "Bus";
  37. case 0xc9:
  38. return "Metro";
  39. default: {
  40. char* location_str = malloc(9 * sizeof(char));
  41. if(!location_str) {
  42. return "Unknown";
  43. }
  44. snprintf(location_str, 9, "0x%02X", location_id);
  45. return location_str;
  46. }
  47. }
  48. }
  49. const char* get_opus_transport_line(int route_number) {
  50. if(OPUS_LINES_LIST[route_number]) {
  51. return OPUS_LINES_LIST[route_number];
  52. } else {
  53. // Return hex
  54. char* route_str = malloc(9 * sizeof(char));
  55. if(!route_str) {
  56. return "Unknown";
  57. }
  58. snprintf(route_str, 9, "0x%02X", route_number);
  59. return route_str;
  60. }
  61. }
  62. const char* get_opus_tariff(int tariff) {
  63. switch(tariff) {
  64. case 0xb1:
  65. return "Monthly";
  66. case 0xb2:
  67. case 0xc9:
  68. return "Weekly";
  69. case 0x1c7:
  70. return "Single Trips";
  71. case 0xa34:
  72. return "Monthly Student";
  73. case 0xa3e:
  74. return "Weekly";
  75. default: {
  76. char* tariff_str = malloc(9 * sizeof(char));
  77. if(!tariff_str) {
  78. return "Unknown";
  79. }
  80. snprintf(tariff_str, 9, "0x%02X", tariff);
  81. return tariff_str;
  82. }
  83. }
  84. }
  85. void show_opus_event_info(
  86. OpusCardEvent* event,
  87. OpusCardContract* contracts,
  88. FuriString* parsed_data) {
  89. UNUSED(contracts);
  90. furi_string_cat_printf(
  91. parsed_data,
  92. "%s %s\n",
  93. get_opus_transport_type(event->location_id),
  94. get_opus_transport_line(event->route_number));
  95. furi_string_cat_printf(
  96. parsed_data, "Transporter: %s\n", get_opus_service_provider(event->service_provider));
  97. furi_string_cat_printf(parsed_data, "Result: %d\n", event->result);
  98. furi_string_cat_printf(
  99. parsed_data,
  100. "Contract: %d - %s\n",
  101. event->used_contract,
  102. get_opus_tariff(contracts[event->used_contract - 1].tariff));
  103. furi_string_cat_printf(parsed_data, "Simulation: %s\n", event->simulation ? "true" : "false");
  104. furi_string_cat_printf(parsed_data, "Date: ");
  105. locale_format_datetime_cat(parsed_data, &event->date, true);
  106. furi_string_cat_printf(parsed_data, "\nFirst stamp: ");
  107. locale_format_datetime_cat(parsed_data, &event->first_stamp_date, true);
  108. furi_string_cat_printf(parsed_data, "\n");
  109. }
  110. void show_opus_contract_info(OpusCardContract* contract, FuriString* parsed_data) {
  111. furi_string_cat_printf(parsed_data, "Type: %s\n", get_opus_tariff(contract->tariff));
  112. furi_string_cat_printf(
  113. parsed_data, "Provider: %s\n", get_opus_service_provider(contract->provider));
  114. furi_string_cat_printf(parsed_data, "Valid from: ");
  115. locale_format_datetime_cat(parsed_data, &contract->start_date, false);
  116. furi_string_cat_printf(parsed_data, "\nto: ");
  117. locale_format_datetime_cat(parsed_data, &contract->end_date, false);
  118. furi_string_cat_printf(parsed_data, "\nSold on: ");
  119. locale_format_datetime_cat(parsed_data, &contract->sale_date, true);
  120. furi_string_cat_printf(
  121. parsed_data, "\nSales Agent: %s\n", get_opus_service_provider(contract->sale_agent));
  122. if(contract->inhibition) {
  123. furi_string_cat_printf(parsed_data, "Contract inhibited\n");
  124. }
  125. furi_string_cat_printf(parsed_data, "Used: %s\n", contract->used ? "true" : "false");
  126. }
  127. void show_opus_environment_info(
  128. OpusCardEnv* environment,
  129. OpusCardHolder* holder,
  130. FuriString* parsed_data) {
  131. furi_string_cat_printf(parsed_data, "App Version: %d\n", environment->app_version);
  132. furi_string_cat_printf(
  133. parsed_data, "Country: %s\n", get_country_string(environment->country_num));
  134. furi_string_cat_printf(
  135. parsed_data,
  136. "Network: %s\n",
  137. get_network_string(guess_card_type(environment->country_num, environment->network_num)));
  138. furi_string_cat_printf(parsed_data, "End of validity:\n");
  139. locale_format_datetime_cat(parsed_data, &environment->end_dt, false);
  140. furi_string_cat_printf(parsed_data, "\nIssuer: %d\n", environment->issuer_id);
  141. furi_string_cat_printf(
  142. parsed_data, "Card status: %s\n", environment->card_status ? "true" : "false");
  143. furi_string_cat_printf(
  144. parsed_data,
  145. "Card utilisation: %s\n",
  146. environment->card_utilisation ? "Used" : "Not used");
  147. furi_string_cat_printf(parsed_data, "Holder birth date: ");
  148. locale_format_datetime_cat(parsed_data, &holder->birth_date, false);
  149. furi_string_cat_printf(parsed_data, "\n");
  150. }