[{"id":"52332e6f.c1be3","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"horizonExpress","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"x":160,"y":160,"wires":[["2498393f.ce2746"]]},{"id":"94e30749.4b6cb8","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"local","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"x":130,"y":200,"wires":[["2498393f.ce2746"]]},{"id":"2498393f.ce2746","type":"function","z":"7cadc4a0.74ec1c","name":"switch track to subway loop","func":"msg.payload = {\"command\":{\"trackSwitch.a\":\"straight\"}};\nreturn msg;","outputs":1,"noerr":0,"x":160,"y":120,"wires":[["b6e47118.febdc"]]},{"id":"acd42b86.03b128","type":"function","z":"7cadc4a0.74ec1c","name":"train forward","func":"msg.payload = {\"command\":{\"motor\":1024}};\nreturn msg;","outputs":1,"noerr":0,"x":110,"y":380,"wires":[["8564b611.34ae88"]]},{"id":"f0e31ee2.437df","type":"comment","z":"7cadc4a0.74ec1c","name":"check if tracks are occupied","info":"","x":620,"y":120,"wires":[]},{"id":"83872c03.01b48","type":"comment","z":"7cadc4a0.74ec1c","name":"check if tracks are occupied","info":"","x":620,"y":360,"wires":[]},{"id":"1e631817.fc9968","type":"function","z":"7cadc4a0.74ec1c","name":"stop at subway","func":"msg.payload = {\"command\":{\"motor\":0}}\nreturn msg;","outputs":1,"noerr":0,"x":120,"y":580,"wires":[["5d54af4.64fe25"]]},{"id":"9bac8925.0a2918","type":"delay","z":"7cadc4a0.74ec1c","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":100,"y":760,"wires":[["2498393f.ce2746"]]},{"id":"af652839.d48708","type":"comment","z":"7cadc4a0.74ec1c","name":"stop when train detetected at subway","info":"","x":650,"y":580,"wires":[]},{"id":"b6e47118.febdc","type":"function","z":"7cadc4a0.74ec1c","name":"message","func":"var newMsg = {}\nnewMsg.payload = msg;\nnewMsg.topic = \"message\";\nreturn newMsg;","outputs":1,"noerr":0,"x":380,"y":120,"wires":[["2014f560.20d98a"]]},{"id":"2298bc3d.dfa5d4","type":"function","z":"7cadc4a0.74ec1c","name":"state ","func":"// save state\ncontext.state = context.state || {};\ncontext.state[msg.topic] = msg.payload;\n\n// check all states status\nvar sensors = 0;\nvar keys = Object.keys(context.state);\nfor (var i = 0; i < keys.length; i++) {\n sensors += context.state[keys[i]];\n}\n\n/*\nif (sensors < 1){\n node.status({fill:\"gray\",shape:\"ring\",text:\"safe: \"+sensors}); \n return context.msg;\n}else{\n node.status({fill:\"red\",shape:\"ring\",text:\"unsafe: \"+sensors});\n}\n*/\n\nnode.status({fill:\"gray\",shape:\"ring\",text:\"Sensors: \"+sensors});\nmsg.topic = \"state\";\nmsg.payload = sensors;\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":160,"wires":[["2014f560.20d98a"]]},{"id":"2014f560.20d98a","type":"function","z":"7cadc4a0.74ec1c","name":"Gate: <1","func":"// Store states and msg based on origin\ncontext.state = context.state || 0;\ncontext.msg = context.msg || {};\nswitch(msg.topic){\n case \"message\":\n // save original msg\n context.msg = msg.payload;\n break;\n \n case \"state\":\n // save state\n context.state = msg.payload;\n break;\n}\n\n// LOGIC GATE -- if no sensors active, then send command.\nif(context.state < 1){\n node.status({fill:\"green\",shape:\"ring\",text:\"Sent: \"+JSON.stringify(context.msg)}); \n msg.payload = context.msg;\n // reset msg\n context.msg = undefined; \n return msg.payload; // the payload contains the original msg object\n}else{\n node.status({fill:\"red\",shape:\"ring\",text:\"Waiting: \"+JSON.stringify(context.msg)}); \n}\n \n//return msg;","outputs":1,"noerr":0,"x":560,"y":160,"wires":[["b8ba9111.e92bc","acd42b86.03b128"]]},{"id":"1bb9bd92.3bf402","type":"rbe","z":"7cadc4a0.74ec1c","name":"","func":"rbe","gap":"","x":270,"y":260,"wires":[["2298bc3d.dfa5d4"]]},{"id":"8b85c1e8.42b3a","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"trackA","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"x":140,"y":240,"wires":[["1bb9bd92.3bf402"]]},{"id":"b8ba9111.e92bc","type":"debug","z":"7cadc4a0.74ec1c","name":"subway track switch","active":true,"console":"false","complete":"true","x":780,"y":160,"wires":[]},{"id":"3af4581.02c83a8","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"trackA","payload":"0","payloadType":"num","repeat":"","crontab":"","once":false,"x":140,"y":280,"wires":[["1bb9bd92.3bf402"]]},{"id":"8564b611.34ae88","type":"function","z":"7cadc4a0.74ec1c","name":"message","func":"var newMsg = {}\nnewMsg.payload = msg;\nnewMsg.topic = \"message\";\nreturn newMsg;","outputs":1,"noerr":0,"x":380,"y":380,"wires":[["4a1d760d.f2b038"]]},{"id":"cad742f5.0f6df","type":"function","z":"7cadc4a0.74ec1c","name":"state ","func":"// save state\ncontext.state = context.state || {};\ncontext.state[msg.topic] = msg.payload;\n\n// check all states status\nvar sensors = 0;\nvar keys = Object.keys(context.state);\nfor (var i = 0; i < keys.length; i++) {\n sensors += context.state[keys[i]];\n}\n\n/*\nif (sensors < 1){\n node.status({fill:\"gray\",shape:\"ring\",text:\"safe: \"+sensors}); \n return context.msg;\n}else{\n node.status({fill:\"red\",shape:\"ring\",text:\"unsafe: \"+sensors});\n}\n*/\n\nnode.status({fill:\"gray\",shape:\"ring\",text:\"Sensors: \"+sensors});\nmsg.topic = \"state\";\nmsg.payload = sensors;\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":420,"wires":[["4a1d760d.f2b038"]]},{"id":"4a1d760d.f2b038","type":"function","z":"7cadc4a0.74ec1c","name":"Gate: <1","func":"// Store states and msg based on origin\ncontext.state = context.state || 0;\ncontext.msg = context.msg || {};\nswitch(msg.topic){\n case \"message\":\n // save original msg\n context.msg = msg.payload;\n break;\n \n case \"state\":\n // save state\n context.state = msg.payload;\n break;\n}\n\n// LOGIC GATE -- if no sensors active, then send command.\nif(context.state < 1){\n node.status({fill:\"green\",shape:\"ring\",text:\"Sent: \"+JSON.stringify(context.msg)}); \n msg.payload = context.msg;\n // reset msg\n context.msg = undefined; \n return msg.payload; // the payload contains the original msg object\n}else{\n node.status({fill:\"red\",shape:\"ring\",text:\"Waiting: \"+JSON.stringify(context.msg)}); \n}\n \n//return msg;","outputs":1,"noerr":0,"x":560,"y":420,"wires":[["e8e28516.a13d88","1e631817.fc9968"]]},{"id":"f3d08745.e4b7f8","type":"rbe","z":"7cadc4a0.74ec1c","name":"","func":"rbe","gap":"","x":270,"y":480,"wires":[["cad742f5.0f6df"]]},{"id":"99258234.9e2cd","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"trackA","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"x":140,"y":460,"wires":[["f3d08745.e4b7f8"]]},{"id":"e8e28516.a13d88","type":"debug","z":"7cadc4a0.74ec1c","name":"train forward","active":true,"console":"false","complete":"true","x":750,"y":420,"wires":[]},{"id":"65917631.90cc08","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"trackA","payload":"0","payloadType":"num","repeat":"","crontab":"","once":false,"x":140,"y":500,"wires":[["f3d08745.e4b7f8"]]},{"id":"5d54af4.64fe25","type":"function","z":"7cadc4a0.74ec1c","name":"message","func":"var newMsg = {}\nnewMsg.payload = msg;\nnewMsg.topic = \"message\";\nreturn newMsg;","outputs":1,"noerr":0,"x":380,"y":580,"wires":[["e3a4c8bb.53dcc8"]]},{"id":"72084afc.5c3bc4","type":"function","z":"7cadc4a0.74ec1c","name":"state ","func":"// save state\ncontext.state = context.state || {};\ncontext.state[msg.topic] = msg.payload;\n\n// check all states status\nvar sensors = 0;\nvar keys = Object.keys(context.state);\nfor (var i = 0; i < keys.length; i++) {\n sensors += context.state[keys[i]];\n}\n\n/*\nif (sensors < 1){\n node.status({fill:\"gray\",shape:\"ring\",text:\"safe: \"+sensors}); \n return context.msg;\n}else{\n node.status({fill:\"red\",shape:\"ring\",text:\"unsafe: \"+sensors});\n}\n*/\n\nnode.status({fill:\"gray\",shape:\"ring\",text:\"Sensors: \"+sensors});\nmsg.topic = \"state\";\nmsg.payload = sensors;\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":620,"wires":[["e3a4c8bb.53dcc8"]]},{"id":"e3a4c8bb.53dcc8","type":"function","z":"7cadc4a0.74ec1c","name":"Gate >= 1","func":"// Store states and msg based on origin\ncontext.state = context.state || 0;\ncontext.msg = context.msg || {};\nswitch(msg.topic){\n case \"message\":\n // save original msg\n context.msg = msg.payload;\n break;\n \n case \"state\":\n // save state\n context.state = msg.payload;\n break;\n}\n\n// LOGIC GATE -- if no sensors active, then send command.\nif(context.state >= 1){\n node.status({fill:\"green\",shape:\"ring\",text:\"Sent: \"+JSON.stringify(context.msg)}); \n msg.payload = context.msg;\n // reset msg\n context.msg = undefined; \n return msg.payload; // the payload contains the original msg object\n}else{\n node.status({fill:\"red\",shape:\"ring\",text:\"Waiting: \"+JSON.stringify(context.msg)}); \n}\n \n//return msg;","outputs":1,"noerr":0,"x":560,"y":620,"wires":[["7f5a79e4.e89b68","9bac8925.0a2918"]]},{"id":"ebdeaeb1.1fb3","type":"rbe","z":"7cadc4a0.74ec1c","name":"","func":"rbe","gap":"","x":270,"y":680,"wires":[["72084afc.5c3bc4"]]},{"id":"a643b789.2d7758","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"subway","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"x":140,"y":660,"wires":[["ebdeaeb1.1fb3"]]},{"id":"1354f75f.587aa9","type":"inject","z":"7cadc4a0.74ec1c","name":"","topic":"subway","payload":"0","payloadType":"num","repeat":"","crontab":"","once":false,"x":140,"y":700,"wires":[["ebdeaeb1.1fb3"]]},{"id":"7f5a79e4.e89b68","type":"debug","z":"7cadc4a0.74ec1c","name":"stop at subway","active":true,"console":"false","complete":"true","x":760,"y":620,"wires":[]},{"id":"c0ee4af1.2b76e8","type":"inject","z":"7cadc4a0.74ec1c","name":"cmd","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":130,"y":620,"wires":[["1e631817.fc9968"]]},{"id":"573b2a96.b82ed4","type":"inject","z":"7cadc4a0.74ec1c","name":"cmd","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":130,"y":420,"wires":[["acd42b86.03b128"]]},{"id":"192f4d35.7874a3","type":"comment","z":"7cadc4a0.74ec1c","name":"Action","info":"","x":110,"y":40,"wires":[]},{"id":"8ecbd8ca.a6f8b8","type":"comment","z":"7cadc4a0.74ec1c","name":"Condition","info":"","x":560,"y":40,"wires":[]},{"id":"def4c08e.9c879","type":"comment","z":"7cadc4a0.74ec1c","name":"Output","info":"","x":770,"y":40,"wires":[]}]