Skip to content

Commit a85ca9d

Browse files
authored
Merge pull request #11 from ElectronicCats/dev
Player & OBD2 functionalities added
2 parents cb0cb77 + e5769c6 commit a85ca9d

23 files changed

+2579
-128
lines changed

Canbus_app/app_user.c

+13
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ static App* app_alloc() {
6060

6161
app->text = furi_string_alloc();
6262
app->data = furi_string_alloc();
63+
app->path = furi_string_alloc();
64+
65+
furi_string_reset(app->data);
66+
furi_string_cat_printf(app->data, "---");
67+
68+
app->file_browser = file_browser_alloc(app->path);
69+
view_dispatcher_add_view(
70+
app->view_dispatcher, FileBrowserView, file_browser_get_view(app->file_browser));
6371

6472
app->mcp_can = mcp_alloc(MCP_NORMAL, MCP_16MHZ, MCP_500KBPS);
6573

@@ -69,6 +77,8 @@ static App* app_alloc() {
6977

7078
app->frame_to_send = malloc(sizeof(CANFRAME));
7179

80+
app->obdii.bitrate = app->mcp_can->bitRate;
81+
7282
makePaths(app);
7383

7484
return app;
@@ -82,6 +92,7 @@ static void app_free(App* app) {
8292
view_dispatcher_remove_view(app->view_dispatcher, TextBoxView);
8393
view_dispatcher_remove_view(app->view_dispatcher, VarListView);
8494
view_dispatcher_remove_view(app->view_dispatcher, InputByteView);
95+
view_dispatcher_remove_view(app->view_dispatcher, FileBrowserView);
8596

8697
scene_manager_free(app->scene_manager);
8798
view_dispatcher_free(app->view_dispatcher);
@@ -90,9 +101,11 @@ static void app_free(App* app) {
90101
submenu_free(app->submenu);
91102
text_box_free(app->textBox);
92103
byte_input_free(app->input_byte_value);
104+
file_browser_free(app->file_browser);
93105

94106
furi_string_free(app->text);
95107
furi_string_free(app->data);
108+
furi_string_free(app->path);
96109

97110
if(app->log_file && storage_file_is_open(app->log_file)) {
98111
storage_file_close(app->log_file);

Canbus_app/app_user.h

+43-5
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,27 @@
99
#include <gui/modules/text_input.h>
1010
#include <gui/modules/variable_item_list.h>
1111
#include <gui/modules/widget.h>
12+
#include <gui/modules/file_browser.h>
13+
#include <gui/modules/file_browser_worker.h>
1214
#include <gui/scene_manager.h>
1315
#include <gui/view_dispatcher.h>
1416
#include <storage/storage.h>
1517

1618
#include "scenes_config/app_scene_functions.h"
1719

1820
#include "libraries/mcp_can_2515.h"
21+
#include "libraries/pid_library.h"
22+
23+
#include "canbus_app_icons.h"
1924

2025
#define PATHAPP "apps_data/canbus"
2126
#define PATHAPPEXT EXT_PATH(PATHAPP)
2227
#define PATHLOGS PATHAPPEXT "/logs"
2328

2429
#define DEVICE_NO_CONNECTED (0xFF)
2530

31+
#define MESSAGE_ERROR 0xF0
32+
2633
typedef enum {
2734
WorkerflagStop = (1 << 0),
2835
WorkerflagReceived = (1 << 1),
@@ -36,6 +43,8 @@ typedef struct {
3643
CANFRAME* frameArray;
3744
CANFRAME* frame_to_send;
3845

46+
OBDII obdii;
47+
3948
uint32_t time;
4049
uint32_t times[100];
4150
uint32_t current_time[100];
@@ -48,9 +57,11 @@ typedef struct {
4857
VariableItemList* varList;
4958
TextBox* textBox;
5059
ByteInput* input_byte_value;
60+
FileBrowser* file_browser;
5161

5262
FuriString* text;
5363
FuriString* data;
64+
FuriString* path;
5465

5566
Storage* storage;
5667
DialogsApp* dialogs;
@@ -62,27 +73,39 @@ typedef struct {
6273
uint32_t sniffer_index;
6374
uint32_t sniffer_index_aux;
6475

76+
uint8_t config_timing_index;
77+
6578
uint8_t num_of_devices;
6679
uint8_t sender_selected_item;
6780
uint8_t sender_id_compose[4];
6881

82+
uint32_t obdii_aux_index;
83+
uint8_t flags;
84+
6985
uint64_t size_of_storage;
86+
87+
uint8_t request_data;
7088
} App;
7189

7290
// This is for the menu Options
7391
typedef enum {
7492
SniffingTestOption,
7593
SenderOption,
94+
ObdiiOption,
7695
ReadLOGOption,
96+
PlayLOGOption,
7797
SettingsOption,
7898
AboutUsOption,
7999
} MainMenuOptions;
80100

101+
// These are the events on the main menu
81102
typedef enum {
82103
SniffingOptionEvent,
83104
SenderOptionEvent,
84105
SettingsOptionEvent,
106+
ObdiiOptionEvent,
85107
ReadLOGOptionEvent,
108+
PlayLOGOptionEvent,
86109
AboutUsEvent,
87110
} MainMenuEvents;
88111

@@ -92,16 +115,26 @@ typedef enum {
92115
CristyalClkOption,
93116
SaveLogsOption
94117
} OptionSettings;
118+
119+
// These are the events on the settings menu
95120
typedef enum {
96121
BitrateOptionEvent,
97122
CristyalClkOptionEvent
98123
} SettingsMenuEvent;
124+
125+
// These are the sender events
99126
typedef enum {
100127
ChooseIdEvent,
101128
SetIdEvent,
102129
ReturnEvent
103130
} SenderEvents;
104131

132+
// These are the player events
133+
typedef enum {
134+
ChooseTimingEvent,
135+
ReturnTimingEvent
136+
} PlayerEvents;
137+
105138
// These are the options to save
106139
typedef enum {
107140
NoSave,
@@ -129,10 +162,15 @@ typedef enum {
129162
TextBoxView,
130163
DialogInfoView,
131164
InputByteView,
165+
FileBrowserView,
132166
} scenesViews;
133167

134-
char* sequential_file_resolve_path(
135-
Storage* storage,
136-
const char* dir,
137-
const char* prefix,
138-
const char* extension);
168+
/**
169+
* These functions works in other scenes and widget
170+
*/
171+
172+
void draw_in_development(App* app);
173+
void draw_device_no_connected(App* app);
174+
void draw_transmition_failure(App* app);
175+
void draw_send_ok(App* app);
176+
void draw_send_wrong(App* app);

Canbus_app/application.fam

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ App(
66
requires=["gui"],
77
stack_size=30 * 1024,
88
fap_icon="icon.png",
9-
fap_category="Misc",
9+
fap_category="ElectronicCats",
10+
fap_icon_assets="assets",
1011
)

Canbus_app/assets/qrcode.png

324 Bytes
Loading

Canbus_app/dist/canbus_app.fap

39.2 KB
Binary file not shown.
221 KB
Binary file not shown.
+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include "../app_user.h"
2+
3+
// Draws a developmet
4+
void draw_in_development(App* app) {
5+
widget_reset(app->widget);
6+
7+
widget_add_string_element(
8+
app->widget, 65, 20, AlignCenter, AlignBottom, FontPrimary, "SCENE IN");
9+
10+
widget_add_string_element(
11+
app->widget, 65, 35, AlignCenter, AlignBottom, FontPrimary, "DEVELOPMENT");
12+
}
13+
14+
// Draws device not connected
15+
void draw_device_no_connected(App* app) {
16+
widget_reset(app->widget);
17+
18+
widget_add_string_element(
19+
app->widget, 65, 20, AlignCenter, AlignBottom, FontPrimary, "DEVICE NOT");
20+
21+
widget_add_string_element(
22+
app->widget, 65, 35, AlignCenter, AlignBottom, FontPrimary, "CONNECTED");
23+
}
24+
25+
// draw when a message is not recognized
26+
void draw_transmition_failure(App* app) {
27+
widget_reset(app->widget);
28+
29+
widget_add_string_element(
30+
app->widget, 65, 20, AlignCenter, AlignBottom, FontPrimary, "TRANSMITION");
31+
32+
widget_add_string_element(
33+
app->widget, 65, 35, AlignCenter, AlignBottom, FontPrimary, "FAILURE");
34+
}
35+
36+
// draw when a message is send OK
37+
void draw_send_wrong(App* app) {
38+
widget_reset(app->widget);
39+
widget_add_string_element(
40+
app->widget, 65, 20, AlignCenter, AlignCenter, FontPrimary, "MESSAGE SEND ERROR");
41+
}
42+
43+
// draw when a message is send ok
44+
void draw_send_ok(App* app) {
45+
widget_reset(app->widget);
46+
widget_add_string_element(
47+
app->widget, 65, 20, AlignCenter, AlignCenter, FontPrimary, "MESSAGE SEND OK");
48+
}

Canbus_app/libraries/mcp_can_2515.c

+17-27
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,14 @@ void read_Id(FuriHalSpiBusHandle* spi, uint8_t addr, uint32_t* id, uint8_t* ext)
7777
// get actual mode of the MCP2515
7878
uint8_t get_mode(FuriHalSpiBusHandle* spi) {
7979
uint8_t data = 0;
80-
read_register(spi, MCP_CANSTAT, &data);
80+
81+
uint8_t instruction[] = {INSTRUCTION_READ, MCP_CANSTAT};
82+
furi_hal_spi_acquire(spi);
83+
furi_hal_spi_bus_tx(spi, instruction, sizeof(instruction), TIMEOUT_SPI);
84+
furi_hal_spi_bus_rx(spi, &data, 1, TIMEOUT_SPI);
85+
86+
furi_hal_spi_release(spi);
87+
8188
return data & CANSTAT_OPM;
8289
}
8390

@@ -128,6 +135,8 @@ bool set_new_mode(MCP2515* mcp_can, MCP_MODE new_mode) {
128135
read_status &= CANSTAT_OPM;
129136
if(read_status == MODE_CONFIG) ret = true;
130137

138+
furi_delay_us(1);
139+
131140
} while((ret != true) && ((furi_get_tick() - time_out) < 50));
132141

133142
time_out = furi_get_tick();
@@ -138,6 +147,9 @@ bool set_new_mode(MCP2515* mcp_can, MCP_MODE new_mode) {
138147

139148
read_status &= CANSTAT_OPM;
140149
if(read_status == new_mode) return true;
150+
151+
furi_delay_us(1);
152+
141153
} while((furi_get_tick() - time_out) < 50);
142154

143155
return false;
@@ -148,38 +160,27 @@ bool set_config_mode(MCP2515* mcp_can) {
148160
bool ret = true;
149161
ret = set_new_mode(mcp_can, MODE_CONFIG);
150162

151-
if(ret) mcp_can->mode = MODE_CONFIG;
152-
153163
return ret;
154164
}
155165

156166
// To set Normal Mode
157167
bool set_normal_mode(MCP2515* mcp_can) {
158168
bool ret = true;
159169
ret = set_new_mode(mcp_can, MCP_NORMAL);
160-
161-
if(ret) mcp_can->mode = MCP_NORMAL;
162-
163170
return ret;
164171
}
165172

166173
// To set ListenOnly Mode
167174
bool set_listen_only_mode(MCP2515* mcp_can) {
168175
bool ret = true;
169176
ret = set_new_mode(mcp_can, MCP_LISTENONLY);
170-
171-
if(ret) mcp_can->mode = MCP_LISTENONLY;
172-
173177
return ret;
174178
}
175179

176180
// To set Sleep Mode
177181
bool set_sleep_mode(MCP2515* mcp_can) {
178182
bool ret = true;
179183
ret = set_new_mode(mcp_can, MCP_SLEEP);
180-
181-
if(ret) mcp_can->mode = MCP_SLEEP;
182-
183184
return ret;
184185
}
185186

@@ -322,10 +323,7 @@ void write_mf(FuriHalSpiBusHandle* spi, uint8_t address, uint8_t ext, uint32_t i
322323
furi_hal_spi_acquire(spi);
323324
furi_hal_spi_bus_tx(spi, instruction, sizeof(instruction), TIMEOUT_SPI);
324325

325-
for(uint8_t i = 0; i < 4; i++) {
326-
furi_hal_spi_bus_tx(spi, &bufData[i], 1, TIMEOUT_SPI);
327-
}
328-
326+
furi_hal_spi_bus_tx(spi, bufData, 4, TIMEOUT_SPI);
329327
furi_hal_spi_release(spi);
330328
}
331329

@@ -335,8 +333,6 @@ void init_mask(MCP2515* mcp_can, uint8_t num_mask, uint32_t mask) {
335333

336334
uint8_t ext = 0;
337335

338-
MCP_MODE last_mode = mcp_can->mode;
339-
340336
set_config_mode(mcp_can);
341337

342338
if(num_mask > 1) return;
@@ -350,8 +346,8 @@ void init_mask(MCP2515* mcp_can, uint8_t num_mask, uint32_t mask) {
350346
if(num_mask == 1) {
351347
write_mf(spi, MCP_RXM1SIDH, ext, mask);
352348
}
353-
mcp_can->mode = last_mode;
354-
set_new_mode(mcp_can, last_mode);
349+
350+
set_new_mode(mcp_can, mcp_can->mode);
355351
}
356352

357353
// To set a Filter
@@ -360,8 +356,6 @@ void init_filter(MCP2515* mcp_can, uint8_t num_filter, uint32_t filter) {
360356

361357
uint8_t ext = 0;
362358

363-
MCP_MODE last_mode = mcp_can->mode;
364-
365359
set_config_mode(mcp_can);
366360

367361
if(num_filter > 6) return;
@@ -396,8 +390,7 @@ void init_filter(MCP2515* mcp_can, uint8_t num_filter, uint32_t filter) {
396390
break;
397391
}
398392

399-
mcp_can->mode = last_mode;
400-
set_new_mode(mcp_can, last_mode);
393+
set_new_mode(mcp_can, mcp_can->mode);
401394
}
402395

403396
// This function works to know if there is any message waiting
@@ -635,7 +628,6 @@ ERROR_CAN send_can_message(FuriHalSpiBusHandle* spi, CANFRAME* frame, uint8_t tx
635628
read_register(spi, free_buffer - 1, &is_send_it);
636629
if(is_send_it == 0) res = ERROR_OK;
637630

638-
furi_delay_us(1);
639631
} while((res != ERROR_OK) && ((furi_get_tick() - time_waiting) < 1));
640632

641633
if(is_send_it) return res;
@@ -652,8 +644,6 @@ ERROR_CAN send_can_frame(MCP2515* mcp_can, CANFRAME* frame) {
652644
if(free_buffer == 0xFF) return ERROR_ALLTXBUSY;
653645

654646
return send_can_message(spi, frame, free_buffer);
655-
656-
return ERROR_OK;
657647
}
658648

659649
// This function works to alloc the struct

0 commit comments

Comments
 (0)