1. 程式人生 > >MVP模式在車載系統中車身設定的運用

MVP模式在車載系統中車身設定的運用

車載系統的中的關於車身相關的設定過程,是一個非同步的過程,就像網路請求一樣。只是和網路用的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介面,以便靈活處理。