Просмотр исходного кода

Merge branch '0.5+load+suica' of https://github.com/zinongli/Metroflip into 0.5+load+suica

zinongli 11 месяцев назад
Родитель
Сommit
56803c4af6

+ 6 - 0
api/metroflip/metroflip_api.h

@@ -146,6 +146,12 @@ extern const Icon I_Suica_EmptyArrowRight;
 extern const Icon I_Suica_EntrySlider1;
 extern const Icon I_Suica_EntrySlider2;
 extern const Icon I_Suica_EntrySlider3;
+extern const Icon I_Suica_EntryStopL1;
+extern const Icon I_Suica_EntryStopL2;
+extern const Icon I_Suica_EntryStopL3;
+extern const Icon I_Suica_EntryStopR1;
+extern const Icon I_Suica_EntryStopR2;
+extern const Icon I_Suica_EntryStopR3;
 extern const Icon I_Suica_FilledArrowDown;
 extern const Icon I_Suica_FilledArrowRight;
 extern const Icon I_Suica_GinzaG;

+ 6 - 0
api/metroflip/metroflip_api_table_i.h

@@ -84,6 +84,12 @@ static constexpr auto metroflip_api_table = sort(create_array_t<sym_entry>(
     API_VARIABLE(I_Suica_EntrySlider1, Icon),
     API_VARIABLE(I_Suica_EntrySlider2, Icon),
     API_VARIABLE(I_Suica_EntrySlider3, Icon),
+    API_VARIABLE(I_Suica_EntryStopL1, Icon),
+    API_VARIABLE(I_Suica_EntryStopL2, Icon),
+    API_VARIABLE(I_Suica_EntryStopL3, Icon),
+    API_VARIABLE(I_Suica_EntryStopR1, Icon),
+    API_VARIABLE(I_Suica_EntryStopR2, Icon),
+    API_VARIABLE(I_Suica_EntryStopR3, Icon),
     API_VARIABLE(I_Suica_FilledArrowDown, Icon),
     API_VARIABLE(I_Suica_FilledArrowRight, Icon),
     API_VARIABLE(I_Suica_GinzaG, Icon),

+ 3 - 1
api/suica/suica_assets.h

@@ -5,7 +5,7 @@
 #include "suica_structs_i.h"
 
 
-#define SUICA_RAILWAY_NUM 21 // Don't count Unknown
+#define SUICA_RAILWAY_NUM 23 // Don't count Unknown
 
 #define SUICA_RAILWAY_UNKNOWN_NAME "Unknown"
 // Railway
@@ -14,6 +14,8 @@ static const Railway RailwaysList[] = {
     // Japan Railway East JRE
     {0x01, {0, 0}, "Keihin Tohoku", 14, SuicaJR, "JK", 0},
     {0x01, {0, 0}, "Tokaido Main", 21, SuicaJR, "JT", 0},
+    {0x02, {0, 0}, "Keihin Tohoku", 22, SuicaJR, "JK", 0},
+    {0x02, {0, 0}, "Utsunomiya", 33, SuicaJR, "JU", 0},
     {0x1D, {0, 0}, "Negishi", 10, SuicaJR, "JK", 0},
 
     // Tokyo Waterfront Area Rapid Transit TWR

+ 55 - 26
api/suica/suica_drawings.h

@@ -25,7 +25,7 @@
 #define TERMINAL_IN_CAR_SUPP_MACHINE    0x24
 #define TERMINAL_POS_AND_TAXI           0xC7
 #define TERMINAL_VENDING_MACHINE        0xC8
-#define PROCESSING_CODE_NEW_ISSUE       0x02
+#define PROCESSING_CODE_RECHARGE       0x02
 #define ARROW_ANIMATION_FRAME_MS        350
 
 typedef enum {
@@ -491,18 +491,19 @@ static void suica_draw_vending_machine_page_2(
 
     // Clock Component
     canvas_set_color(canvas, ColorWhite); // Erase part of old frame to allow for new frame
-    canvas_draw_line(canvas, 91, 9, 94, 6);
-    canvas_draw_line(canvas, 57, 9, 93, 9);
+    canvas_draw_line(canvas, 93, 9, 96, 6);
+    canvas_draw_line(canvas, 59, 9, 95, 9);
     canvas_set_color(canvas, ColorBlack);
     furi_string_printf(buffer, "%02d:%02d", history.hour, history.minute);
-    canvas_draw_line(canvas, 63, 21, 60, 18);
+    canvas_draw_line(canvas, 65, 21, 62, 18);
     canvas_set_font(canvas, FontKeyboard);
-    canvas_draw_str(canvas, 63, 19, furi_string_get_cstr(buffer));
-    canvas_draw_line(canvas, 91, 21, 94, 18);
-    canvas_draw_line(canvas, 64, 21, 91, 21);
-    canvas_draw_line(canvas, 94, 6, 94, 17);
-    canvas_draw_line(canvas, 60, 12, 60, 17);
-    canvas_draw_line(canvas, 60, 12, 57, 9);
+    canvas_draw_str(canvas, 66, 19, furi_string_get_cstr(buffer));
+    canvas_draw_line(canvas, 93, 21, 96, 18);
+    canvas_draw_line(canvas, 66, 21, 93, 21);
+    canvas_draw_line(canvas, 96, 6, 96, 17);
+    canvas_draw_line(canvas, 62, 12, 62, 17);
+    canvas_draw_line(canvas, 62, 12, 59, 9);
+
 
     // Vending Machine
     canvas_draw_icon(canvas, 4, 12, &I_Suica_VendingMachine);
@@ -611,18 +612,18 @@ static void
     FuriString* buffer = furi_string_alloc();
     // Clock Component
     canvas_set_color(canvas, ColorWhite); // Erase part of old frame to allow for new frame
-    canvas_draw_line(canvas, 91, 9, 94, 6);
-    canvas_draw_line(canvas, 57, 9, 93, 9);
+    canvas_draw_line(canvas, 93, 9, 96, 6);
+    canvas_draw_line(canvas, 59, 9, 95, 9);
     canvas_set_color(canvas, ColorBlack);
     furi_string_printf(buffer, "%02d:%02d", history.hour, history.minute);
-    canvas_draw_line(canvas, 63, 21, 60, 18);
+    canvas_draw_line(canvas, 65, 21, 62, 18);
     canvas_set_font(canvas, FontKeyboard);
-    canvas_draw_str(canvas, 63, 19, furi_string_get_cstr(buffer));
-    canvas_draw_line(canvas, 91, 21, 94, 18);
-    canvas_draw_line(canvas, 64, 21, 91, 21);
-    canvas_draw_line(canvas, 94, 6, 94, 17);
-    canvas_draw_line(canvas, 60, 12, 60, 17);
-    canvas_draw_line(canvas, 60, 12, 57, 9);
+    canvas_draw_str(canvas, 66, 19, furi_string_get_cstr(buffer));
+    canvas_draw_line(canvas, 93, 21, 96, 18);
+    canvas_draw_line(canvas, 66, 21, 93, 21);
+    canvas_draw_line(canvas, 96, 6, 96, 17);
+    canvas_draw_line(canvas, 62, 12, 62, 17);
+    canvas_draw_line(canvas, 62, 12, 59, 9);
 
     // Machine Code
     canvas_set_font(canvas, FontPrimary);
@@ -849,7 +850,7 @@ static void suica_history_draw_callback(Canvas* canvas, void* model) {
         my_model->history.month,
         my_model->history.day);
     canvas_set_font(canvas, FontPrimary);
-    canvas_draw_str(canvas, 36, 8, furi_string_get_cstr(buffer));
+    canvas_draw_str(canvas, 37, 8, furi_string_get_cstr(buffer));
 
     // Entry Num
     canvas_draw_box(canvas, 106, 0, 13, 9);
@@ -873,23 +874,51 @@ static void suica_history_draw_callback(Canvas* canvas, void* model) {
     default:
         break;
     }
-    
+
     canvas_set_color(canvas, ColorWhite);
-    if (my_model->entry == 1) {
+    if(my_model->entry == 1) {
         canvas_draw_box(canvas, 99, 0, 6, 9);
-    } else if (my_model->entry == my_model->size) {
+        canvas_set_color(canvas, ColorBlack);
+        switch(my_model->page) {
+        case 0:
+            canvas_draw_icon(canvas, 101, 0, &I_Suica_EntryStopL1);
+            break;
+        case 1:
+            canvas_draw_icon(canvas, 101, 0, &I_Suica_EntryStopL2);
+            break;
+        case 2:
+            canvas_draw_icon(canvas, 101, 0, &I_Suica_EntryStopL3);
+            break;
+        default:
+            break;
+        }
+    } else if(my_model->entry == my_model->size) {
         canvas_draw_box(canvas, 120, 0, 6, 9);
+        canvas_set_color(canvas, ColorBlack);
+        switch(my_model->page) {
+        case 0:
+            canvas_draw_icon(canvas, 120, 0, &I_Suica_EntryStopR1);
+            break;
+        case 1:
+            canvas_draw_icon(canvas, 120, 0, &I_Suica_EntryStopR2);
+            break;
+        case 2:
+            canvas_draw_icon(canvas, 120, 0, &I_Suica_EntryStopR3);
+            break;
+        default:
+            break;
+        }
     }
-    canvas_set_color(canvas, ColorBlack);
 
+    canvas_set_color(canvas, ColorBlack);
 
     // Frame
     canvas_draw_line(canvas, 0, 9, 26, 9);
     canvas_draw_line(canvas, 27, 9, 29, 7);
     canvas_draw_line(canvas, 29, 0, 29, 6);
 
-    canvas_draw_line(canvas, 33, 0, 31, 7);
-    canvas_draw_line(canvas, 35, 9, 33, 7);
+    canvas_draw_line(canvas, 33, 0, 33, 6);
+    canvas_draw_line(canvas, 36, 9, 33, 6);
     canvas_draw_line(canvas, 92, 9, 36, 9);
     canvas_draw_line(canvas, 93, 9, 96, 6);
     canvas_draw_line(canvas, 96, 0, 96, 6);

+ 57 - 0
files/suica/line_0x02.txt

@@ -0,0 +1,57 @@
+0x02,0x01,Keihin Tohoku,Tokyo,26,TYO
+0x02,0x02,Keihin Tohoku,Kanda,27,KND
+0x02,0x03,Keihin Tohoku,Akihabara,28,AKB
+0x02,0x04,Keihin Tohoku,Okachimachi,29,0
+0x02,0x06,Keihin Tohoku,Ueno,30,UEN
+0x02,0x07,Keihin Tohoku,Uguisudani,31,0
+0x02,0x08,Keihin Tohoku,Nippori,32,NPR
+0x02,0x09,Keihin Tohoku,Nishi-Nippori,33,0
+0x02,0x0b,Keihin Tohoku,Tabata,34,0
+0x02,0x0c,Keihin Tohoku,Kami-Nakazato,35,0
+0x02,0x0d,Keihin Tohoku,Oji,36,0
+0x02,0x0e,Keihin Tohoku,Higashi-Jujo,37,0
+0x02,0x10,Keihin Tohoku,Akabane,38,ABN
+0x02,0x11,Keihin Tohoku,Kawaguchi,39,0
+0x02,0x12,Keihin Tohoku,Nishi-Kawaguchi,40,0
+0x02,0x13,Keihin Tohoku,Warabi,41,0
+0x02,0x15,Keihin Tohoku,Minami-Urawa,42,0
+0x02,0x16,Keihin Tohoku,Urawa,43,URW
+0x02,0x17,Keihin Tohoku,Kita-Urawa,44,0
+0x02,0x18,Keihin Tohoku,Yono,45,0
+0x02,0x19,Keihin Tohoku,Saitama-Shintoshin,46,0
+0x02,0x1a,Keihin Tohoku,Omiya,47,OMY
+,,,,,
+0x02,0x01,Utsunomiya,Tokyo,1,TYO
+0x02,0x06,Utsunomiya,Ueno,2,UEN
+0x02,0x10,Utsunomiya,Akabane,4,ABN
+0x02,0x16,Tohoku Main,Urawa,5,URW
+0x02,0x19,Utsunomiya,Saitama-Shintoshin,6,0
+0x02,0x1a,Utsunomiya,Omiya,7,OMY
+0x02,0x1b,Utsunomiya,Toro,8,0
+0x02,0x1c,Utsunomiya,Higashi-Omiya,9,0
+0x02,0x1e,Utsunomiya,Hasuda,10,0
+0x02,0x20,Utsunomiya,Shiraoka,11,0
+0x02,0x21,Utsunomiya,Shin-Shiraaka,12,0
+0x02,0x22,Utsunomiya,Kuki,13,0
+0x02,0x23,Utsunomiya,Higashi-Washinomiya,14,0
+0x02,0x24,Utsunomiya,Kurihashi,15,0
+0x02,0x26,Utsunomiya,Koga,16,0
+0x02,0x27,Utsunomiya,Nogi,17,0
+0x02,0x28,Utsunomiya,Mamada,18,0
+0x02,0x2a,Utsunomiya,Oyama,19,0
+0x02,0x2c,Utsunomiya,Koganei,20,0
+0x02,0x2d,Utsunomiya,Jichi Medical University,21,0
+0x02,0x2e,Utsunomiya,Ishibashi,22,0
+0x02,0x30,Utsunomiya,Suzumenomiya,23,0
+0x02,0x32,Utsunomiya,Utsunomiya,24,0
+0x02,0x34,Utsunomiya,Okamoto,25,0
+0x02,0x35,Utsunomiya,Hoshakuji,26,0
+0x02,0x36,Utsunomiya,Ujiie,27,0
+0x02,0x37,Utsunomiya,Kamasusaka,28,0
+0x02,0x39,Utsunomiya,Kataoka,29,0
+0x02,0x3a,Utsunomiya,Yaita,30,0
+0x02,0x3b,Utsunomiya,Nozaki,31,0
+0x02,0x3c,Utsunomiya,Nishi-Nasuno,32,0
+0x02,0x3e,Utsunomiya,Nasushiobara,33,0
+0x02,0x3f,Utsunomiya,Kuroiso,34,0
+

+ 4 - 10
scenes/plugins/suica.c

@@ -236,10 +236,9 @@ static void suica_parse(SuicaHistoryViewModel* my_model) {
         uint8_t exit_line = current_block[8];
         uint8_t exit_station = current_block[9];
 
-        if((uint8_t)current_block[0] != TERMINAL_MOBILE_PHONE) {
-            suica_parse_train_code(entry_line, entry_station, SuicaTrainRideEntry, my_model);
-        }
-        if((uint8_t)current_block[1] != PROCESSING_CODE_NEW_ISSUE) {
+        suica_parse_train_code(entry_line, entry_station, SuicaTrainRideEntry, my_model);
+
+        if((uint8_t)current_block[14] != 0x01) {
             suica_parse_train_code(exit_line, exit_station, SuicaTrainRideExit, my_model);
         }
 
@@ -270,11 +269,6 @@ static void suica_parse(SuicaHistoryViewModel* my_model) {
         my_model->history.shop_code[1] = current_block[9];
         break;
     case TERMINAL_MOBILE_PHONE:
-        if((uint8_t)current_block[1] == PROCESSING_CODE_NEW_ISSUE) {
-            my_model->history.hour = ((uint8_t)current_block[6] & 0xF8) >> 3;
-            my_model->history.minute = (((uint8_t)current_block[6] & 0x07) << 3) |
-                                       (((uint8_t)current_block[7] & 0xE0) >> 5);
-        }
         break;
     case TERMINAL_TICKET_VENDING_MACHINE:
         my_model->history.history_type = SuicaHistoryHappyBirthday;
@@ -285,7 +279,7 @@ static void suica_parse(SuicaHistoryViewModel* my_model) {
         }
         break;
     }
-    if((uint8_t)current_block[1] == PROCESSING_CODE_NEW_ISSUE) {
+    if((uint8_t)current_block[14] == 0x01) {
         my_model->history.history_type = SuicaHistoryHappyBirthday;
     }
 }