1
1
use std:: io;
2
- use std:: process:: exit;
3
2
use std:: sync:: mpsc;
4
3
use std:: sync:: { Arc , Mutex } ;
5
- use std:: time:: Duration ;
6
4
7
5
mod event_handler;
8
6
use can_dbc:: DBC ;
7
+ use event_handler:: { CanHandler , DBCFile , Init , PacketFilter } ;
9
8
#[ cfg( target_os = "windows" ) ]
10
- use event_handler:: p_can_bitrate;
11
- use event_handler:: { CanHandler , DBCFile , PacketFilter } ;
12
- #[ cfg( target_os = "windows" ) ]
13
- use pcan_basic:: { bus:: UsbBus , hw:: attached_channels, socket:: usb:: UsbCanSocket } ;
9
+ use pcan_basic:: { bus:: UsbBus , socket:: usb:: UsbCanSocket } ;
14
10
#[ cfg( target_os = "linux" ) ]
15
11
use privilege_rs:: privilege_request;
16
12
#[ cfg( target_os = "windows" ) ]
17
13
use slint:: Model ;
18
- use slint:: { ModelRc , SharedString , VecModel } ;
19
- #[ cfg( target_os = "linux" ) ]
20
- use socketcan:: available_interfaces;
14
+ use slint:: SharedString ;
21
15
#[ cfg( target_os = "windows" ) ]
22
16
use winapi:: um:: wincon:: FreeConsole ;
23
17
@@ -39,125 +33,11 @@ async fn main() -> io::Result<()> {
39
33
40
34
// Find available socket CAN
41
35
let ui_handle = ui. as_weak ( ) ;
42
- #[ cfg( target_os = "linux" ) ]
43
- tokio:: spawn ( async move {
44
- let mut previous_interfaces = Vec :: default ( ) ;
45
- loop {
46
- match available_interfaces ( ) {
47
- Ok ( interface) => {
48
- if interface. is_empty ( ) {
49
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
50
- let socket_info = socket_info {
51
- index : ModelRc :: new ( VecModel :: from ( Vec :: default ( ) ) ) ,
52
- name : ModelRc :: new ( VecModel :: from ( Vec :: default ( ) ) ) ,
53
- } ;
54
- ui. set_can_sockets ( socket_info) ;
55
- ui. set_init_string ( SharedString :: from ( "No CAN device found !" ) ) ;
56
- } ) ;
57
- } else if previous_interfaces != interface {
58
- let interface_clone = interface. clone ( ) ;
59
- previous_interfaces = interface. clone ( ) ;
60
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
61
- ui. set_init_string ( SharedString :: from ( format ! (
62
- "Found {} CAN devices\n Please select your device " ,
63
- interface. len( )
64
- ) ) ) ;
65
- } ) ;
66
-
67
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
68
- let convert_shared_string: Vec < SharedString > = interface_clone
69
- . into_iter ( )
70
- . map ( SharedString :: from)
71
- . collect ( ) ;
72
- let socket_info = socket_info {
73
- index : ModelRc :: new ( VecModel :: from ( Vec :: default ( ) ) ) ,
74
- name : ModelRc :: new ( VecModel :: from ( convert_shared_string) ) ,
75
- } ;
76
- ui. set_can_sockets ( socket_info) ;
77
- } ) ;
78
- }
79
- }
80
- Err ( e) => {
81
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
82
- ui. set_init_string ( SharedString :: from ( format ! (
83
- "Can't get device list: {}" ,
84
- e
85
- ) ) ) ;
86
- let socket_info = socket_info {
87
- index : ModelRc :: new ( VecModel :: from ( Vec :: default ( ) ) ) ,
88
- name : ModelRc :: new ( VecModel :: from ( Vec :: default ( ) ) ) ,
89
- } ;
90
- ui. set_can_sockets ( socket_info) ;
91
- } ) ;
92
- }
93
- } ;
94
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
95
- if !ui. window ( ) . is_visible ( ) {
96
- exit ( 1 ) ;
97
- }
98
- } ) ;
99
- tokio:: time:: sleep ( Duration :: from_micros ( 50 ) ) . await ;
100
- }
101
- } ) ;
102
-
103
- #[ cfg( target_os = "windows" ) ]
104
36
tokio:: spawn ( async move {
105
- let mut previous_sockets = Vec :: default ( ) ;
106
- loop {
107
- // get channel_handle
108
- match attached_channels ( ) {
109
- Ok ( channels) => {
110
- if channels. is_empty ( ) {
111
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
112
- ui. set_init_string ( SharedString :: from ( "No CAN device found !" ) ) ;
113
- } ) ;
114
- } else {
115
- let mut can_socket_names = Vec :: default ( ) ;
116
- let mut can_socket_index = Vec :: default ( ) ;
117
- let mut count = 0 ;
118
- for channel in channels {
119
- let socket_name = SharedString :: from ( format ! (
120
- "{}(0x{:02X})" ,
121
- channel. device_name( ) ,
122
- channel. channel_information. device_id
123
- ) ) ;
124
- can_socket_names. push ( socket_name) ;
125
- can_socket_index
126
- . push ( channel. channel_information . channel_handle as i32 ) ;
127
- count += 1 ;
128
- }
129
- if previous_sockets != can_socket_names {
130
- previous_sockets = can_socket_names. clone ( ) ;
131
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
132
- ui. set_init_string ( SharedString :: from ( format ! (
133
- "Found {} CAN devices\n Please select your device " ,
134
- count
135
- ) ) ) ;
136
- let socket_info = socket_info {
137
- index : ModelRc :: new ( VecModel :: from ( can_socket_index) ) ,
138
- name : ModelRc :: new ( VecModel :: from ( can_socket_names) ) ,
139
- } ;
140
- ui. set_can_sockets ( socket_info) ;
141
- } ) ;
142
- }
143
- }
144
- }
145
- Err ( e) => {
146
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
147
- ui. set_init_string ( SharedString :: from ( format ! (
148
- "Can't get device list: {:?}" ,
149
- e
150
- ) ) ) ;
151
- } ) ;
152
- }
153
- }
154
- let _ = ui_handle. upgrade_in_event_loop ( move |ui| {
155
- if !ui. window ( ) . is_visible ( ) {
156
- exit ( 1 ) ;
157
- }
158
- } ) ;
159
- tokio:: time:: sleep ( Duration :: from_micros ( 50 ) ) . await ;
160
- }
37
+ let init_event = Init {
38
+ ui_handle : & ui_handle,
39
+ } ;
40
+ init_event. run ( ) ;
161
41
} ) ;
162
42
163
43
let ( start_tx, start_rx) = mpsc:: channel ( ) ;
@@ -177,6 +57,7 @@ async fn main() -> io::Result<()> {
177
57
}
178
58
#[ cfg( target_os = "windows" ) ]
179
59
{
60
+ use event_handler:: p_can_bitrate;
180
61
let ui = ui_handle. unwrap ( ) ;
181
62
let get_device_handle = match ui. get_can_sockets ( ) . index . row_data ( _index as usize ) {
182
63
Some ( device) => device,
0 commit comments