Browse Source

Merge pull request #48 from zinongli/add_yurikamome

Luu 10 months ago
parent
commit
314cecdd4d

+ 3 - 1
README.md

@@ -79,7 +79,8 @@ This is a list of metro cards and transit systems that need support or have part
 | **Opal**           | 🇦🇺 Sydney (and surrounds), NSW, Australia  | Mifare DESFire    |
 | **Opus**           | 🇨🇦 Montreal, QC, Canada                    | Calypso           |
 | **Rav-Kav**        | 🇮🇱 Israel                                  | Calypso           |
-| **SmartRider**     | :australia: Western Australia, Australia   | Mifare Classic    |
+| **SmartRider**     | 🇦🇺 Western Australia, Australia            | Mifare Classic    |
+| **Suica**          | 🇯🇵 Japan                                   | Felica            |
 | **Troika**         | 🇷🇺 Moscow, Russia                          | Mifare Classic    |
 
 
@@ -98,6 +99,7 @@ This is a list of metro cards and transit systems that need support or have part
 - **Myki Parser**: [@gornekich](https://github.com/gornekich)
 - **Opal Parser**: [@gornekich](https://github.com/gornekich)
 - **ITSO Parser**: [@gsp8181](https://github.com/gsp8181), [@hedger](https://github.com/hedger), [@gornekich](https://github.com/gornekich)
+- **Suica Parser & UI**: [@zinongli](https://github.com/zinongli)
 - **Info Slaves**: [@equipter](https://github.com/equipter), [TheDingo8MyBaby](https://github.com/TheDingo8MyBaby)
 
 ---

+ 2 - 0
api/metroflip/metroflip_api.h

@@ -230,6 +230,8 @@ extern const Icon I_Suica_VendingThankYou;
 extern const Icon I_Suica_YenKanji;
 extern const Icon I_Suica_YenSign;
 extern const Icon I_Suica_YurakuchoY;
+extern const Icon I_Suica_YurikamomeLogo;
+extern const Icon I_Suica_YurikamomeU;
 extern const Icon I_Suica_CardIcon;
 extern const Icon I_Suica_ShopIcon;
 extern const Icon I_Suica_VendingIcon;

+ 2 - 0
api/metroflip/metroflip_api_table_i.h

@@ -158,6 +158,8 @@ static constexpr auto metroflip_api_table = sort(create_array_t<sym_entry>(
     API_VARIABLE(I_Suica_YenKanji, Icon),
     API_VARIABLE(I_Suica_YenSign, Icon),
     API_VARIABLE(I_Suica_YurakuchoY, Icon),
+    API_VARIABLE(I_Suica_YurikamomeLogo, Icon),
+    API_VARIABLE(I_Suica_YurikamomeU, Icon),
     API_VARIABLE(I_Suica_CardIcon, Icon),
     API_VARIABLE(I_Suica_ShopIcon, Icon),
     API_VARIABLE(I_Suica_VendingIcon, Icon),

+ 2 - 1
api/suica/suica_assets.h

@@ -5,7 +5,7 @@
 #include "suica_structs_i.h"
 
 
-#define SUICA_RAILWAY_NUM 24 // Don't count Unknown
+#define SUICA_RAILWAY_NUM 25 // Don't count Unknown
 
 #define SUICA_RAILWAY_UNKNOWN_NAME "Unknown"
 // Railway
@@ -21,6 +21,7 @@ static const Railway RailwaysList[] = {
 
     // Tokyo Waterfront Area Rapid Transit TWR
     {0x82, {0, 0}, "Rinkai", 8, SuicaTWR, "R", &I_Suica_RinkaiR},
+    {0x82, {0, 0}, "Yurikamome", 16, SuicaYurikamome, "U", &I_Suica_YurikamomeU},
 
     // Tokyo Monorail
     {0xFA, {0, 0}, "Tokyo Monorail", 11, SuicaTokyoMonorail, "MO", 0},

+ 29 - 3
api/suica/suica_drawings.h

@@ -7,8 +7,6 @@
 
 #include <lib/nfc/protocols/felica/felica.h>
 #include <lib/nfc/protocols/felica/felica_poller.h>
-#include <lib/nfc/protocols/felica/felica_poller_i.h>
-#include <lib/nfc/helpers/felica_crc.h>
 #include <lib/bit_lib/bit_lib.h>
 
 #define SUICA_STATION_LIST_PATH         APP_ASSETS_PATH("suica/line_")
@@ -62,6 +60,9 @@ static void suica_draw_train_page_1(
     case SuicaTWR:
         canvas_draw_icon(canvas, 0, 12, &I_Suica_TWRLogo);
         break;
+    case SuicaYurikamome:
+        canvas_draw_icon(canvas, 0, 12, &I_Suica_YurikamomeLogo);
+        break;
     case SuicaTokyoMonorail:
         canvas_draw_icon(canvas, 0, 11, &I_Suica_TokyoMonorailLogo);
         break;
@@ -102,6 +103,9 @@ static void suica_draw_train_page_1(
         case SuicaTWR:
             canvas_draw_icon(canvas, 0, 40, &I_Suica_TWRLogo);
             break;
+        case SuicaYurikamome:
+            canvas_draw_icon(canvas, 0, 40, &I_Suica_YurikamomeLogo);
+            break;
         case SuicaTokyoMonorail:
             canvas_draw_icon(canvas, 0, 39, &I_Suica_TokyoMonorailLogo);
             break;
@@ -253,6 +257,17 @@ static void
         canvas_draw_str(canvas, 13, 53, furi_string_get_cstr(buffer));
         canvas_set_color(canvas, ColorBlack);
         break;
+    case SuicaYurikamome:
+        canvas_draw_circle(canvas, 24, 38, 24);
+        canvas_draw_disc(canvas, 24, 38, 21);
+
+        canvas_set_color(canvas, ColorWhite);
+        canvas_draw_icon(canvas, 20, 22, history.entry_line.logo_icon);
+        canvas_set_font(canvas, FontBigNumbers);
+        furi_string_printf(buffer, "%02d", history.entry_station.station_number);
+        canvas_draw_str(canvas, 14, 53, furi_string_get_cstr(buffer));
+        canvas_set_color(canvas, ColorBlack);
+        break;
     case SuicaRailwayTypeMax:
         canvas_draw_circle(canvas, 24, 38, 24);
         canvas_draw_circle(canvas, 24, 38, 19);
@@ -351,6 +366,17 @@ static void
         canvas_draw_str(canvas, 92, 53, furi_string_get_cstr(buffer));
         canvas_set_color(canvas, ColorBlack);
         break;
+    case SuicaYurikamome:
+        canvas_draw_circle(canvas, 103, 38, 24);
+        canvas_draw_disc(canvas, 103, 38, 21);
+
+        canvas_set_color(canvas, ColorWhite);
+        canvas_draw_icon(canvas, 99, 22, history.exit_line.logo_icon);
+        canvas_set_font(canvas, FontBigNumbers);
+        furi_string_printf(buffer, "%02d", history.exit_station.station_number);
+        canvas_draw_str(canvas, 93, 53, furi_string_get_cstr(buffer));
+        canvas_set_color(canvas, ColorBlack);
+        break;
     case SuicaRailwayTypeMax:
         canvas_draw_circle(canvas, 103, 38, 24);
         canvas_draw_circle(canvas, 103, 38, 19);
@@ -944,7 +970,7 @@ static void suica_history_draw_callback(Canvas* canvas, void* model) {
     furi_string_free(buffer);
 }
 
-static void suica_view_history_timer_callback(void* context) { 
+static void suica_view_history_timer_callback(void* context) {
     Metroflip* app = (Metroflip*)context;
     view_dispatcher_send_custom_event(app->view_dispatcher, 0);
 }

+ 1 - 0
api/suica/suica_structs_i.h

@@ -9,6 +9,7 @@ typedef enum {
     SuicaJR,
     SuicaMobile,
     SuicaTWR,
+    SuicaYurikamome,
     SuicaTokyoMonorail,
     SuicaRailwayTypeMax,
 } SuicaRailwayCompany;

+ 1 - 1
example_file/suica_example.nfc

@@ -7,7 +7,7 @@ Travel 00: C8 46 00 00 31 55 85 63 0E B8 00 00 00 00 07 00
 Travel 01: C7 46 00 00 31 55 67 4B EE A9 8C 00 00 00 06 00
 Travel 02: 16 01 00 05 31 54 01 18 FA 01 1B 00 00 00 05 00
 Travel 03: 16 01 00 05 31 53 E3 55 1D 08 1B 00 00 00 04 00
-Travel 04: 16 01 00 05 31 47 82 04 E4 25 1B 00 00 00 03 00
+Travel 04: 16 01 00 05 31 47 82 04 82 49 1B 00 00 00 03 00
 Travel 05: 1D 01 00 02 31 46 D5 14 EF 0D 62 01 00 00 02 00
 Travel 06: 12 07 00 00 31 45 02 FD 00 00 E8 03 00 00 01 00
 Travel 07: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

+ 18 - 1
files/suica/line_0x82.txt

@@ -5,4 +5,21 @@
 0x82,0x06,Rinkai,Tennozu Isle,5,0
 0x82,0x07,Rinkai,Shinagawa Seaside,6,0
 0x82,0x08,Rinkai,Oimachi,7,0
-0x82,0x0A,Rinkai,Osaki,8,0
+0x82,0x0A,Rinkai,Osaki,8,0
+
+0x82,0x41,Yurikamome,Shimbashi,1,0
+0x82,0x42,Yurikamome,Shiodome,2,0
+0x82,0x44,Yurikamome,Takeshiba,3,0
+0x82,0x45,Yurikamome,Hinode,4,0
+0x82,0x46,Yurikamome,Shibaura-futo,5,0
+0x82,0x48,Yurikamome,Odaiba-kaihinkoen,6,0
+0x82,0x49,Yurikamome,Daiba,7,0
+0x82,0x4a,Yurikamome,TYO Int'l Cruise Terminal,8,0
+0x82,0x4b,Yurikamome,Telecom Center,9,0
+0x82,0x4c,Yurikamome,Aomi,10,0
+0x82,0x4e,Yurikamome,Tokyo Big Sight,11,0
+0x82,0x4f,Yurikamome,Ariake,12,0
+0x82,0x50,Yurikamome,Ariake-Tennis-no-mori,13,0
+0x82,0x52,Yurikamome,Shijo-mae,14,0
+0x82,0x54,Yurikamome,Shin-toyosu,15,0
+0x82,0x56,Yurikamome,Toyosu,16,0

BIN
images/suica/Suica_YurikamomeLogo.png


BIN
images/suica/Suica_YurikamomeU.png


+ 3 - 3
scenes/plugins/suica.c

@@ -20,8 +20,7 @@
 
 #include <lib/nfc/protocols/felica/felica.h>
 #include <lib/nfc/protocols/felica/felica_poller.h>
-#include <lib/nfc/protocols/felica/felica_poller_i.h>
-#include <lib/nfc/helpers/felica_crc.h>
+// #include <lib/nfc/protocols/felica/felica_poller_i.h>
 #include <lib/bit_lib/bit_lib.h>
 
 #include <applications/services/locale/locale.h>
@@ -314,6 +313,7 @@ static NfcCommand suica_poller_callback(NfcGenericEvent event, void* context) {
     rx_resp->SF2 = 0;
     uint8_t blocks[1] = {0x00};
     FelicaPoller* felica_poller = event.instance;
+    const FelicaData* felica_data = nfc_poller_get_data(app->poller);
     FURI_LOG_I(TAG, "Poller set");
     if(felica_event->type == FelicaPollerEventTypeRequestAuthContext) {
         view_dispatcher_send_custom_event(app->view_dispatcher, MetroflipCustomEventCardDetected);
@@ -371,7 +371,7 @@ static NfcCommand suica_poller_callback(NfcGenericEvent event, void* context) {
                     "\e#Suica\nSorry, no data found.\nPlease let the developers know and we will add support.");
             }
 
-            if(model->size == 1 && felica_poller->data->pmm.data[1] != SUICA_IC_TYPE_CODE) {
+            if(model->size == 1 && felica_data->pmm.data[1] != SUICA_IC_TYPE_CODE) {
                 furi_string_printf(parsed_data, "\e#Suica\nSorry, not a Suica.\n");
             }
             widget_add_text_scroll_element(