Adding direct door access commands and interface

This commit is contained in:
2013-12-02 02:03:40 -07:00
parent d2434be109
commit 41a8431be5
13 changed files with 300 additions and 11 deletions

View File

@@ -1,8 +1,10 @@
<h1>Access Cards</h1>
<%= link_to 'New Card', new_card_path if can? :create, Card %>
<%= link_to 'Upload all cards', upload_all_path if can? :upload_all, Card %>
<%= link_to 'Door Logs', door_logs_path if can? :read, DoorLog %>
<%= link_to 'New Card', new_card_path, :class => "btn" if can? :create, Card %>
<%= link_to 'Upload all cards', upload_all_path, :class => "btn" if can? :upload_all, Card %>
<%= link_to 'Door Logs', door_logs_path, :class => "btn" if can? :read, DoorLog %>
<%= link_to 'Space API', space_api_path, :class => "btn" %>
<%= link_to 'Remote Door Access', space_api_access_path, :class => "btn" if can? :access_doors_remotely, :door_access %>
<p>
<b>Most Active Card Last Month:</b> <%= @most_active_card.name unless @most_active_card.blank? %> (<%= @most_active_card.accesses_this_week unless @most_active_card.blank? %> days)
</p>

View File

@@ -8,6 +8,17 @@ Guide to Card Number storage:
cardnum = (R+(r*32767)), convert to hex
Guide to log keys and data:
Commands:
* rem_ = remote command issues via web UI (#=user id)
Statuses:
* armed = current status of alarm arming
* activated = current status of alarm ringing
* alarm_2 = current status of alarm sensor 2
* alarm_3 = current status of alarm sensor 3
* door_1_locked = status of door 1
* door_2_locked = status of door 2
Log Entries:
* A=alarm armed (# level)
* a=added user (# usernum)
* C=keypad command (# command)

View File

@@ -47,6 +47,9 @@
<td>
<h2>Member Resources</h2>
<% if can? :access_doors_remotely, :door_access %>
<ul><li><%= link_to "Remote Door Access", space_api_access_path %></li></ul>
<% end %>
<%= simple_format Setting.member_resources_inset %>
</td>

View File

@@ -8,7 +8,7 @@
</head>
<body>
<div id="header">
<a href="/" title="Home"><img src="/assets/logo.png" id="logo" /></a>
<a id="home_nav_link" href="/" title="Home"><img src="/assets/logo.png" id="logo" /></a>
<%= link_to 'People', users_path if can? :read, User %>
<%= link_to 'Access Cards', cards_path if can? :manage, Card %>
<% if can? :create, UserCertification %>

View File

@@ -0,0 +1,114 @@
<h2 id="title">Door Control System</h2>
<% if @output %>
<p class="notice">
<%= raw @output %>
</p>
<hr/>
<% end %>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style type="text/css">
#status, #status span { display: inline-block; text-align: center; font-weight: bold; border-radius: 5px; }
#status { width: 400px;}
#status span { border: 1px solid black; width: 180px; padding: 5px; }
#status span input { width: 100%; margin: 0.2em 0;}
@media only screen and (max-width: 480px){
#header a:not(#home_nav_link) { display: none; }
#title {
position: absolute;
top: 0;
left: 45px;
}
#status { width: 100%; }
#status span { width: 45%; border: none; padding: 1%; margin: 1em 0; }
#status span input { font-size: 1.8em; height: 2em;}
}
.open { background-color: green; }
.closed { background-color: red; }
.open input.unlock, .closed input.lock { background: #bbb; }
</style>
<script type="text/javascript">
function updateDoorStatus(){
// grab status from space api
$.get( "<%= space_api_path(:format => :json) %>", function( data ) {
switch(data.status){
case "doors_open=both":
$( "#status" ).attr("class","open");
$( "#door_1_status" ).attr("class","open");
$( "#door_2_status" ).attr("class","open");
break;
case "doors_open=door1":
$( "#status" ).attr("class","open");
$( "#door_1_status" ).attr("class","open");
$( "#door_2_status" ).attr("class","closed");
break;
case "doors_open=door2":
$( "#status" ).attr("class","open");
$( "#door_1_status" ).attr("class","closed");
$( "#door_2_status" ).attr("class","open");
break;
case "doors_open=none":
$( "#status" ).attr("class","closed");
$( "#door_1_status" ).attr("class","closed");
$( "#door_2_status" ).attr("class","closed");
break;
}
});
}
function updateMacStatus(){
$.get( "/macs.json", function( data ) {
$("#mac_status").text(data.map(function(item){
return item.name;
}).join(", "));
});
}
// run once
updateDoorStatus();
updateMacStatus();
// and again every few seconds
setInterval(updateDoorStatus, 10000);
setInterval(updateDoorStatus, 60000);
</script>
<%= form_tag do %>
<% unless user_signed_in? %>
<p>
<%= label_tag :user, "Email Address" %><br/>
<%= text_field_tag :user %>
</p>
<p>
<%= label_tag :pass, "Password" %><br/>
<%= password_field_tag :pass %>
</p>
<% end %>
<span id="status">
<div>
<span id="overall_status">
Both<br/>
<input type="submit" name="cmd" value="unlock" class="btn unlock">
<input type="submit" name="cmd" value="lock" class="btn lock">
</span>
</div>
<span id="door_1_status">
Door 1<br/>
<input type="submit" name="cmd" value="open-front" class="btn unlock">
<input type="submit" name="cmd" value="unlock-front" class="btn unlock">
<input type="submit" name="cmd" value="lock-front" class="btn lock">
</span>
<span id="door_2_status">
Door 2<br/>
<input type="submit" name="cmd" value="open-rear" class="btn unlock">
<input type="submit" name="cmd" value="unlock-rear" class="btn unlock">
<input type="submit" name="cmd" value="lock-rear" class="btn lock">
</span>
</span>
<!--
<h3>Alarm</h3>
<p>
<input type="submit" name="cmd" value="arm" class="btn">
<input type="submit" name="cmd" value="disarm" class="btn">
</p>
-->
<% end %>
<h3>Who's here?</h3>
<p id="mac_status">
</p>