车载系统的中的关于车身相关的设置过程,是一个异步的过程,就像网络请求一样。只是和网络用的http协议不同的是,车载主机和车身各个控制器的通信,是通过CAN协议实现的。CAN线就像是一个神经网络,它允许各个控制器也包括主机去获取自己感兴趣的报文,而我们的主机更像是一个整辆车的大脑一样。
我们以辅助驾驶中的车道偏离预警的报警声音设置为例,这是一个开关按键。一个完整的车身设置如下:
1、首先点击了设置按键之后(比如是想要打开此开关),UI界面不能立马就把开关打开,而是需要把开的信号转发给底层的MCU(单片机),MCU负责把ARM发过来的信号,通过之前定好的CAN信号矩阵翻,译成一条完整的报文发送到CAN线上面去。
2、同样连接在CAN总线上的辅助驾驶模块收到了这条报文,这是它感兴趣的。解析报文发现主机试图打开报警声音之后,它会开启自己报警声音,并立即反馈另一条之前定义好的报文,此报文中会携带一个信息——我已经打开了报警声音。
3、MCU会收到这条有用的信息并解析,并且会把这条信息通过串口发送到ARM系统这边来,这个时候,应用在收到了此消息的回调之后,才会根据信号的值改变UI。

清楚了这个流程之后,我们才会觉得MVP架构在这样的项目中使用,会让代码变得是多么的清晰和可读。结构图如下:
MVP模式在车载系统中车身设置的运用-LMLPHP

需要注意一点的是,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接口,以便灵活处理。

12-09 17:17