function driver_controller()
{
    //return array('content'=>"ok");
    global $mysqli, $redis, $user, $session, $route, $feed_settings;
    // There are no actions in the input module that can be performed with less than write privileges
    if (!$session['write']) {
        return array('content' => false);
    }
    global $feed, $timestore_adminkey;
    $result = false;
    include "Modules/feed/feed_model.php";
    $feed = new Feed($mysqli, $redis, $feed_settings);
    require "Modules/input/input_model.php";
    // 295
    $input = new Input($mysqli, $redis, $feed);
    require "Modules/input/process_model.php";
    // 886
    $process = new Process($mysqli, $input, $feed);
    include "Modules/driver/driver_model.php";
    $driver = new Driver($mysqli, $redis, $input, $feed, $process);
    if ($route->format == 'html') {
        if ($route->action == 'api') {
            $result = view("Modules/driver/Views/driver_api.php", array());
        }
        if ($route->action == 'node') {
            $result = view("Modules/driver/Views/driver_node.php", array());
        }
        if ($route->action == 'configure') {
            $result = view("Modules/driver/Views/configure.php", array('driverid' => intval(get('driverid'))));
        }
        if ($route->action == 'startstop') {
            $result = view("Modules/driver/Views/startstop.php", array('driverid' => intval(get('driverid'))));
        }
    }
    if ($route->format == 'json') {
        if ($route->action == 'cmd') {
            $node = get('node');
            $cmd = json_decode(get('json'));
            $userid = $session['userid'];
            $query = "SELECT driver_id from node_driver where node={$node} and user_id={$userid}";
            $res = $mysqli->query($query);
            $row = $res->fetch_object();
            $result = $driver->execCmd($node, $row->driver_id, $cmd);
        }
        // input/post.json?node=10&csv=100,200,300
        // input/post.json?node=10&json={power:100,solar:200}
        // input/bulk.json?data=[[0,10,100,200],[5,10,100,200],[10,10,100,200]]
        // input/bulk.json?data=[[0,16,1137],[2,17,1437,3164],[4,19,1412,3077]]
        // The first number of each node is the time offset, so for the first node it is 0 which means the packet
        // for the first node arrived at 0 seconds. The second node arrived at 2 seconds and 3rd 4 seconds.
        // The second number is the node id, this is the unqiue identifer for the wireless node.
        // All the numbers after the first two are data values. The first node here (node 16) has only once data value: 1137.
        /*     
            if ($route->action == 'bulk')
            {
              $valid = true;
              $data = json_decode(get('data'));
            
              $userid = $session['userid'];
              $dbinputs = $input->get_inputs($userid);
        
              $len = count($data);
              if ($len>0)
              {
                if (isset($data[$len-1][0])) 
                {
                  $offset = (int) $data[$len-1][0];
                  if ($offset>=0)
                  {
                    $start_time = time() - $offset;
           
                    foreach ($data as $item)
                    {
                      if (count($item)>2)
                      {
                        //check for correct time format
                        $itemtime = (int) $item[0];
                        if ($itemtime>=0)
                        {
                          $time = $start_time + (int) $itemtime;
                          $nodeid = $item[1];
        
                          $inputs = array();
                          $name = 1;
                          for ($i=2; $i<count($item); $i++)
                          {
                            $value = (float) $item[$i];
                            $inputs[$name] = $value;
                            $name ++;
                          }
                          
                          $tmp = array();
                          foreach ($inputs as $name => $value) 
                          {
                            if (!isset($dbinputs[$nodeid][$name])) {
                              $inputid = $input->create_input($userid, $nodeid, $name);
                              $dbinputs[$nodeid][$name] = true;
                              $dbinputs[$nodeid][$name] = array('id'=>$inputid, 'processList'=>'');
                              $input->set_timevalue($dbinputs[$nodeid][$name]['id'],$time,$value);
                            } else {
                              $inputid = $dbinputs[$nodeid][$name]['id'];
                              $input->set_timevalue($dbinputs[$nodeid][$name]['id'],$time,$value);
                              
                              if ($dbinputs[$nodeid][$name]['processList']) $tmp[] = array('value'=>$value,'processList'=>$dbinputs[$nodeid][$name]['processList']);
                            }
                          }
                          
                          foreach ($tmp as $i) $process->input($time,$i['value'],$i['processList']);        
                           
                        } else { $valid = false; $error = "Format error, time index given is negative"; }
                      } else { $valid = false; $error = "Format error, bulk item needs at least 3 values"; }
                    }
                  } else { $valid = false; $error = "Format error, time index given is negative"; }
                } else { $valid = false; $error = "Format error, last item in bulk data does not contain any data"; }
              } else { $valid = false; $error = "Format error, json string supplied is not valid"; }
              
              if ($valid) $result = 'ok'; else $result = "Error: $error\n";
            }
        
            // input/post.json?node=10&json={power1:100,power2:200,power3:300}
            // input/post.json?node=10&csv=100,200,300
        */
        if ($route->action == 'add') {
            $datain = false;
            // code below processes input regardless of json or csv type
            if (isset($_GET['json'])) {
                $datain = get('json');
            }
            if ($datain != "") {
                $json = preg_replace('/[^\\w\\s-.:,]/', '', $datain);
                $datapairs = explode(',', $json);
                $csvi = 0;
                $description = "";
                for ($i = 0; $i < count($datapairs); $i++) {
                    $keyvalue = explode(':', $datapairs[$i]);
                    if (isset($keyvalue[1])) {
                        if ($keyvalue[0] != 'type' or $keyvalue[0] != 'description') {
                            $valid = false;
                            $error = "Format error, json key missing or invalid character";
                        }
                        if ($keyvalue[0] == 'type') {
                            $driverid = $keyvalue[1];
                        } else {
                            $description = $keyvalue[1];
                        }
                    }
                }
                $userid = $session['userid'];
                $result = $driver->add($userid, $driverid, $description);
                $valid = true;
            } else {
                $valid = false;
                $error = "Request contains no data via csv, json or data tag";
            }
            if (!$valid) {
                $result = "Error: {$error}\n";
            }
        }
        /*
        if ($route->action == "clean") $result = $input->clean($session['userid']);
        */
        if ($route->action == "list") {
            $result = $driver->getlist($session['userid']);
        }
        //allocate a node
        if ($route->action == "nodes") {
            $result = $driver->driversNodes($session['userid']);
        }
        if ($route->action == "release" or $route->action == "connect") {
            if (isset($_GET['json'])) {
                $datain = get('json');
                $json = preg_replace('/[^\\w\\s-.: ,]/', '', $datain);
                $datapairs = explode(',', $json);
                for ($i = 0; $i < count($datapairs); $i++) {
                    $keyvalue = explode(':', $datapairs[$i]);
                    //echo $keyvalue[0]." ".$keyvalue[1];
                    if (isset($keyvalue[1])) {
                        if ($keyvalue[0] == 'driverID') {
                            $driverid = $keyvalue[1];
                        } else {
                            if ($keyvalue[0] == 'nodeID') {
                                $nodeid = $keyvalue[1];
                            }
                        }
                    }
                }
                if ($route->action == "release") {
                    $result = $driver->release($session['userid'], $driverid, $nodeid);
                } else {
                    $result = $driver->connect($session['userid'], $driverid, $nodeid);
                }
            } else {
                $result = -1;
            }
        }
        if ($route->action == "reserve") {
            if (isset($_GET['driverID'])) {
                $result = $driver->reserve($session['userid'], $_GET['driverID']);
            } else {
                $result = -1;
            }
        }
        //get parameters of a driver
        if ($route->action == "parameters") {
            if (isset($_GET['driverid'])) {
                $result = $driver->get_parameters($_GET['driverid']);
            }
        }
        if ($route->action == "startstop") {
            if (isset($_GET['driverid'])) {
                $result = $driver->startstop($_GET['driverid']);
            }
        }
        /*
            if ($route->action == "getinputs") $result = $input->get_inputs($session['userid']);
        */
        if (isset($_GET['driverid']) && $driver->belongs_to_user($session['userid'], get("driverid"))) {
            if ($route->action == "delete") {
                $result = $driver->delete($session['userid'], get("driverid"));
            }
            if ($route->action == 'set') {
                $result = $driver->set_fields(get('driverid'), get('fields'));
            }
            if ($route->action == 'setparameters') {
                $result = $driver->set_parameters(get('driverid'), get('fields'));
            }
            /*
                  if ($route->action == "process")
                  { 
                    if ($route->subaction == "add") $result = $input->add_process($process,$session['userid'], get('inputid'), get('processid'), get('arg'), get('newfeedname'), get('newfeedinterval'));
                    if ($route->subaction == "list") $result = $input->get_processlist_desc($process, get("inputid"));
                    if ($route->subaction == "delete") $result = $input->delete_process(get("inputid"),get('processid'));
                    if ($route->subaction == "move") $result = $input->move_process(get("inputid"),get('processid'),get('moveby'));
                    if ($route->subaction == "reset") $result = $input->reset_process(get("inputid"));
                  }
                  * */
        }
        if (isset($_GET['parameterid'])) {
            if ($route->action == 'set') {
                $result = $driver->set_parameter(get('parameterid'), get('fields'));
            }
        }
    }
    return array('content' => $result);
}