<?php
namespace App\Controller;
//Load core
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use \DateTime;
//Load json rest
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\Session;
use FOS\RestBundle\Controller\Annotations as Rest; // alias pour toutes les annotations
use App\Services\Utils;
use App\Services\Tools;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
//Load entity
use App\Entity\PositionGps;
use App\Entity\User;
use App\Entity\Hobit;
use App\Entity\HobitDate;
class InformationController extends AbstractController
{
protected $em;
protected $utils;
protected $tools;
public function __construct(EntityManagerInterface $entityManager, Utils $utils, TranslatorInterface $translator, Tools $tools) {
$this->em = $entityManager;
$this->utils = $utils;
$this->translator = $translator;
$this->tools = $tools;
}
/**
* @Rest\View(statusCode=200)
* @Rest\Post("/api/information/position-gps")
*/
public function addPositionGpsAction(Request $request)
{
//$positions = $request->get("positions");
$positionsString = $request->getContent();
$positions = [];
$positions[] = json_decode($positionsString);
//TEST VARDUMP FILE
$coucou = $positionsString;
$monfichier = fopen('coucou.txt', 'w+');
$pages_vues = fgets($monfichier); // On lit la première ligne (nombre de pages vues)
fseek($monfichier, 0); // On remet le curseur au début du fichier.
fputs($monfichier, $coucou); // On écrit le nouveau nombre de pages vues.
fclose($monfichier);
$em = $this->em;
$authTokenHeader = $request->headers->get('X-Auth-Token');
$auth = null;
/*
$auth = $this->em
->getRepository(AuthToken::class)
->findOneBy(array("value" => $authTokenHeader));
*/
$groupeId = $this->generateRandomString(15);
foreach($positions as $position) {
//For manuel post
$position = $position->location;
$coords = $position->coords;
$latitude = $coords->latitude; // float
$longitude = $coords->longitude; // float
$speed = $coords->speed; // float
$accuracy = $coords->accuracy; // float
$altitude = $coords->altitude; // float
//New coords
$speedAccuracy = $coords->speed_accuracy; // float
$ellipsoidalAltitude = $coords->ellipsoidal_altitude; // float
$floor = $coords->floor; // float
$headingAccuracy = $coords->heading_accuracy; // float
$altitudeAccuracy = $coords->altitude_accuracy; // float
$heading = $coords->heading; // Float
//News index
$mock = null;
if(isset($position->mock)){
$mock = $position->mock; // bool
}
$isMoving = null;
if(isset($position->is_moving)){
$isMoving = $position->is_moving; // bool
}
$event = null;
if(isset($position->event)){
$event = $position->event; // String
}
$odometer = $position->odometer; //Float
$uuid = $position->uuid; // String
//News activity
$activityType = $position->activity->type;
$activityConfidence = $position->activity->confidence;
//News battery
$batteryLevel = $position->battery->level;
$batteryIsCharging = $position->battery->is_charging;
//$bearing = $position['bearing'];
$datePrintString = $position->timestamp;
$datePrint = strtotime($datePrintString);
//Set dateTime with unix timestamp
/*
$timestamp = substr($position['time'], 0, 10);
$dateTime = new DateTime();
$dateTime->setTimestamp($timestamp);
*/
//$date = $dateTime;
//New module (hihi) FOR GET SINCE POSITION WITH LAST POSITIONS
/*
if((date("YmdHis") - $dateTime->format("YmdHis")) > 60){
$positionLasts = $this->em
->getRepository(PositionGps::class)
->findBy(array(), array("datePrinted" => "DESC"), 1);
if($positionLasts){
$latitude = $positionLasts[0]->getLatitude();
$longitude = $positionLasts[0]->getLongitude();
}
else{
$latitude = $position['latitude'];
$longitude = $position['longitude'];
}
}
else{
$latitude = $position['latitude'];
$longitude = $position['longitude'];
}
*/
$PositionGps = new PositionGps();
$PositionGps->setGroupeId($groupeId);
$PositionGps->setAccuracy($accuracy);
$PositionGps->setAltitude($altitude);
$PositionGps->setLatitude($latitude);
$PositionGps->setLongitude($longitude);
$PositionGps->setSpeed($speed);
//NEW FIELDS
$PositionGps->setSpeedAccuracy($speedAccuracy);
$PositionGps->setAltitudeEllipsoidal($ellipsoidalAltitude);
$PositionGps->setFloor($floor);
$PositionGps->setHeadingAccuracy($headingAccuracy);
$PositionGps->setAltitudeAccuracy($altitudeAccuracy);
$PositionGps->setHeading($heading);
$PositionGps->setMock($mock);
$PositionGps->setIsMoving($isMoving);
$PositionGps->setEvent($event);
$PositionGps->setOdometer($odometer);
$PositionGps->setUuid($uuid);
$PositionGps->setActivityType($activityType);
$PositionGps->setActivityConfidence($activityConfidence);
$PositionGps->setBatteryLevel($batteryLevel);
$PositionGps->setBatteryIsCharging($batteryIsCharging);
//Temp
$user = $this->em
->getRepository(User::class)
->findOneBy(array("id" => 4));
$PositionGps->setUser($user);
if($auth){
$PositionGps->setUser($auth->getUser());
}
$PositionGps->setDatePrinted(new DateTime($datePrintString));
$PositionGps->setWithFail(false);
$PositionGps->setSync(false);
$em->persist($PositionGps);
}
$em->flush();
return true;
}
/**
* @Rest\View(statusCode=200)
* @Rest\Post("/api/information/position-gps-fail")
*/
public function addPositionGpsFailAction(Request $request)
{
//$positions = $request->get("positions");
$positions = $request->request->all();
//TEST VARDUMP FILE
/*
$coucou = serialize($positions);
$monfichier = fopen('/media/tr/www/var/logs/coucou.txt', 'w+');
$pages_vues = fgets($monfichier); // On lit la première ligne (nombre de pages vues)
fseek($monfichier, 0); // On remet le curseur au début du fichier.
fputs($monfichier, $coucou); // On écrit le nouveau nombre de pages vues.
fclose($monfichier);
*/
$em = $this->em;
$authTokenHeader = $request->headers->get('X-Auth-Token');
$auth = $this->em
->getRepository(AuthToken::class)
->findOneBy(array("value" => $authTokenHeader));
$groupeId = $this->generateRandomString(15);
foreach($positions as $position) {
//For manuel post
$latitude = $position['latitude'];
$longitude = $position['longitude'];
//$date = $position['datePrinted'];
$speed = $position['speed'];
$provider = $position['provider'];
$locationProvider = $position['locationProvider'];
$accuracy = $position['accuracy'];
$altitude = $position['altitude'];
$bearing = $position['bearing'];
//Set dateTime with unix timestamp
$timestamp = substr($position['time'], 0, 10);
$dateTime = new DateTime();
$dateTime->setTimestamp($timestamp);
$latitude = $position['latitude'];
$longitude = $position['longitude'];
$date = $dateTime->format("Y-m-d H:i:s");
$speed = $position['speed'];
$PositionGps = new PositionGps();
if($auth){
$PositionGps->setUser($auth->getUser());
}
$PositionGps->setLatitude($latitude);
$PositionGps->setLongitude($longitude);
$PositionGps->setSpeed($speed);
$PositionGps->setGroupeId($groupeId);
$PositionGps->setProvider($provider);
$PositionGps->setLocationProvider($locationProvider);
$PositionGps->setAccuracy($accuracy);
$PositionGps->setAltitude($altitude);
$PositionGps->setBearing($bearing);
$PositionGps->setDatePrinted(new DateTime($date));
$PositionGps->setWithFail(true);
$PositionGps->setSync(true);
$em->persist($PositionGps);
}
$em->flush();
return true;
}
/**
* @Rest\View(statusCode=200)
* @Rest\Post("/api/information/position-gps-temp")
*/
public function addPositionGpsTempAction(Request $request)
{
//TEST VARDUMP FILE
/*
$coucou = serialize($positions);
$monfichier = fopen('/media/tr/www/var/logs/coucou.txt', 'w+');
$pages_vues = fgets($monfichier); // On lit la première ligne (nombre de pages vues)
fseek($monfichier, 0); // On remet le curseur au début du fichier.
fputs($monfichier, $coucou); // On écrit le nouveau nombre de pages vues.
fclose($monfichier);
*/
$em = $this->em;
$positions = $request->get("positions");
//$positions = $request->request->all();
foreach ($positions as $position) {
//For manuel post
$latitude = $position['latitude'];
$longitude = $position['longitude'];
$date = $position['datePrinted'];
$speed = $position['speed'];
/*
//Set dateTime with unix timestamp
$timestamp = substr($position['time'], 0, 10);
$dateTime = new DateTime();
$dateTime->setTimestamp($timestamp);
*/
$latitude = $position['latitude'];
$longitude = $position['longitude'];
//$date = $dateTime->format("Y-m-d H:i:s");
$speed = $position['speed'];
$PositionGps = new PositionGps();
$PositionGps->setLatitude($latitude);
$PositionGps->setLongitude($longitude);
$PositionGps->setSpeed($speed);
$PositionGps->setDatePrinted(new DateTime($date));
$em->persist($PositionGps);
}
$em->flush();
return true;
}
/**
* @Rest\View(statusCode=201)
* @Rest\Get("/api/information/position-gps")
*/
public function getPositionGpsAction(Request $request)
{
$positionGpsList = $this->em
->getRepository(PositionGps::class)
->findAll();
return $positionGpsList;
}
/**
* @Route("/debug/information/position", name="information_position_debug")
*/
public function getPositionDebugAction(Request $request)
{
$session = new Session();
$userCurrent = $session->get('currentUser');
$positionGpsList = $this->em
->getRepository(PositionGps::class)
->findBy(array("user" => $userCurrent), array('datePrinted' => 'DESC', 'dateCreatedByServer' => 'DESC'), 6);
return $this->render('debug/position.html.twig', Array(
"positionGpsList" => $positionGpsList
));
}
/**
* @Route("/debug/information/live", name="information_live_debug")
*/
public function getLiveDebugAction(Request $request)
{
$session = new Session();
$userCurrent = $session->get('currentUser');
$positionGpsList = $this->em
->getRepository(PositionGps::class)
->findBy(array("user" => $userCurrent), array('datePrinted' => 'DESC', 'dateCreatedByServer' => 'DESC'), 25);
$currentPostition = null;
$currentAgo = null;
$lastHobit = null;
$currentHobitAgo = null;
$newHobitAgo = null;
$newHobit = null;
if($positionGpsList){
$currentPostition = $positionGpsList[0];
$currentAgo = $this->TimeToJourJ($currentPostition->getDateCreatedByServer()->format("Y-m-d H-i-s"), time());
//Last hobit
$timeLimit = 600;
$nextHobitAgo = "3 minutes";
$tabHobit = [];
$limitWidthHobit = 0.20;
$limitTimeHobit = 600;
$limitForCreateHobit = 30;
$limitStable = 5;
$maxSum = 100;
$numberIntervalPrintedAndServer = 60;
//Debug
$debug = true;
$debugAndFlush = false;
$tabHobit = $this->tools->dreamHobit($debug, $debugAndFlush, $limitWidthHobit, $limitTimeHobit, $limitForCreateHobit, $limitStable, $maxSum, $numberIntervalPrintedAndServer, $userCurrent);
if($tabHobit){
$lastHobit = $tabHobit[(count($tabHobit) - 1)];
$currentHobitAgo = $this->TimeToJourJ($lastHobit['startDateTime']->format("Y-m-d H-i-s"), time());
$newHobitAgo = false;
$newHobit = false;
//Next Hobit
if(($currentPostition->getDatePrinted()->getTimestamp() + 120) < time()){
$newHobit = $currentPostition;
$newHobitAgo = $this->TimeToJourJ($lastHobit['endDateTime']->format("Y-m-d H-i-s"), time());
}
if($newHobitAgo == false){
$currentHobitAgo = $this->TimeToJourJ($lastHobit['startDateTime']->format("Y-m-d H-i-s"), time());
}
else{
if(($lastHobit['startDateTime']->getTimestamp() - $lastHobit['endDateTime']->getTimestamp()) > 600){
$currentHobitAgo = $this->TimeToJourJ($lastHobit['startDateTime']->format("Y-m-d H-i-s"), time());
}
else{
$currentHobitAgo = $this->TimeToJourJ($lastHobit['startDateTime']->format("Y-m-d H-i-s"), $lastHobit['endDateTime']->getTimestamp());
}
}
}
}
return $this->render('debug/live.html.twig', Array(
"positionGpsList" => $positionGpsList,
"currentPosition" => $currentPostition,
"currentAgo" => $currentAgo,
"lastHobit" => $lastHobit,
"currentHobitAgo" => $currentHobitAgo,
"newHobitAgo" => $newHobitAgo,
"newHobit" => $newHobit,
));
}
/**
* @Route("/debug/information/live-refresh", name="information_live_refresh_debug")
*/
public function getLiveRefreshDebugAction(Request $request, $isApi = false)
{
$session = new Session();
$userCurrent = $session->get('currentUser');
$positionGpsList = $this->em
->getRepository(PositionGps::class)
->findBy(array("user" => $userCurrent), array('datePrinted' => 'DESC', 'dateCreatedByServer' => 'DESC'), 25);
$currentPostition = null;
$currentAgo = null;
$lastHobit = null;
$currentHobitAgo = null;
$newHobitAgo = null;
$newHobit = null;
$dataHere = false;
$currentPostionTab = [];
$lastHobitTab = [];
if($positionGpsList){
$dataHere = true;
$currentPostition = $positionGpsList[0];
$currentAgo = $this->TimeToJourJ($currentPostition->getDateCreatedByServer()->format("Y-m-d H-i-s"), time());
$currentPostionTab = array(
"start" => $currentPostition->getDatePrinted()->format("d-m-Y H:i:s"),
"latitude" => $currentPostition->getLatitude(),
"longitude" => $currentPostition->getLongitude(),
);
//Last hobit
$timeLimit = 600;
$nextHobitAgo = "3 minutes";
$tabHobit = [];
$limitWidthHobit = 0.20;
$limitTimeHobit = 600;
$limitForCreateHobit = 30;
$limitStable = 5;
$maxSum = 100;
$numberIntervalPrintedAndServer = 60;
//Debug
$debug = true;
$debugAndFlush = false;
$tabHobit = $this->tools->dreamHobit($debug, $debugAndFlush, $limitWidthHobit, $limitTimeHobit, $limitForCreateHobit, $limitStable, $maxSum, $numberIntervalPrintedAndServer, $userCurrent);
if(count($tabHobit) > 0){
$lastHobit = $tabHobit[(count($tabHobit) - 1)];
}
else{
$lastHobit = null;
}
$newHobitAgo = false;
$newHobit = false;
if($lastHobit){
//Next Hobit
if(($currentPostition->getDatePrinted()->getTimestamp() + 120) < time()){
$newHobit = $currentPostition;
$newHobitAgo = $this->TimeToJourJ($lastHobit['endDateTime']->format("Y-m-d H-i-s"), time());
}
if($newHobitAgo == false){
$currentHobitAgo = $this->TimeToJourJ($lastHobit['startDateTime']->format("Y-m-d H-i-s"), time());
}
else{
if(($lastHobit['startDateTime']->getTimestamp() - $lastHobit['endDateTime']->getTimestamp()) > 600){
$currentHobitAgo = $this->TimeToJourJ($lastHobit['startDateTime']->format("Y-m-d H-i-s"), time());
}
else{
$currentHobitAgo = $this->TimeToJourJ($lastHobit['startDateTime']->format("Y-m-d H-i-s"), $lastHobit['endDateTime']->getTimestamp());
}
}
}
else{
$newHobit = $currentPostition;
$newHobitAgo = $this->TimeToJourJ($currentPostition->getDatePrinted()->format("Y-m-d H-i-s"), time());
$currentHobitAgo = $this->TimeToJourJ($currentPostition->getDatePrinted()->format("Y-m-d H-i-s"), time());
}
$lastHobitTab = array(
"start" => $lastHobit ? $lastHobit['startDateTime']->format("d-m-Y H:i:s") : null,
"end" => $lastHobit ? $lastHobit['endDateTime']->format("d-m-Y H:i:s") : null,
"latitude" => $lastHobit ? $lastHobit['data']->getLatitude() : null,
"longitude" => $lastHobit ? $lastHobit['data']->getLongitude() : null,
);
}
$data = array(
"currentAgo" => $currentAgo,
"currentPostition" => $currentPostionTab,
"currentAgo" => $currentAgo,
"lastHobit" => $lastHobitTab,
"currentHobitAgo" => $currentHobitAgo,
"newHobitAgo" => $newHobitAgo,
"dataHere" => $dataHere
);
return new JsonResponse([ 'return' => 'success', 'data' => $data]);
}
/**
* @Route("/debug/information/positions/{day}", name="information_positions_debug")
*/
public function getPositionsDebugAction(Request $request, $day = "today")
{
if($day == "today"){
$date = date("Y-m-d");
}
else if($day == "yesterday"){
$date = date('Y-m-d', strtotime('-1 day'));
}
else{
$date = date($day);
}
$session = new Session();
$userCurrent = $session->get('currentUser');
$positionGpsList = $this->em
->getRepository(PositionGps::class)
->findPositionByDate($date, $userCurrent);
$positionGpsListArray = [];
foreach ($positionGpsList as $key => $positionGps) {
$positionGpsListArray[$key][0] = floatval($positionGps->getLatitude());
$positionGpsListArray[$key][1] = floatval($positionGps->getLongitude());
$positionGpsListArray[$key][2] = strval($positionGps->getDatePrinted()->format('d-m-Y H:i'));
}
return $this->render('debug/positions.html.twig', Array(
"positionGpsList" => $positionGpsList,
"positionGpsListArray" => $positionGpsListArray
));
}
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
function Date_ConvertSqlTab($date_sql) {
$jour = substr($date_sql, 8, 2);
$mois = substr($date_sql, 5, 2);
$annee = substr($date_sql, 0, 4);
$heure = substr($date_sql, 11, 2);
$minute = substr($date_sql, 14, 2);
$seconde = substr($date_sql, 17, 2);
$key = array('annee', 'mois', 'jour', 'heure', 'minute', 'seconde');
$value = array($annee, $mois, $jour, $heure, $minute, $seconde);
$tab_retour = array_combine($key, $value);
return $tab_retour;
}
function AuPluriel($chiffre) {
if($chiffre>1) {
return 's';
};
}
function TimeToJourJ($date_sql, $mkt_now) {
$tab_date = $this->Date_ConvertSqlTab($date_sql);
$mkt_jourj = mktime($tab_date['heure'],
$tab_date['minute'],
$tab_date['seconde'],
$tab_date['mois'],
$tab_date['jour'],
$tab_date['annee']);
$diff = $mkt_jourj - $mkt_now;
$unjour = 3600 * 24;
if($diff>=$unjour) {
// EN JOUR
$calcul = $diff / $unjour;
return 'Il reste <strong>'.ceil($calcul).' day'.$this->AuPluriel($calcul).
'</strong>';
} elseif($diff<$unjour && $diff>=0 && $diff>=3600) {
// EN HEURE
$calcul = $diff / 3600;
return 'Il reste <strong>'.ceil($calcul).' hour'.$this->AuPluriel($calcul).
'</strong>';
} elseif($diff<$unjour && $diff>=0 && $diff<3600) {
// EN MINUTES
$calcul = $diff / 60;
return 'Il reste <strong>'.ceil($calcul).' minute'.$this->AuPluriel($calcul).
'</strong>';
} elseif($diff<0 && abs($diff)<60) {
// DEPUIS EN MINUTES
$calcul = abs($diff);
return '<strong>'.ceil($calcul).' second'.$this->AuPluriel($calcul).
'</strong>';
} elseif($diff<0 && abs($diff)<3600) {
// DEPUIS EN MINUTES
$calcul = abs($diff) + 3600;
$minute = date('i', $calcul);
$seconde = date('s', $calcul);
return '<strong>'.$minute.' minute'.$this->AuPluriel($minute).
' and '.$seconde.'s</strong>';
} elseif($diff<0 && abs($diff)<$unjour) {
// DEPUIS EN HEURES
$calcul = abs($diff) - 3600;
$hour = date('H', $calcul);
$minute = date('i', $calcul);
$seconde = date('s', $calcul);
return '<strong>'.$hour.' hour'.$this->AuPluriel($hour).', '.$minute.' minute'.$this->AuPluriel($minute).
' and '.$seconde.'s</strong>';
} else {
// DEPUIS EN JOUR
$calculDay = (abs($diff) / $unjour) - 1;
$calcul = (abs($diff) - ($unjour * ceil($calculDay)) - 3600);
$hour = date('H', $calcul);
$minute = date('i', $calcul);
$seconde = date('s', $calcul);
return '<strong>'.ceil($calculDay).' day, '.$hour.' h, '.$minute.' m'.
', '.$seconde.'s</strong>';
};
}
function ConvertisseurTime($Time){
if($Time < 3600){
$heures = 0;
if($Time < 60){$minutes = 0;}
else{$minutes = round($Time / 60);}
$secondes = floor($Time % 60);
}
else{
$heures = round($Time / 3600);
$secondes = round($Time % 3600);
$minutes = floor($secondes / 60);
}
$secondes2 = round($secondes % 60);
$TimeFinal = "$minutes minute".$this->AuPluriel($minutes)." and $secondes2 s";
return $TimeFinal;
}
function dateDiff($date1, $date2){
$diff = abs($date1 - $date2); // abs pour avoir la valeur absolute, ainsi éviter d'avoir une différence négative
$retour = array();
$tmp = $diff;
$retour['second'] = $tmp % 60;
$tmp = floor( ($tmp - $retour['second']) /60 );
$retour['minute'] = $tmp % 60;
$tmp = floor( ($tmp - $retour['minute'])/60 );
$retour['hour'] = $tmp % 24;
$tmp = floor( ($tmp - $retour['hour']) /24 );
$retour['day'] = $tmp;
return $retour;
}
function get_distance_m($lastHobitLat, $lastHobitLong, $newHobitLat, $newHobitLong) {
$lat1 = $lastHobitLat;
$lng1 = $lastHobitLong;
$lat2 = $newHobitLat;
$lng2 = $newHobitLong;
$earth_radius = 6378137;
$rlo1 = deg2rad($lng1);
$rla1 = deg2rad($lat1);
$rlo2 = deg2rad($lng2);
$rla2 = deg2rad($lat2);
$dlo = ($rlo2 - $rlo1) / 2;
$dla = ($rla2 - $rla1) / 2;
$a = (sin($dla) * sin($dla)) + cos($rla1) * cos($rla2) * (sin($dlo) * sin($dlo));
$d = 2 * atan2(sqrt($a), sqrt(1 - $a));
return ($earth_radius * $d);
}
}