//***************************************************************
// Copyright 2008 Centre For Advanced Spatial Analysis, UCL
//
// Author: Joel Dearden, University College London
//
// Contact: j.dearden@ucl.ac.uk
//
// Joel Dearden,
// Centre for Advanced Spatial Analysis,
// University College London,
// 1-19 Torrington Place,
// London,
// WC1E 7HB
//
//
// This file is part of PedTrace.
//
// PedTrace is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// PedTrace is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with PedTrace. If not, see .
//
//***************************************************************
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using pedTrace;
using System.IO;
using System.Collections.Specialized;
using System.Threading;
public partial class input : System.Web.UI.Page
{
private Mutex fModelMutex;
private PTModel fModel;
//returns a string containing the specified query string parameter
//returns empty string if not found
private string GetParameter(string parameter_name)
{
NameValueCollection collection = Request.QueryString;
String[] key_array = collection.AllKeys;
if (key_array.Length > 0)
{
//find type
for (int i = 0; i < key_array.Length; i++)
{
if (key_array[i] == parameter_name)
{
//found
return (collection.GetValues(i))[0];
}
}
}
//not found
return "";
}
private bool valid_function(string s)
{
//empty?
if (s == "")
{
return false;
}
// (function)
//
// f = [ pi (ped in) |
// pu (ped update) |
// po (ped out) |
// rlb (register line barrier) |
// rfu (register furniture) |
// rstp (register steps) |
// rexd (register exit door) |
// rrtd (register route door) |
// rfl (register floor) |
// rms (register model seconds) |
// r (reset)
// ]
return ((((s == "pi") || (s == "pu")) || ((s == "po") || (s == "rlb")))
||
(((s == "rfu") || (s == "rstp")) || ((s == "rexd") || (s == "rrtd"))))
||
(((s == "rfl") || (s == "r")) || (s == "rms"));
}
private bool valid_UUID(string s)
{
//empty?
if (s == "")
{
return false;
}
return true;
}
private bool valid_float(string s)
{
//empty?
if (s == "")
{
return false;
}
try
{
System.Convert.ToDouble(s);
}
catch(Exception)
{
return false;
}
return true;
}
private bool valid_slTime(string s)
{
//empty?
if (s == "")
{
return false;
}
double time;
try
{
time = System.Convert.ToDouble(s);
}
catch (Exception)
{
return false;
}
if (time < 0)
{
return false;
}
if (time > globals.SECONDS_PER_DAY)
{
return false;
}
return true;
}
protected void Page_Load(object sender, EventArgs e)
{
//if this is the first instance of the page:
//
// -load the model into the application cache
//
// -setup mutex
//
if (Cache[globals.MODEL_CACHE_NAME] == null)
{
PTModel ptm = new PTModel();
Cache.Insert(globals.MODEL_CACHE_NAME, ptm);
Mutex m = new Mutex();
Cache.Insert(globals.MODEL_MUTEX_CACHE_NAME, m);
}
//retrieve model
this.fModel = (PTModel)Cache.Get(globals.MODEL_CACHE_NAME);
//retrieve mutex
this.fModelMutex = (Mutex)Cache.Get(globals.MODEL_MUTEX_CACHE_NAME);
//QUERY STRING PARAMETERS:
//
//
// // (function)
//
// f = [ pi (ped in) |
// pu (ped update) |
// po (ped out) |
// rlb (register line barrier) |
// rfu (register furniture) |
// rstp (register steps) |
// rexd (register exit door) |
// rrtd (register route door) |
// rfl (register floor) |
// rms (register model seconds) |
// r (reset)
// ]
//
// (UUID)
// u=
//
// (position.x)
// px=
//
// (position.y)
// py=
//
// (position.z)
// pz=
//
// (sltime)
// t=
//
// (length)
// l=
//
// (orientation)
// o=
//
// (speed)
// s=
string function_param = GetParameter("f");
string UUID_param_string = GetParameter("u");
string positionX_string = GetParameter("px");
string positionY_string = GetParameter("py");
string positionZ_string = GetParameter("pz");
string slTime_string = GetParameter("t");
string length_string = GetParameter("l");
string orientation_string = GetParameter("o");
string speed_string = GetParameter("s");
if (!valid_function(function_param))
{
//invalid function parameter - do nothing
return;
}
//*********************************************************************
//initially there will be no error detection or recovery in the system
//*********************************************************************
string UUID;
float posX;
float posY;
float posZ;
float orientation;
float length;
float speed;
double slTime;
//check function type
switch (function_param)
{
case "rms":
//register model second passing
fModelMutex.WaitOne();
fModel.modelTick();
fModelMutex.ReleaseMutex();
return;
case "r":
fModelMutex.WaitOne();
fModel.reset();
fModelMutex.ReleaseMutex();
if (!valid_slTime(slTime_string))
{
return;
}
return;
case "pi":
//pedestrian in
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float) System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float) System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
if (!valid_slTime(slTime_string))
{
return;
}
slTime = System.Convert.ToDouble(slTime_string);
fModelMutex.WaitOne();
fModel.pedestrianIn(UUID, new PTPoint(posX, posY, posZ), slTime);
fModelMutex.ReleaseMutex();
return;
case "pu":
//pedestrian update
if (!valid_float(speed_string))
{
return;
}
speed = (float) System.Convert.ToDouble(speed_string);
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float)System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float)System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
if (!valid_slTime(slTime_string))
{
return;
}
slTime = System.Convert.ToDouble(slTime_string);
fModelMutex.WaitOne();
fModel.pedestrianUpdate(UUID, new PTPoint(posX, posY, posZ), slTime, speed);
fModelMutex.ReleaseMutex();
return;
case "po":
//pedestrian out
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float)System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float)System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
if (!valid_slTime(slTime_string))
{
return;
}
slTime = System.Convert.ToDouble(slTime_string);
fModelMutex.WaitOne();
fModel.pedestrianOut(UUID, new PTPoint(posX, posY, posZ), slTime);
fModelMutex.ReleaseMutex();
return;
case "rlb":
//register line barrier
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float)System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float)System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
if (!valid_float(orientation_string))
{
return;
}
orientation = (float) System.Convert.ToDouble(orientation_string);
if (!valid_float(length_string))
{
return;
}
length = (float) System.Convert.ToDouble(length_string);
fModelMutex.WaitOne();
fModel.registerLineBarrier(UUID, new PTPoint(posX, posY, posZ), orientation, length);
fModelMutex.ReleaseMutex();
return;
case "rfu":
//register furniture
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float)System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float)System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
fModelMutex.WaitOne();
fModel.registerFurniture(UUID, new PTPoint(posX, posY, posZ));
fModelMutex.ReleaseMutex();
return;
case "rstp":
//register steps
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float)System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float)System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
fModelMutex.WaitOne();
fModel.registerSteps(UUID, new PTPoint(posX, posY, posZ));
fModelMutex.ReleaseMutex();
return;
case "rexd":
//register exit door
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float)System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float)System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
fModelMutex.WaitOne();
fModel.registerExitDoor(UUID, new PTPoint(posX, posY, posZ));
fModelMutex.ReleaseMutex();
return;
case "rrtd":
//register route door
if (!valid_UUID(UUID_param_string))
{
return;
}
UUID = UUID_param_string;
if (!valid_float(positionX_string))
{
return;
}
posX = (float)System.Convert.ToDouble(positionX_string);
if (!valid_float(positionY_string))
{
return;
}
posY = (float)System.Convert.ToDouble(positionY_string);
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
fModelMutex.WaitOne();
fModel.registerRouteDoor(UUID, new PTPoint(posX, posY, posZ));
fModelMutex.ReleaseMutex();
return;
case "rfl":
//register floor
if (!valid_float(positionZ_string))
{
return;
}
posZ = (float)System.Convert.ToDouble(positionZ_string);
fModelMutex.WaitOne();
fModel.registerFloor(posZ);
fModelMutex.ReleaseMutex();
return;
}
}
}