管理信息化物聯(lián)網(wǎng)智能家居系統(tǒng)方案設(shè)計(jì)_第1頁
管理信息化物聯(lián)網(wǎng)智能家居系統(tǒng)方案設(shè)計(jì)_第2頁
管理信息化物聯(lián)網(wǎng)智能家居系統(tǒng)方案設(shè)計(jì)_第3頁
管理信息化物聯(lián)網(wǎng)智能家居系統(tǒng)方案設(shè)計(jì)_第4頁
管理信息化物聯(lián)網(wǎng)智能家居系統(tǒng)方案設(shè)計(jì)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

管理信息化物聯(lián)網(wǎng)智能家居系統(tǒng)方案設(shè)計(jì){管理信息化物聯(lián)網(wǎng)}智能家居系統(tǒng)方案設(shè)計(jì)智能家居系統(tǒng)方案設(shè)計(jì)文檔目錄0.文檔介紹40.1文檔目的40.2文檔范圍40.3讀者對(duì)象40.4參考文獻(xiàn)40.5術(shù)語與縮寫解釋41.模塊命名規(guī)則52.模塊匯總52.1模塊匯總表52.2模塊關(guān)系圖53.子系統(tǒng)A的模塊設(shè)計(jì)63.N模塊A-N64.子系統(tǒng)B的模塊設(shè)計(jì)64.N模塊B-N65.其他60.文檔介紹0.1文檔目的本文檔旨在詳細(xì)說明智能家居系統(tǒng)中門禁系統(tǒng)和linux下的模塊程序開發(fā)過程,通過此文檔的描述,希望可以達(dá)到具有同等技術(shù)的開發(fā)人員按此介紹可以完全重現(xiàn)此技術(shù)。0.2文檔范圍智能控制系統(tǒng),嵌入式linux系統(tǒng)等。0.3讀者對(duì)象嵌入式系統(tǒng)開發(fā)人員0.4參考文獻(xiàn)無0.5術(shù)語與縮寫解釋縮寫、術(shù)語解釋CPLDCPLD是一種用戶根據(jù)各自需要而自行構(gòu)造邏輯功能的數(shù)字集成電路。其基本設(shè)計(jì)方法是借助集成開發(fā)軟件平臺(tái),用原理圖、硬件描述語言等方法,生成相應(yīng)的目標(biāo)文件,通過下載電纜(“在系統(tǒng)編程)將代碼傳送到目標(biāo)芯片中,實(shí)現(xiàn)設(shè)計(jì)的數(shù)字系統(tǒng)。WiegandWiegand協(xié)議是國(guó)際上統(tǒng)一的標(biāo)準(zhǔn),有很多格式,標(biāo)準(zhǔn)的26-bit應(yīng)該是最常用的格式zigbee紫蜂技術(shù)1.模塊命名規(guī)則本文檔模塊名稱與具體實(shí)現(xiàn)的功能函數(shù)采取一致的表示方法。2.模塊匯總設(shè)備管理,策略管理,人員管理,定時(shí)管理,設(shè)備底層操作,串口設(shè)備層操作,串口底層操作庫,配置文件解析,以及UI通訊等模塊。同時(shí)包括門禁控制系統(tǒng)模塊,家居控制模塊和環(huán)境探測(cè)模塊以及人機(jī)交互界面設(shè)計(jì)模塊。2.1模塊匯總表設(shè)備管理(dev.c)模塊名稱功能簡(jiǎn)述init_dev初始化設(shè)備根節(jié)點(diǎn)add_dev添加入網(wǎng)設(shè)備del_dev刪除鏈表中設(shè)備init_dev_policy_table按照設(shè)備類新初始化策略表update_dev_policy_table按照各個(gè)設(shè)備類型,更新鏈表中的各個(gè)設(shè)備策略表get_dev_policy_table_size按照設(shè)備節(jié)點(diǎn)的類型返回對(duì)應(yīng)設(shè)備類型的策略表大小策略管理(policy.c)模塊名稱功能簡(jiǎn)述tempmon_policy_table_init初始化溫度計(jì)類型設(shè)備的策略表。tempmon_policy_table_set_warn根據(jù)參數(shù)傳過來的狀態(tài)設(shè)置設(shè)備報(bào)警狀態(tài)。tempmon_policy_table_update調(diào)用底層設(shè)備控制取得當(dāng)前設(shè)備狀態(tài)更新對(duì)應(yīng)設(shè)備的策略表。設(shè)備底層操作接口(devctl.c)tempmon_get_dev_stat取得溫度計(jì)設(shè)備狀態(tài)tempmon_get_cur_temp取得溫度計(jì)設(shè)備溫度tempmon_set_hi_level設(shè)置溫度計(jì)最高報(bào)警溫度tempmon_set_low_levl設(shè)置溫度計(jì)最低報(bào)警溫度用戶認(rèn)證(auth.c)auth_user根據(jù)傳來的用戶名和密碼,返回驗(yàn)證結(jié)果change_pass根據(jù)傳來的用戶名和密碼,更改密碼文del_pass根據(jù)傳來的用戶名,刪除密碼文件中的對(duì)應(yīng)用戶行add_user根據(jù)傳來的參數(shù),在密碼文件中加入對(duì)應(yīng)用戶行配置文件處理(parm.c)load_parm解析器的前端,根據(jù)解析器的結(jié)果,拋出對(duì)應(yīng)得錯(cuò)誤。do_paser根據(jù)傳進(jìn)來的文件描述符,將文件中相應(yīng)的參數(shù)解析到參數(shù)結(jié)構(gòu)體。save_parm將參數(shù)結(jié)構(gòu)體按照對(duì)應(yīng)格式寫入配置文件。getnline從文件中取得最大長(zhǎng)度為n一行,并將回車翻譯為字符串結(jié)尾符trim刨去傳入字符串開頭和結(jié)尾的空格和tab配置文件參數(shù)處理(parm_handler.c)temp_hi_level設(shè)置參數(shù)結(jié)構(gòu)體的temp_hi_level參數(shù)temp_low_level設(shè)置參數(shù)結(jié)構(gòu)體的temp_low_level參數(shù)帶頭節(jié)點(diǎn)的雙向鏈表(list.c)移植自linux內(nèi)核list_add_node插入節(jié)點(diǎn)list_del_node刪除節(jié)點(diǎn)is_empty_list判斷鏈表是否為空is_last_node判斷是否為最后一個(gè)節(jié)點(diǎn)offsetof宏取得結(jié)構(gòu)體元素相對(duì)于結(jié)構(gòu)體開始的偏移量container_of宏通過結(jié)構(gòu)體元素的指針取得結(jié)構(gòu)體的指針循環(huán)緩沖區(qū)(loop_buf.c)移植自linux內(nèi)核min宏返回兩個(gè)數(shù)中的最小值init_loop_buf初始化循環(huán)緩沖區(qū)release_loop_buf釋放循環(huán)緩沖區(qū)里的線程鎖get_loop_buf從循環(huán)緩沖區(qū)中獲取數(shù)據(jù)put_loop_buf向循環(huán)緩沖區(qū)中放置數(shù)據(jù)lock_buf循環(huán)緩沖區(qū)線程鎖加鎖unlock_buf循環(huán)緩沖區(qū)中線程鎖解鎖loop_buf_reset循環(huán)緩沖區(qū)指針復(fù)位loop_buf_len返回循環(huán)緩沖區(qū)剩余長(zhǎng)度串口設(shè)備層操作(uart.c)init_uart調(diào)用底層串口庫初始化串口_monitor串口監(jiān)視線程,負(fù)責(zé)監(jiān)視并接受串口上數(shù)據(jù)。pre_frame_proces對(duì)串口接受數(shù)據(jù)預(yù)處理,調(diào)用相應(yīng)的操作函數(shù)read_uart_one_frame從串口讀取完整一楨read_uart_buf從緩沖區(qū)讀取數(shù)據(jù),沒有數(shù)據(jù)則休眠等待下次信號(hào)喚醒。串口操作庫(uart.c)open_uart打開相應(yīng)串口設(shè)備文件read_uart讀取串口數(shù)據(jù)。write_uart將數(shù)據(jù)寫入串口set_uart_speed設(shè)置串口工作速度set_uart_parity設(shè)置串口的工作特性,例如停止位奇偶流控等。read_uart_timeout帶有超時(shí)的串口讀取操作處理。UI通信(mui.c)init_mui初始化ui通信各個(gè)參數(shù)。mui_monitor套接字監(jiān)視線程,監(jiān)視套接字是否有命令數(shù)據(jù)到來。get_cmd_line從描述符中取得一行命令行warn_ui向ui發(fā)起報(bào)警命令處理程序(cmd.c)run_cmd命令解析器,調(diào)用對(duì)應(yīng)命令的處理程序。error根據(jù)錯(cuò)誤碼,將返回對(duì)應(yīng)得錯(cuò)誤信息。命令處理程序handler(cmd_handler.c)xxx_and_handler對(duì)應(yīng)各個(gè)命令的處理程序。門禁控制模塊ReadWiegand讀取用戶卡信息SendWiegand發(fā)送用戶卡信息SendCmd發(fā)送控制指令家居控制系統(tǒng)和環(huán)境探測(cè)模塊GetTem采集環(huán)境信息SendTem封包發(fā)送采集數(shù)據(jù)RecTem解析采集數(shù)據(jù)信息SendLedData發(fā)送led顯示數(shù)據(jù)GetTemFromCDLed模塊收取并解析溫度數(shù)據(jù)DisplayTem發(fā)送并顯示信息OpenLamp打開繼電器CloseLamp關(guān)閉繼電器2.2模塊關(guān)系圖3.設(shè)備管理系統(tǒng)的模塊設(shè)計(jì)模塊名稱init_dev功能描述初始化設(shè)備根節(jié)點(diǎn)接口與屬性voidinit_dev(void);數(shù)據(jù)結(jié)構(gòu)structdev{與算法pthread_mutex_lockmutex;unsignedintnr_dev;structlistlist;};補(bǔ)充說明包含設(shè)備編號(hào)和鏈表的線程鎖模塊名稱add_dev功能描述向設(shè)備鏈表中添加設(shè)備節(jié)點(diǎn)接口與屬性intadd_dev(chardev_type,chardev_no,char*ieee_addr);數(shù)據(jù)結(jié)構(gòu)structdev_node{與算法chardev_type;chardev_no;charieee_addr[8];charalive;charfailed;void*policy_table;structlistlist;};補(bǔ)充說明根據(jù)傳來的設(shè)備類型設(shè)備號(hào)及IEEE地址,分配新的設(shè)備節(jié)點(diǎn),并填寫相應(yīng)的項(xiàng)目然后調(diào)用模塊名稱del_dev功能描述從設(shè)備鏈表中刪除設(shè)備節(jié)點(diǎn)接口與屬性intdel_dev(chardev_type,chardev_no);數(shù)據(jù)結(jié)構(gòu)structdev_node{與算法chardev_type;chardev_no;charieee_addr[8];charalive;charfailed;void*policy_table;structlistlist;};補(bǔ)充說明模塊名稱init_dev_policy_table功能描述初始化設(shè)備策略表接口與屬性voidinit_dev_policy_table(structdev_node*node);數(shù)據(jù)結(jié)構(gòu)同上與算法補(bǔ)充說明模塊名稱renew_dev_policy_table功能描述將全局參數(shù)表的參數(shù)對(duì)應(yīng)節(jié)點(diǎn)的參數(shù)刷新到設(shè)備的策略表里接口與屬性voidrenew_dev_policy_table(structdev_node*node)數(shù)據(jù)結(jié)構(gòu)無與算法補(bǔ)充說明模塊名稱renew_all_dev_policy_table功能描述將全局參數(shù)表的參數(shù)刷新到所有設(shè)備的策略表里接口與屬性voidrenew_all_dev_policy_table(structdev_node*node)數(shù)據(jù)結(jié)構(gòu)無與算法補(bǔ)充說明模塊名稱update_dev_policy_table功能描述通過調(diào)用設(shè)備控制層相關(guān)方法,取得設(shè)備對(duì)應(yīng)狀態(tài),更新相應(yīng)策略表接口與屬性voidupdate_dev_policy_table(structdev_node*node)數(shù)據(jù)結(jié)構(gòu)structdev_node{與算法chardev_type;chardev_no;charieee_addr[8];charalive;charfailed;void*policy_table;structlistlist;};補(bǔ)充說明模塊名稱update_all_dev_policy_table功能描述更新所有設(shè)備策略表接口與屬voidupdate_all_dev_policy_table(structdev_node*node);性數(shù)據(jù)結(jié)構(gòu)同上與算法補(bǔ)充說明模塊名稱check_dev_type功能描述檢查設(shè)備類型是否合法接口與屬性intcheck_dev_type(unsignedchardev_type)數(shù)據(jù)結(jié)構(gòu)同上與算法補(bǔ)充說明模塊is_dev_exist名稱功能檢查設(shè)備是否存在描述接口intis_dev_exist(unsignedchardev_type,unsignedchardev_no)與屬性數(shù)據(jù)同上結(jié)構(gòu)與算法補(bǔ)充說明模get_dev_node塊名稱功根據(jù)設(shè)備類型和設(shè)備號(hào)返回設(shè)備節(jié)點(diǎn)指針能描述接structdev_node*get_dev_node(unsignedchardev_type,unsignedchardev_no)口與屬性數(shù)同上據(jù)結(jié)構(gòu)與算法補(bǔ)充說明4.策略管理模塊設(shè)計(jì)模塊名稱tempmon_policy_table_init功能描述溫度計(jì)策略表初始化接口與屬voidtempmon_policy_table_init(structdev_node*node);性數(shù)據(jù)結(jié)構(gòu)struct__dev_table{與算法unsignedchardev_type;void(*policy_table_init)(structdev_node*);void(*policy_table_load_parm)(structdev_node*);void(*policy_table_update)(structdev_node*);void(*policy_table_warn)(structdev_node*,char);void(*parm_table_save)(structdev_parm*,FILE*fp);};structtempmon_policy{charhi_level;charlow_level;charcur_temp;chartemp_warn;};補(bǔ)充說明為設(shè)備節(jié)點(diǎn)鐘的策略表指針分配內(nèi)存,并使用參數(shù)表中的值初始化對(duì)應(yīng)得設(shè)備。模塊名稱tempmon_policy_table_update功能描述調(diào)用設(shè)備層溫度計(jì)操作函數(shù),更新溫度計(jì)溫度策略表接口與屬voidtempmon_policy_table_update(structdev_node*node);性數(shù)據(jù)結(jié)構(gòu)同上與算法補(bǔ)充說明模tempmon_policy_table_set_warn塊名稱功根據(jù)傳來的參數(shù),設(shè)置對(duì)應(yīng)溫度計(jì)設(shè)備的報(bào)警狀態(tài)能描述接voidtempmon_policy_table_set_warn(structdev_node*node,charstat);口與屬性數(shù)同上據(jù)結(jié)構(gòu)與算法補(bǔ)充說明模塊tempmon_policy_table_load_parm名稱功能將溫度計(jì)參數(shù)表中的值填入策略表里描述接口voidtempmon_policy_table_load_parm(structdev_node*node)與屬性數(shù)據(jù)同上結(jié)構(gòu)與算法補(bǔ)充說明模塊tempmon_policy_table_load_default_parm名稱功能將溫度計(jì)默認(rèn)的參數(shù)填入策略表里描述接口voidtempmon_policy_table_load_parm(structdev_node*node)與屬性數(shù)據(jù)同上結(jié)構(gòu)與算法補(bǔ)充說明5.設(shè)備底層操作接口模塊設(shè)計(jì)模塊名稱tempmon_get_dev_stat功能描述取得溫度計(jì)設(shè)備狀態(tài)接口與屬性chartempmon_get_dev_stat(structdev_node*node);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明調(diào)用取得溫度計(jì)溫度判斷是否有返回值,判斷設(shè)備是否仍然有響應(yīng),如果設(shè)備沒有響應(yīng),則將設(shè)備節(jié)點(diǎn)中的設(shè)備狀態(tài)標(biāo)記為設(shè)備已死并調(diào)用failed_dev_ctl使設(shè)備節(jié)點(diǎn)操作失敗次數(shù)加1(考慮到網(wǎng)絡(luò)延遲等情況,采用設(shè)備操作失敗計(jì)數(shù),當(dāng)累計(jì)到操作失敗到指定次數(shù),則會(huì)調(diào)用del_dev將設(shè)備從設(shè)備鏈表中刪除。而任何一次成功的設(shè)備操作則判定設(shè)備再次有響應(yīng),模塊名稱tempmon_get_dev_stat功能描述取得溫度計(jì)當(dāng)前溫度接口與屬性chartempmon_get_cur_temp(structdev_node*node);數(shù)據(jù)結(jié)構(gòu)與structgen_frame{算法unsignedcharhead1;unsignedcharhead2;//always0x550xAAunsignedchartype;//frametypeWARNunsignedcharlen;//framelenunsignedchardev_type;//devicetypeunsignedchardev_no;//devicenocharstatus;};補(bǔ)充說明按照協(xié)議,組裝好設(shè)備的查詢數(shù)據(jù)包,從串口發(fā)出,并等待串口回應(yīng)。模tempmon_set_hi_level塊名稱功設(shè)置當(dāng)前溫度計(jì)最高報(bào)警溫度能描述接chartempmon_set_hi_level(structdev_node*node,charhigh_level);口與屬性數(shù)structcon_frame{據(jù)unsignedcharhead1;結(jié)unsignedcharhead2;構(gòu)unsignedchartype;與unsignedcharlen;算unsignedchardev_type;法unsignedchardev_no;unsignedcharcon_cmd;charcon_value;};補(bǔ)按照協(xié)議,組裝好設(shè)備的控制數(shù)據(jù)包,從串口發(fā)出,并調(diào)用取得設(shè)備溫充度,刷新設(shè)備狀態(tài)。說明模tempmon_set_low_level塊名稱功設(shè)置當(dāng)前溫度計(jì)最低報(bào)警溫度能描述接chartempmon_set_low_level(structdev_node*node,charhigh_level);口與屬性數(shù)structcon_frame{據(jù)unsignedcharhead1;結(jié)unsignedcharhead2;構(gòu)unsignedchartype;與unsignedcharlen;算unsignedchardev_type;法unsignedchardev_no;unsignedcharcon_cmd;charcon_value;};補(bǔ)按照協(xié)議,組裝好設(shè)備的控制數(shù)據(jù)包,從串口發(fā)出,并調(diào)用取得設(shè)備溫度,充刷新設(shè)備狀態(tài)。說明其他設(shè)備以此類類推。5.用戶認(rèn)證模塊設(shè)計(jì)模塊名稱auth_user功能描述根據(jù)傳來的用戶名和密碼返回驗(yàn)證結(jié)果接口與屬性charauth_user(char*name,char*pass);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明模塊名稱add_user功能描述根據(jù)傳來的用戶名和密碼將用戶添加到密碼文件中接口與屬性charadd_user(char*name,char*pass);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明模塊名稱del_user功能描述根據(jù)傳來的用戶名將用戶從密碼文件中刪除接口與屬性chardel_user(char*name);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明注意此處僅作用戶存在性檢查不做用戶檢查,用戶檢查應(yīng)該由UI發(fā)命令使用auth_user檢查通過后再來調(diào)用此函數(shù)。功能性模塊盡可能在自己被調(diào)用時(shí)提供方法而不是策略。模塊名稱change_pass功能描述根據(jù)傳來的用戶名和密碼將用戶從密碼文件中修改對(duì)應(yīng)的記錄接口與屬性charchange_pass(char*name,char*pass);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明注意事項(xiàng)同上。用戶配置文件格式為用戶名和密碼定長(zhǎng)不足定長(zhǎng)使用空格補(bǔ)足,分隔符為:防止頻繁修改文件大小,加劇NandFland的讀寫。6.配置文件處理模塊設(shè)計(jì)模塊名稱Load_parm功能描述解析器的前端,根據(jù)解析器的結(jié)果,拋出對(duì)應(yīng)得錯(cuò)誤接口與屬性intload_parm(char*fname)數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無模塊名稱do_parser功能描述解析器主體,根據(jù)傳進(jìn)來的文件指針,將文件中相應(yīng)的參數(shù)解析到全局參數(shù)表。接口與屬性intdo_parser(FILE*fp);數(shù)據(jù)結(jié)構(gòu)與structtemp_parm{算法inttemp_hi_level;inttemp_low_level;};unionparm{structtemp_parmtemp_parm;};structdev_parm{chardev_type;chardev_no;unionparmparm;};structparm_table{unsignedintnr_parm;structdev_parmdev_parm[NR_MAX_PARM];};structparm_action{charname[MAX_PARM_NAME_LEN];void(*func)(structdev_parm*,char*);};示例:structparm_actionparm_action[PARM_ACTION_LEN]={{"dev_type",load_dev_type},{"dev_no",load_dev_no},{"temp_hi_level",load_temp_hi_level},{"temp_low_level",load_temp_low_level},};補(bǔ)充說明模塊名稱save_parm功能描述根據(jù)傳進(jìn)來的文件名,將全局參數(shù)表存儲(chǔ)到配置文件中。接口與屬性intsave_parm(char*fname);數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明模塊名稱get_dev_parm功能描述根據(jù)傳來的設(shè)備類型和設(shè)備號(hào),返回對(duì)應(yīng)設(shè)備的參數(shù)指針接口與屬structdev_parm*get_dev_parm(chardev_type,chardev_no);性數(shù)據(jù)結(jié)構(gòu)同上與算法補(bǔ)充說明模塊名稱getnline功能描述根據(jù)傳進(jìn)來的文件指針,從中取得一行,此行最大長(zhǎng)度為count。接口與屬性size_tgetnline(char*buf,size_tcount,FILE*fp);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明會(huì)將行尾的回車符替換為字符串結(jié)束的尾零,并且遇到EOF時(shí)停止。返回值為實(shí)際取得的字符數(shù)(含尾零/模塊名稱trim功能描述將傳進(jìn)來的字符串頭尾的空格以及制表符砍去,然后將結(jié)果復(fù)制到dst。接口與屬性char*trim(char*dst,constchar*src);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明各個(gè)參數(shù)的handler:模塊名load_dev_type稱功能描將設(shè)備類型填入到傳入的dev_parm。述接口與voidload_dev_type(structdev_parm*dev_parm,char*value);屬性數(shù)據(jù)結(jié)無構(gòu)與算法補(bǔ)充說明模塊名load_dev_no稱功能描將設(shè)備號(hào)填入到傳入的dev_parm。述接口與voidload_dev_type(structdev_parm*dev_parm,char*value);屬性數(shù)據(jù)結(jié)無構(gòu)與算法補(bǔ)充說明模塊load_temp_hi_level名稱功能將溫度計(jì)最高報(bào)警溫度填入到傳入的dev_parm。描述接口voidload_temp_hi_level(structdev_parm*dev_parm,char*value)與屬性數(shù)據(jù)無結(jié)構(gòu)與算法補(bǔ)充說明模load_temp_low_level塊名稱功將溫度計(jì)最低報(bào)警溫度填入到傳入的dev_parm能描述接voidload_temp_low_level(structdev_parm*dev_parm,char*value)口與屬性數(shù)無據(jù)結(jié)構(gòu)與算法補(bǔ)充說明模塊名稱temp_parm_save功能描述將傳入的溫度計(jì)的dev_parm按照格式寫入到文件指針里接口與屬性voidtemp_parm_save(structdev_parm*dev_parm,FILE*fp)數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明7.帶頭節(jié)點(diǎn)雙向鏈表模塊設(shè)計(jì)模塊名稱init_list功能描述初始化鏈表頭節(jié)點(diǎn)接口與屬性voidinit_list(structlist*list);數(shù)據(jù)結(jié)構(gòu)與structlist{算法structlist*prev,*next;};補(bǔ)充說明模塊名list_add_node稱功能描將節(jié)點(diǎn)加入鏈表。述接口與voidlist_add_node(structlist*new,structlist*node,intlocat屬性ion);數(shù)據(jù)結(jié)同上構(gòu)與算法補(bǔ)充說可以使用location標(biāo)志指定插入node制定節(jié)點(diǎn)的左邊還是右邊,明如果node指向頭節(jié)點(diǎn),那么左邊及為鏈表尾部,右邊是鏈表頭。模塊名稱list_del_node功能描述將節(jié)點(diǎn)從量表中刪除接口與屬性voidlist_del_node(structlist*node);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明模塊名稱is_last_node功能描述判斷節(jié)點(diǎn)是否是鏈表的尾節(jié)點(diǎn)接口與屬性intis_last_node(structlist*list,structlist*node);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明真為尾節(jié)點(diǎn)模塊名稱is_empty_list功能描述返回鏈表是否為空鏈表接口與屬性intis_empty_list(structlist*list);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明真為空鏈表模塊名稱offsetof宏功能描述返回成員在結(jié)構(gòu)體中的偏移接口與屬性offsetof(TYPE,MEMBER);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明TYPE為對(duì)應(yīng)結(jié)構(gòu)體的類型,MEMBER為成員在結(jié)構(gòu)體中的名字模塊名稱get_node_owner宏功能描述傳入指向結(jié)構(gòu)體中成員的指針,返回指向結(jié)構(gòu)體的指針。接口與屬性get_node_owner(ptr,type,member);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明type,member定義同offsetof,ptr為指向結(jié)構(gòu)體中成員的指針。模塊名稱each_node_in_list宏功能描述使用pos指針遍歷結(jié)構(gòu)體。接口與屬性each_node_in_list(pos,head);數(shù)據(jù)結(jié)構(gòu)與#defineeach_node_in_list(pos,head)\算法for(pos=(head)->next;pos!=(head);pos=pos->next)補(bǔ)充說明注意不要在循環(huán)中修改pos指針。模each_owner_in_list宏塊名稱功使用pos指針遍歷結(jié)構(gòu)體,但是此pos的指針類型是鏈表宿主的,head節(jié)能點(diǎn)類型是鏈表類型。描述接each_owner_in_list(pos,type,member);口與屬性數(shù)#defineeach_owner_in_list(pos,head,member)\據(jù)for(pos=get_node_owner((head)->next,typeof(*pos),member);\結(jié)&pos->member!=(head);\構(gòu)pos=get_node_owner(pos->,typeof(*pos),member))與算法補(bǔ)同上。充說明8.循環(huán)緩沖區(qū)模塊設(shè)計(jì)模塊名稱init_loop_buf功能描述初始化循環(huán)緩沖區(qū)。接口與屬性intinit_loop_buf(structloop_buf*buf);數(shù)據(jù)結(jié)構(gòu)與structloop_buf{算法pthread_mutex_tmutex;unsignedcharbuffer[LOOP_BUF_LEN];unsignedintin;unsignedintout;};補(bǔ)充說明注意緩沖區(qū)大小必須為2的平方。模塊名稱release_loop_buf功能描述釋放循環(huán)緩沖區(qū)。接口與屬性voidrelease_loop_buf(structloop_buf*buf);數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明釋放結(jié)構(gòu)體中的線程鎖,同時(shí)復(fù)位緩沖區(qū)模put_loop_buf塊名稱功將數(shù)據(jù)放入循環(huán)緩沖區(qū)能描述接unsignedintput_loop_buf(structloop_buf*buf,unsignedchar*buffer,unsignedintlen口;與屬性數(shù)同上據(jù)結(jié)構(gòu)與算法補(bǔ)空間不足則只放入能放入的,返回值為實(shí)際放入數(shù)據(jù)長(zhǎng)度。充說明模get_loop_buf塊名稱功使用pos指針遍歷結(jié)構(gòu)體,但是此pos的指針類型是鏈表宿主的,head節(jié)點(diǎn)類型是鏈表能型。描述接unsignedintget_loop_buf(structloop_buf*buf,unsignedchar*buffer,unsignedintlen口;與屬性數(shù)同上據(jù)結(jié)構(gòu)與算法補(bǔ)同上。充說明模塊名稱lock_buf(structloop_buf*buf);功能描述鎖定循環(huán)緩沖區(qū)接口與屬性voidlock_buf(structloop_buf*buf);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。模塊名稱unlock_buf功能描述解鎖循環(huán)緩沖區(qū)接口與屬性voidunlock_buf(structloop_buf*buf);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。模塊名稱loop_buf_reset功能描述循環(huán)緩沖區(qū)復(fù)位接口與屬性voidloop_buf_reset(structloop_buf*buf);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。模塊名稱loop_buf_len功能描述返回循環(huán)緩沖區(qū)長(zhǎng)度接口與屬性u(píng)nsignedintloop_buf_len(structloop_buf*buf);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。9.串口操作層模塊設(shè)計(jì)模塊名稱init_uart功能描述按照本程序的需要調(diào)用串口庫初始化串口,并開啟監(jiān)聽線程接口與屬性voidinit_uart(void);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。模塊名稱_monitor功能描述串口監(jiān)聽線程實(shí)例接口與屬性void*_monitor(void*arg);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明首先調(diào)用read_uart_one_frame收到完整一楨,然后調(diào)用process_frame_buf處理由協(xié)調(diào)器主動(dòng)發(fā)起的添加設(shè)備楨和報(bào)警楨根據(jù)返回值判斷是否已經(jīng)處理,直接進(jìn)入下一個(gè)循環(huán)還是放入緩沖區(qū),供發(fā)起查詢的函數(shù)取得回應(yīng)包。模塊名稱read_uart_one_frame功能描述從串口中取得完整一楨接口與屬性ssize_tread_uart_one_frame(intfd,unsignedchar*buf);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明調(diào)用read_uart_timeout取得完整楨頭,然后進(jìn)行一系列楨檢查,非法楨直接丟棄返回0,合法楨則放入buf。模塊名稱read_uart_buf功能描述從緩沖區(qū)讀取數(shù)據(jù),沒有數(shù)據(jù)則休眠等待下次信號(hào)喚醒接口與屬性voidunlock_buf(structloop_buf*buf);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。10.串口操作庫模塊設(shè)計(jì)模塊名稱open_uart功能描述打開串口接口與屬性intopen_uart(char*fname);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。模塊名稱set_uart_speed功能描述設(shè)置串口速度接口與屬性intset_uart_speed(intfd,intspeed);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。模塊名稱set_uart_parity功能描述設(shè)置串口各種工作屬性接口與屬性intset_uart_parity(intfd,intdatabits,intstopbits,intparity);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明無。模read_uart_timeout塊名稱功在timeout規(guī)定的時(shí)間內(nèi)讀取指定的count字符個(gè)數(shù)能描述接ssize_tread_uart_timeout(intfd,void*buf,size_tcount,inttimeo口ut);與屬性數(shù)無據(jù)結(jié)構(gòu)與算法補(bǔ)無。充說明11.UI通信模塊設(shè)計(jì)模塊名稱init_mui功能描述創(chuàng)建與UI通信的線程初始化working信號(hào)量接口與屬性voidinit_mui(void);數(shù)據(jù)結(jié)構(gòu)與structmui_slot{算法pthread_mutex_tworking;intlink_sd;FILE*link_fp;};補(bǔ)充說明無。模塊名稱mui_monitor功能描述負(fù)責(zé)與UI通信的線程接口與屬性void*mui_monitor(void*arg);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明創(chuàng)建并初始化unix域套接字,監(jiān)聽套接字連接。收到連接后使用get_cmd_line取得一行命令,將命令及套接字連接描述符(用于命令處理handler返回執(zhí)行結(jié)果)一同傳給run_cmd,解析并運(yùn)行命令做出相應(yīng)的查詢/設(shè)置。模塊名稱get_cmd_line功能描述從文件指針取得一行命令接口與屬性intget_cmd_line(FILE*fp,char*buf);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明將結(jié)束符轉(zhuǎn)換為字符串結(jié)束符方便后面的處理模塊名稱warn_ui功能描述向ui報(bào)警接口與屬性voidwarn_ui(chardev_type,chardev_no,charstat);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明如果槽里的連接描述符可以,則使用槽里面的連接描述符向UI發(fā)送報(bào)警返回結(jié)果。寫連接描述符以前加鎖,避免與命令返回值相沖突。12.命令處理部分設(shè)計(jì)模塊名稱run_cmd功能描述運(yùn)行傳來的命令,使用提供的連接返回命令執(zhí)行結(jié)果。接口與屬性intrun_cmd(intfd,char*cmd)數(shù)據(jù)結(jié)構(gòu)與structcmd_action_table{算法charname[MAX_CMD_LEN];void(*func)(FILE*fp,char*sep);};示例:structcmd_action_tablecmd_action_table[]={{"GET",do_get},{"SET",do_set},{"USER",do_user},{"SAVE",do_save},};補(bǔ)充說明會(huì)復(fù)制新的描述符傳給下面的handler,所以handler中關(guān)閉描述符生成的文件指針不會(huì)關(guān)閉當(dāng)前連接。模塊名稱error功能描述根據(jù)傳進(jìn)來的錯(cuò)誤號(hào),將出錯(cuò)信息按照標(biāo)準(zhǔn)信息返回格式,返回到描述符上。接口與屬性voiderror(FILE*fp,interrorno);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明不會(huì)關(guān)閉傳入的文件指針。主Handler部分:模do_get塊名稱功解析get動(dòng)詞能描述接voiddo_get(FILE*fp,char*sep);口與屬性數(shù)structsub_cmd_action_table{據(jù)charname[MAX_CMD_LEN];結(jié)void(*get)(FILE*fp,char*sep);構(gòu)void(*set)(FILE*fp,char*sep);與}算示例:法structsub_cmd_action_tablesub_cmd_action_table[]={{"CONFIG",cmd_conf_get,cmd_conf_set},//getconfigfilename{"TEMP",cmd_temp_get,cmd_temp_set},};補(bǔ)根據(jù)取得接下來的命令目標(biāo),將剩余拆解的字符串傳給目充sub_cmd_action_table中對(duì)應(yīng)目標(biāo)的get函數(shù)指針?biāo)赶虻暮瘮?shù)。說明模塊名稱do_set功能描述解析set動(dòng)詞接口與屬性voiddo_set(FILE*fp,char*sep);數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明根據(jù)取得接下來的命令目標(biāo),將剩余拆解的字符串傳給目sub_cmd_action_table中對(duì)應(yīng)目標(biāo)的set函數(shù)指針?biāo)赶虻暮瘮?shù)。模塊名稱do_user功能描述解析user動(dòng)詞接口與屬性voiddo_user(FILE*fp,char*sep)數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明根據(jù)接下來的命令動(dòng)詞,對(duì)用戶認(rèn)證的各個(gè)功能做出響應(yīng),然后將返回的結(jié)果寫入到傳入的文件指針上。模塊名稱do_save功能描述解析save動(dòng)詞接口與屬性voiddo_save(FILE*fp,char*sep)數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明根據(jù)接下來的命令動(dòng)詞,將當(dāng)前的全局參數(shù)表格存到對(duì)應(yīng)的文件里,如不指定文件名,則存儲(chǔ)到默認(rèn)的文件里,并將結(jié)果按照返回格式返回到傳入的文件指針。子handler:模塊名稱cmd_conf_get功能描述解析到GETCONFIG后面的目標(biāo),遍歷CONFIG文件夾,將其中的配置文件名按照對(duì)應(yīng)的格式,返回到傳入的文件指針。接口與屬性voidcmd_conf_get(FILE*fp,char*sep);數(shù)據(jù)結(jié)構(gòu)與無算法補(bǔ)充說明模塊名稱cmd_conf_set功能描述解析到SETCONFIG后面的目標(biāo),調(diào)用load_parm解析對(duì)應(yīng)的配置文件,并renew策略表,將結(jié)果返回到傳入的文件指針。接口與屬性voidcmd_conf_get(FILE*fp,char*sep);數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明模塊名稱cmd_temp_get功能描述解析到GETTEMP后面的設(shè)備號(hào),按照返回格式,返回溫度計(jì)當(dāng)前狀態(tài)(策略表中),如果后面沒有跟設(shè)備號(hào),則根據(jù)返回格式,返回當(dāng)前網(wǎng)絡(luò)中所有溫度計(jì)設(shè)備號(hào)。接口與屬性voidcmd_conf_get(FILE*fp,char*sep);數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明模塊名稱cmd_temp_set功能描述解析到SETTEMP后面的參數(shù),按照命令格式,取得當(dāng)前命令中想要設(shè)置的最高值和最低值,并且使用修改全局參數(shù)表,如果全局參數(shù)表中沒有此設(shè)備的參數(shù)則創(chuàng)建設(shè)備的參數(shù)。接口與屬性voidcmd_temp_set(FILE*fp,char*sep)數(shù)據(jù)結(jié)構(gòu)與同上算法補(bǔ)充說明附命令通信協(xié)議:設(shè)備操作相關(guān):取得設(shè)備DEV_NO:UI發(fā)送:GET<分隔符><DEV_TYPE><結(jié)束符>UI接收:<狀態(tài)值><分隔符><DEV_NO><分隔符><DEV_NO><分隔符>……<DEV_NO><分隔符><結(jié)束符>狀態(tài)值DEV_NO_START返還設(shè)備號(hào)開始注意結(jié)束符前有一分隔符,如果無此類型的設(shè)備,則返回格式類似下面:<狀態(tài)值><分隔符><分隔符><結(jié)束符>溫度計(jì)相關(guān)命令:#defineMAX_TEMP125#defineMIN_TEMP-125#defineTEMP_POSION126//如果取到這個(gè)溫度則代表溫度獲取失敗取得狀態(tài):UI發(fā)送:GET<分隔符><DEV_TYPE><分隔符><DEV_NO><結(jié)束符>UI收到:<狀態(tài)值><分隔符><DEV_TYPE><分隔符><DEV_NO><分隔符><當(dāng)前溫度><分隔符><最高溫度><分隔符><最低溫度><結(jié)束符>狀態(tài)值成功SUCCESS可能失敗的狀態(tài)值ERROR_CMD_NOT_FOUND命令不完整ERROR_DEV_NOT_FOUND設(shè)備不存在設(shè)置狀態(tài):SET<分隔符><DEV_TYPE><分隔符><DEV_NO><分隔符><最高溫度><分隔符><最低溫度><結(jié)束符>UI接收到:<狀態(tài)值><分隔符><MESSAGE><結(jié)束符>成功SUCCESS可能失敗的狀態(tài)值ERROR_CMD_NOT_FOUND命令不完整ERROR_DEV_NOT_FOUND設(shè)備不存在配置文件相關(guān)命令:1.取得可用配置文件UI發(fā)送:GET<分隔符>CONFIG<結(jié)束符>UI接收:<狀態(tài)值><分隔符><FILENAME><分隔符>……<FILENAME><分隔符><結(jié)束符>成功狀態(tài)值為CONF_NAME_START777可能的失敗狀態(tài)ERROR_CONF_DIR_NOT_FOUND板上配置文件目錄打開失敗注意結(jié)束符前有一分隔符,如果無此類型的設(shè)備,則返回格式類似下面:<狀態(tài)值><分隔符><分隔符><結(jié)束符>2.載入指定配置文件UI發(fā)送SET<分隔符>CONFIG<分隔符><文件名><結(jié)束符>UI接收:<狀態(tài)值><分隔符><Message><結(jié)束符>成功狀態(tài)值為SUCCESS可能失敗的狀態(tài)值ERROR_CMD_CONFIG_NOT_FOUND配置文件載入失敗3.保存配置文件UI發(fā)送SAVE<分隔符>CONFIG<分隔符>[文件名]<結(jié)束符>如不指定文件名則配置將保存到默認(rèn)配置文件defalut中UI返回<狀態(tài)值><分隔符><Message><結(jié)束符>成功狀態(tài)值SUCCESS可能失敗的狀態(tài)值:ERROR_SAVE_CONF保存配置文件失敗用戶認(rèn)證相關(guān)命令:用戶認(rèn)證:UI發(fā)送:USER<分隔符>AUTH<分隔符><USERNAME><分隔符><PASSWORD><結(jié)束符>UI接收:<狀態(tài)值><分隔符><MESSAGE><結(jié)束符>成功狀態(tài)值為USER_AUTH_PASS或USER_AUTH_FAILED可能失敗的狀態(tài)ERROR_USER_AUTH密碼文件打開失敗用戶添加:UI發(fā)送:USER<分隔符>ADD<分隔符><USERNAME><分隔符><PASSWORD><結(jié)束符>UI接收:<狀態(tài)值><分隔符><MESSAGE><結(jié)束符>成功狀態(tài)值為SUCCESS可能失敗的狀態(tài)ERROR_USER_ADD添加用戶失敗用戶刪除:UI發(fā)送:USER<分隔符>DEL<用戶名><結(jié)束符>UI接收:<狀態(tài)值><分隔符><MESSAGE><結(jié)束符>成功狀態(tài)值為SUCCESS可能失敗的狀態(tài)ERROR_USER_DEL刪除用戶失敗用戶改密UI發(fā)送:USER<分隔符>PASS<用戶名><分隔符><新密碼><結(jié)束符>UI接收:<狀態(tài)值><分隔符><MESSAGE><結(jié)束符>成功狀態(tài)值SUCCESS可能失敗的狀態(tài)ERROR_USER_CHANGE_PASS用戶改密失敗、參數(shù):#defineMAX_CMD_LEN10//單個(gè)命令部分最長(zhǎng)值#defineMAX_CMD_LINE_LEN128//命令行最長(zhǎng)值#defineCMD_DELIM""http://分隔符#defineCMD_END"\r\n"http://結(jié)束符#defineSOCKKET_ADDR"homecore-socket"socket地址狀態(tài)值列表:#defineSUCCESS0//成功#defineERROR_CMD_NOT_FOUND1//#defineERROR_CMD_PARM_INVAILD2#defineERROR_DEV_NOT_FOUND3#defineCONF_NAME_START4#defineERROR_CMD_CONFIG_NOT_FOUND5#defineERROR_CONF_DIR_NOT_FOUND6#defineUSER_AUTH_PASS7#defineUSER_AUTH_FAILED8#defineERROR_USER_AUTH9#defineERROR_USER_ADD10#defineERROR_USER_DEL11#defineERROR_USER_CHANGE_PASS12#defineERROR_SAVE_CONF13#defineWARN_START14#defineDEV_NO_START1513.驅(qū)動(dòng)程序設(shè)計(jì)1.門禁驅(qū)動(dòng)程序設(shè)計(jì)根據(jù)門禁控制系統(tǒng)文檔,修改Linux內(nèi)核源代碼arch/arm下開發(fā)板相關(guān)文件(根據(jù)內(nèi)核版本不同,此處可能為mach-smdk2410或者是mach-s3c2410的CPLD內(nèi)存物理地址映射到的虛擬地址。驅(qū)動(dòng)程序設(shè)計(jì)初步實(shí)現(xiàn)read方法用于用戶態(tài)程序取得門禁控制系統(tǒng)返回的卡號(hào),ioctl方法用于用戶態(tài)程序?qū)崿F(xiàn)門的打開和關(guān)閉,一個(gè)中斷處理程序,負(fù)責(zé)響應(yīng)門禁控制系統(tǒng)的中斷。2.LCD驅(qū)動(dòng)移植根據(jù)LCD手冊(cè),將合適的參數(shù)填入到s3c2410fb_mach_info類型的結(jié)構(gòu)體中并在.int_machine所制定的初始化函數(shù)中將結(jié)構(gòu)體傳給platform_data(不同內(nèi)核版本此處調(diào)用不同),供驅(qū)動(dòng)程序加載。3.觸摸屏驅(qū)動(dòng)實(shí)現(xiàn)Open,read,release,fasync,poll方法,probe中設(shè)置對(duì)應(yīng)GPIO引腳,注冊(cè)中斷并在devfs中建立對(duì)應(yīng)設(shè)備節(jié)點(diǎn),read方法中從循環(huán)緩沖區(qū)中取得捕獲的數(shù)據(jù)返回個(gè)用戶態(tài)程序。在adc和觸摸屏的中斷中捕獲屏幕的坐標(biāo),將其放入循環(huán)緩沖區(qū)。4.音頻驅(qū)動(dòng)程序Probe中初始化GPIO引腳功能,申請(qǐng)IRQ注冊(cè),同時(shí)初始化uda1341,注冊(cè)聲卡dsp和mixer的操作方法,open方法打開時(shí)初始化循環(huán)緩沖區(qū),并且初始化iis總線的收發(fā)。在dsp的ioctl方法中實(shí)現(xiàn)音頻流各種參數(shù)的處理,在mixer的ioctl方法中實(shí)現(xiàn)聲音設(shè)備音量等處理。14.門禁控制系統(tǒng)設(shè)計(jì)一、教學(xué)用門禁子板接口說明:二、韋根讀卡器接口,DATA0DATA1GND和5V04CPLD8個(gè)I/O,分別為Wiegand1、Wiegand2、Wiegand3、Wiegand4;三、4個(gè)按鍵輸入,占用CPLD4個(gè)I/O,為KeyIN2個(gè)門狀態(tài)反饋輸入,占用CPLD2個(gè)I/O,為DoorSta;2個(gè)繼電器控制輸出,占用CPLD2個(gè)I/O,為ConOut1和ConOut2;1個(gè)中斷請(qǐng)求輸出,占用CPLD1個(gè)I/O,為INTR;1個(gè)片選輸入占用CPLD1個(gè)I/O,為CS5個(gè)地址線,占用CPLD5個(gè)I/O,為Addr(0,4)16個(gè)地址線,占用CPLD16個(gè)I/O,為Data(0,15)1個(gè)讀信號(hào),占用CPLD1個(gè)I/O,為RD1個(gè)寫信號(hào),占用CPLD1個(gè)I/O,為WR1個(gè)復(fù)位信號(hào),占用CPLD1個(gè)I/O,為RESET框圖如下圖所示:B四、和ARM板接口信號(hào)說明下圖為ARM板接口信號(hào)示意圖連接描述如下:DATA0~DATA15連接到Data(0,15)ADDR0~ADDR4連接到Addr(0,4)nOE連接到RD,變低表示開始讀nWE連接到WR,變低表示開始寫nGCS2連接到CS,ARM輸出低電平,表示選中CPLDGPA15連接到RESETARM輸出低電平,表示復(fù)位CPLD,工作狀態(tài)一直保持高電平EINT3連接到INTR,為ARM中斷輸入信號(hào),低電平五、工作過程描述數(shù)據(jù)流程如框圖所示:如果有事件發(fā)生(事件可能是四個(gè)讀卡器接口有數(shù)據(jù)輸入或門狀態(tài)異常),CPLD向ARM發(fā)中斷請(qǐng)求,請(qǐng)求處理。ARM響應(yīng)后發(fā)讀數(shù)據(jù)命令,CPLD把數(shù)據(jù)傳送給ARM,ARM判斷數(shù)據(jù)后,再把指令送給CPLD,CPLD根據(jù)指令是否執(zhí)行開關(guān)門操作。還有一種狀況是ARM直接發(fā)指令,讓門打開或關(guān)閉。六、關(guān)于韋根協(xié)議說明關(guān)于韋根協(xié)議說明:Wiegand協(xié)議是國(guó)際上統(tǒng)一的標(biāo)準(zhǔn),有很多格式,標(biāo)準(zhǔn)的26-bit應(yīng)該是最常用的格式。此外,還有34-bit、37-bit等格式。標(biāo)準(zhǔn)26位Wiegand通訊協(xié)議標(biāo)準(zhǔn)韋根輸出是由26位二進(jìn)制數(shù)組成,每一位的含義如下:26XXXXXXXXXXXXXXXXXXXXXXXXXX二進(jìn)制第1位為2—13位的偶校驗(yàn)位第2—9位對(duì)應(yīng)與電子卡HID碼的低8位第10-25位對(duì)應(yīng)電子卡的PID號(hào)碼第26位為14-25位的奇校驗(yàn)位這26位數(shù)據(jù)在讀出器的韋根輸出線D0,D1上輸出。數(shù)據(jù)輸出高位在前。所以CPLD支持各種協(xié)議的Wiegand協(xié)議,依靠標(biāo)準(zhǔn)協(xié)議來判斷是多少bit的格式,所以CPLD接收的Wiegan數(shù)據(jù)寄存器設(shè)計(jì)成最大48bit,為區(qū)別各個(gè)協(xié)議在每組數(shù)據(jù)包的最后三位置成標(biāo)志碼,所以最大支持45bit數(shù)據(jù)。000------表示26-bit標(biāo)準(zhǔn)協(xié)議001------表示27-bit協(xié)議010------表示32-bit協(xié)議011------表示34-bit協(xié)儀100------表示36-bit協(xié)議101-----表示37-bit協(xié)議七、實(shí)現(xiàn)方案1.在ARM復(fù)位后,發(fā)復(fù)位信號(hào),置GPA15為低,CPLD進(jìn)入工作狀態(tài)。2.如果有事件發(fā)生,CPLD發(fā)出中斷請(qǐng)求,把EINT3置高,ARM響應(yīng)中斷后讀CPLD中的數(shù)據(jù),具體的地址分配如下(reader對(duì)應(yīng)圖一的Wiegand)據(jù)寬度為16bit:Addr[4:0]AccessMode描述Wiegand1接口數(shù)據(jù)地址00000ReadonlyReader1datalow00001ReadonlyReader1datamid00010ReadonlyReader1datahighWiegand2接口數(shù)據(jù)地址00011Reader2datalow00100Reader2datamid00101Reader2datahighWiegand3接口數(shù)據(jù)地址00110Reader3datalow00111Reader3datamid01000Reader3datahighWiegand4接口數(shù)據(jù)地址01001Reader4datalow01010Reader4datamid01011Reader4datahigh狀態(tài)寄存器01100Readonly控制寄存器(門控制等信息)01101WriteonlyControlDoor由于公用一條中斷請(qǐng)求,所以ARM分不出是哪個(gè)中斷請(qǐng)求,所以ARM每次讀的時(shí)候把00000~01011地址的數(shù)據(jù)全部讀出,從而做出開關(guān)門判斷。如果有一組數(shù)據(jù)為全0,表示這一組沒有卡號(hào)輸入。讀出數(shù)據(jù)后,ARM寫控制寄存器命令即向地址01101寫入相關(guān)數(shù)據(jù)。Wiegand1和Wiegand2共同對(duì)應(yīng)ConOut1(1#doorWiegand3和Wiegand4共同對(duì)應(yīng)ConOut2(2#door狀態(tài)寄存器的詳細(xì)描述Bit15Bit14Bit13Bit12Bit11Bit10Bit9Bit8KS4KS3Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0KS2KS1WS4WS3WS2WS1DS2DS1DS1:1#doorstatus(0=正常1=異常)DS2:2#doorstatus(0=正常1=異常)WS1:Wiegand1status1號(hào)韋根對(duì)卡器狀況(0=讀卡器正常,1=讀卡器異常)WS2:Wiegand2status2號(hào)韋根對(duì)卡器狀況WS3:Wiegand3status3號(hào)韋根對(duì)卡器狀況WS4:Wiegand4status4號(hào)韋根對(duì)卡器狀況KS1:1#Keystatus1號(hào)鍵狀態(tài)(0=未按鍵,1=有按鍵)KS2:2#Keystatus2號(hào)鍵狀態(tài)(0=未按鍵,1=有按鍵)KS3:3#Keystatus3號(hào)鍵狀態(tài)(0=未按鍵,1=有按鍵)KS4:4#Keystatus4號(hào)鍵狀態(tài)(0=未按鍵,1=有按鍵)控制寄存器的詳細(xì)描述Bit15Bit14Bit13Bit12Bit11Bit10Bit9Bit8Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0DO2DO1DO1-----1#dooropen0=關(guān)1=開DO2-----2#dooropen0=關(guān)1=開六:具體模塊主要函數(shù)說明模塊名稱ReadWiegand功能描述從讀卡器讀取用戶信息,并提供后續(xù)處理接口與屬性BoolReadWiegand(void)補(bǔ)充說明當(dāng)讀取成功的時(shí)候,函數(shù)返回非0值,失敗返回-1模SendWiegand塊名稱功向用戶接口發(fā)送數(shù)據(jù),能描述接UnsignedcharSendWiegand(unsignedchar*data,unsignedcharlen)口與屬性補(bǔ)此函數(shù)發(fā)送成功,返回發(fā)送的字節(jié)數(shù)充說明模塊名稱SendCmd功能描述直接發(fā)送控制門的開和關(guān)接口與屬性VoidSendCmd(unsignedchardoor,unsignedcharstate)補(bǔ)充說明此函數(shù)指定控制幾號(hào)門(door)和門的狀態(tài)(開或關(guān))15.家居控制系統(tǒng)和環(huán)境探測(cè)模塊環(huán)境探測(cè)采用zigbee無線通訊技術(shù),通過溫度傳感器采集環(huán)境溫度,上報(bào)到家庭網(wǎng)關(guān),網(wǎng)關(guān)解析溫度數(shù)據(jù),實(shí)時(shí)的顯示溫度到led顯示屏幕,其結(jié)構(gòu)圖如下:家居控制主要涉及對(duì)繼電器的控制,通過繼電器的通或者斷來控制照明設(shè)備的開或者關(guān)。模塊主要涉及的功能函數(shù)說明如下:模塊名稱GetTem功能描述負(fù)責(zé)溫度采集接口與屬性VoidGetTem(unsignedchar*tmp)補(bǔ)充說明此功能函數(shù)負(fù)責(zé)采集溫度數(shù)據(jù)并封裝采集數(shù)據(jù)溫度值用兩個(gè)字節(jié)來存儲(chǔ)模塊名稱SendTem功能描述上報(bào)采集溫度數(shù)據(jù)接口與屬性VoidSendTem(unsignedinttem)補(bǔ)充說明此函數(shù)利用zigbee無線網(wǎng)絡(luò)傳遞溫度信息到家庭網(wǎng)關(guān)處理模塊名稱RecTem功能描述網(wǎng)關(guān)解析溫度數(shù)據(jù)包接口與屬性VoidRecTem(void)補(bǔ)充說明此函數(shù)解析接收包含了溫度值的無線數(shù)據(jù)包模SendLedData塊名稱功網(wǎng)關(guān)封裝溫度數(shù)據(jù)幀并發(fā)送溫度顯示命令到led顯示模塊能描述接UnsignedcharSendLedData(unsignedchar*leddata,unsignedcharlen)口與屬性補(bǔ)無充說明模塊名稱GetTemFromCD功能描述LED顯示模塊接收并解析溫度數(shù)據(jù)幀接口與屬性VoidGetTemFromCD(VOID)補(bǔ)充說明無模塊DisplayTem名稱功能Led顯示模塊控制led屏幕顯示溫度值描述接口UnsignedcharDisplayTem(unsignedchartem[],unsignedcharlen)與屬性補(bǔ)充函數(shù)執(zhí)行成功返回非0值,失敗返回-1說明模塊名稱OpenLamp功能描述打開繼電器控制照明設(shè)備接口與屬性VoidOpenLamp(void)補(bǔ)充說明實(shí)現(xiàn)照明設(shè)備的打開模塊名稱CloseLamp功能描述關(guān)閉繼電器控制照明設(shè)備接口與屬性VoidCloseLamp(void)補(bǔ)充說明實(shí)現(xiàn)照明設(shè)備的關(guān)斷16.人機(jī)交互界面模塊設(shè)計(jì)人機(jī)交互模塊采用基于Armlinux下的GUI-Qt應(yīng)用程序開發(fā)來完成,用戶通過在LCD上顯示的軟件界面,輔助觸摸屏來完成各項(xiàng)操作,其結(jié)構(gòu)圖如下:主界面的視圖;煤氣火警報(bào)警信息顯示窗磁開關(guān)門磁模式遙控器溫度計(jì)退出主

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論