车载系统的中的关于车身相关的设置过程,是一个异步的过程,就像网络请求一样。只是和网络用的http协议不同的是,车载主机和车身各个控制器的通信,是通过CAN协议实现的。CAN线就像是一个神经网络,它允许各个控制器也包括主机去获取自己感兴趣的报文,而我们的主机更像是一个整辆车的大脑一样。
我们以辅助驾驶中的车道偏离预警的报警声音设置为例,这是一个开关按键。一个完整的车身设置如下:
1、首先点击了设置按键之后(比如是想要打开此开关),UI界面不能立马就把开关打开,而是需要把开的信号转发给底层的MCU(单片机),MCU负责把ARM发过来的信号,通过之前定好的CAN信号矩阵翻,译成一条完整的报文发送到CAN线上面去。
2、同样连接在CAN总线上的辅助驾驶模块收到了这条报文,这是它感兴趣的。解析报文发现主机试图打开报警声音之后,它会开启自己报警声音,并立即反馈另一条之前定义好的报文,此报文中会携带一个信息——我已经打开了报警声音。
3、MCU会收到这条有用的信息并解析,并且会把这条信息通过串口发送到ARM系统这边来,这个时候,应用在收到了此消息的回调之后,才会根据信号的值改变UI。
清楚了这个流程之后,我们才会觉得MVP架构在这样的项目中使用,会让代码变得是多么的清晰和可读。结构图如下:
需要注意一点的是,P层在创建的时候,需要去同步CAN服务中的数据,并用数据初始化界面,这样才能让界面的显示跟车身的真实状态一致。
MVP结构的接口定义:
public interface ADASContract {
interface View{
void setPresenter(AdasPresenter presenter);
void showToast();
}
interface LDWView extends View{
void updateLDWMode(int mode);
void updateSensibility(int sensi);
void updateAlert(boolean isAlert);
}
interface FCWView extends View{
void updateSensibility(int sensi);
void updateAlert(boolean isAlert);
void updateAlertVoice(boolean isvoice);
}
interface ADASView extends View{
}
interface AdasPresenter{
void showADAS();
void showLDW();
void showFCW();
void setLDWMode(int mode);
void setLDWKeep(int mode);
void setLDWSensibility(int sensi);
void setLDWSwitch(boolean open);
void setFCWSensibility(int sensi);
void setFCWSwitch(boolean open);
void setFCWVoiceSwitch(boolean open);
void setCarRunMode(int mode);
void unRegister();
}
}
这里根据不同的界面,定义了不同的子View接口,以便灵活处理。