From 26f9d9ce2650dd225e011fec49641572f3b85796 Mon Sep 17 00:00:00 2001 From: Joe Zhao Date: Fri, 23 May 2014 19:06:08 +0800 Subject: Global emu debugged --- cmdiface.erl | 7 ++++--- devicemon.erl | 9 ++++----- eventserv.erl | 2 +- portman.erl | 10 +++++----- rsbusserv.erl | 29 ++++++++++++++++------------- startscript.erl | 21 ++++++++++++--------- tcpserv.erl | 4 ++-- 7 files changed, 44 insertions(+), 38 deletions(-) diff --git a/cmdiface.erl b/cmdiface.erl index 0b7e84c..3113c03 100644 --- a/cmdiface.erl +++ b/cmdiface.erl @@ -16,10 +16,10 @@ reg_feedbackOps(Addr,Name,T,MsgReq,MsgRes,To) -> io:format("Logging new command: ~p ~n",[Name]), - Init=fun () -> rsbusserv ! {devicemon,Addr,MsgReq} end, + Init=fun () -> rsbusserv ! {devicemon,comm,Addr,MsgReq} end, Exit= fun () -> - rsbusserv ! {devicemon,Addr,[]} + rsbusserv ! {devicemon,comm,Addr,[]} end, Pid = spawn(?MODULE,res_manip,[Init,Exit,To]), Call = @@ -35,6 +35,7 @@ invoke_cmd(Addr,Name,MsgReq) -> res_manip(Init,Exit,To) -> Init(), receive - Res -> To ! Res + {stat,_Type,Stat} -> To ! {self(),comm,Stat}; + {error,_Cause} -> ok end, Exit(). \ No newline at end of file diff --git a/devicemon.erl b/devicemon.erl index 84c2849..703dca5 100644 --- a/devicemon.erl +++ b/devicemon.erl @@ -86,9 +86,8 @@ deviceloop(Devices) -> deviceloop(Devices) end. -devicemon() -> +devmon() -> register(?MODULE,self()), - spawn(?MODULE,devicepool,[?ADDRANGE]), deviceloop(orddict:new()). getStat(Addr) -> @@ -100,13 +99,13 @@ getStat(Addr) -> error end. -getStaus(Addr) -> +getStatus(Addr) -> case getStat(Addr) of error -> error; - Val -> Val + Val -> ready %% device status multiplexer %% ready | busy end. start() -> - spawn(?MODULE,devicemon,[]). \ No newline at end of file + spawn(?MODULE,devmon,[]). \ No newline at end of file diff --git a/eventserv.erl b/eventserv.erl index dc4dcde..85ee34d 100644 --- a/eventserv.erl +++ b/eventserv.erl @@ -26,7 +26,7 @@ event(Pid,S) -> after S#event.period -> Pid ! {self(),run,S}, if - S#event.spawn -> spawn(S#event.call,[self()]); + %% S#event.spawn -> spawn(S#event.call,[self()]); true -> (S#event.call)(self()) end, case S#event.type of diff --git a/portman.erl b/portman.erl index 393a566..3076a39 100644 --- a/portman.erl +++ b/portman.erl @@ -10,11 +10,14 @@ -author("Tuowen"). %% API --export([start/1,serv/1,send/2]). +-export([start/1,serv/1]). oploop(Sock) -> receive {Pid,shutdown} -> ok; + {tcp,Sock,Msg} -> + io:format("~p\n",[Msg]), + oploop(Sock); {Pid,Msg} -> gen_tcp:send(Sock,Msg), oploop(Sock) @@ -27,7 +30,4 @@ serv({Host,Port}) -> ok = gen_tcp:close(Sock). start(Config) -> - spawn(?MODULE,serv,[Config]). - -send(Pid,Msg) -> - Pid ! {self(),Msg}. \ No newline at end of file + spawn(?MODULE,serv,[Config]). \ No newline at end of file diff --git a/rsbusserv.erl b/rsbusserv.erl index 997e590..b9eec5b 100644 --- a/rsbusserv.erl +++ b/rsbusserv.erl @@ -17,14 +17,15 @@ %% API %% -export([start/0]). --define(DEVICE,"/dev/ttyUSB0"). --define(SPEED,19200). --define(TIMEOUT,40). % Timeout in milisec --define(REQTIMEOUT,200). +-define(DEVICE,"/dev/ttyACM0"). +-define(SPEED,9600). +-define(TIMEOUT,10). % Timeout in milisec +-define(REQTIMEOUT,1000). -define(STARTBIT,[16#5B,16#AD]). -define(STOPBIT,[16#A4,16#52]). -define(REP,16#FF). +-define(ERR,16#F0). rsbuslistener(Pid) -> SerialPort = serial:start([{speed,?SPEED},{open,?DEVICE}]), @@ -42,12 +43,12 @@ rsbus_rec([H1,H2,H3|Tail],read,Msg,Cmp) -> rsbus_rec([H2,H3|Tail],read,[H1|Msg],Cmp); rsbus_rec([H1,H2,H3,H4|Tail1],wait,[],[H1,H2,H3,H4]) -> rsbus_rec(Tail1,read,[],?STOPBIT); -rsbus_rec([H|Tail],wait,[],Cmp) -> - rsbus_rec(Tail,wait,[],Cmp); +rsbus_rec([H1,H2,H3,H4|Tail],wait,[],Cmp) -> + rsbus_rec([H2,H3,H4|Tail],wait,[],Cmp); rsbus_rec(Rec,State,Msg,Cmp) -> receive {data, Bytes} -> - erlang:display(binary_to_list(Bytes)), + %% io:format("~p\n",[Rec++binary_to_list(Bytes)]), rsbus_rec(Rec++binary_to_list(Bytes),State,Msg,Cmp) after ?TIMEOUT -> {error,timeout} @@ -62,14 +63,15 @@ rsbus_send(SerialPort,Addr,Msg) -> P=rsbus_parity(Msg) bxor Addr, SerialPort ! {send,[P]}, SerialPort ! {send,?STOPBIT}, - io:format("Send Complete!\n"), + %% io:format("Send Complete!\n"), case rsbus_rec([],wait,[],?STARTBIT++[0,Addr]) of {stat,[?REP],RP} -> rsbus_send(SerialPort,Addr,Msg); % Will resend no matter what + {stat,[?ERR],RP} -> {error,parse}; % State Reject {stat,Stat,RP} -> erlang:display(RP), TestP =rsbus_parity([RP|Stat]), if - TestP /= Addr -> {err,parse}; + TestP /= Addr -> {error,parse}; true -> {stat,hd(Stat),tl(Stat)} end; {error,timeout} -> {error,timeout} @@ -78,14 +80,14 @@ rsbus_send(SerialPort,Addr,Msg) -> %% This function can effectively serialize access rsbus_listner(Pid,SerialPort) -> - erlang:display(self()), + %% erlang:display(self()), receive {data, _Bytes} -> %% This shouldn't happen, no process should initiate comm %% Discard everything rsbus_listner(Pid,SerialPort); {PPid,comm,Addr,Msg} -> - io:format("RSBus sending..."), + %% io:format("RSBus sending..."), PPid ! {self(),device,Addr,rsbus_send(SerialPort,Addr,Msg)}, % Process and return rsbus_listner(Pid,SerialPort); {Pid,shutdown} -> @@ -109,9 +111,10 @@ rsbusreq(Addr,Msg) -> receive {PPid,device,Addr,{error,Reason}} -> {error,Reason}; - {PPid,device,Addr,{stat,Type,Msg}} -> - {stat,Type,Msg} + {PPid,device,Addr,Stat} -> + Stat after ?REQTIMEOUT -> + erlang:display("here"), {error,timeout} end. diff --git a/startscript.erl b/startscript.erl index a281211..2ac9ef7 100644 --- a/startscript.erl +++ b/startscript.erl @@ -15,11 +15,11 @@ -include("devicemon.hrl"). --define(HBPERIOD,500). --define(SCANPERIOD,2000). +-define(HBPERIOD,1000). +-define(SCANPERIOD,3000). busbeater(Pid,Addr) -> - case devicemon:getStaus(Addr) of + case devicemon:getStatus(Addr) of error -> spawnscanner(Addr), Pid ! {self(),shutdown}; @@ -38,7 +38,7 @@ busbeater(Pid,Addr) -> busscanner(Pid,Addr) -> %% if devicemon:getStat(Addr) %% Add device status multiplexer here - case devicemon:getStaus(Addr) of + case devicemon:getStatus(Addr) of error -> case rsbusserv:rsbusreq(Addr,[]) of {stat,Type,Stat} -> @@ -46,6 +46,7 @@ busscanner(Pid,Addr) -> spawnbeater(Addr), Pid ! {self(),shutdown}; {error,Cause} -> + erlang:display(Cause), devicemon ! {self(),dereg,Addr} end; _Else -> @@ -65,9 +66,11 @@ runrange(St,Ed,Fun) -> runrange(St+1,Ed,Fun). start() -> - Tcp=tcpserv:start(5575), - Rsbus=rsbusserv:start(), - Evserv=eventserv:start(), - Devmon=devicemon:start(), - runrange(1,10,fun (Addr)->spawnscanner(Addr) end). + tcpserv:start(5575), + rsbusserv:start(), + eventserv:start(), + devicemon:start(), + runrange(1,1,fun (Addr)->spawnscanner(Addr) end). +test() -> + portman:start({"127.0.0.1",5575}). diff --git a/tcpserv.erl b/tcpserv.erl index 91a25a6..808bcba 100644 --- a/tcpserv.erl +++ b/tcpserv.erl @@ -45,10 +45,10 @@ do_recv(Sock,Pid,To,Cnt) -> %% Message manipulation & dispatch routine manip_msg(Pid,To,[0,0,Addr,MsgReq,MsgRes|Name]) -> %% Operation command dispatch -> Complex(devicemon + Message handler) - cmdiface:reg_feedbackOps(Addr,Name,?DLYTIME,MsgReq,MsgRes,To); + cmdiface:reg_feedbackOps(Addr,Name,?DLYTIME,[MsgReq],[MsgRes],To); manip_msg(Pid,To,[0|Tail]) -> %% Seperation from the next part - devicemon ! [0|Tail]; + devicemon ! {To,comm,[0|Tail]}; manip_msg(Pid,To,[Addr,Cmd|Name]) when Addr<10 -> %% Seperation from the next part cmdiface:invoke_cmd(Addr,Name,[Cmd]); -- cgit v1.2.3-70-g09d2