package art.servers.gost.access.controller;
|
|
import art.library.interop.serialization.Serialization;
|
import art.library.model.devices.DeviceStatus;
|
import art.library.model.devices.gost.access.AccessEnforcement;
|
import art.library.model.devices.gost.access.AccessEnforcementInformation;
|
import art.library.model.devices.gost.access.types.AccessEnforcement_Detection;
|
import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_Image;
|
import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_State;
|
import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_State_Discarded;
|
import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_State_Vehicle;
|
import art.servers.gost.access.Shared;
|
import art.servers.gost.access.configuration.Configuration;
|
import art.servers.gost.access.configuration.ConfigurationDetail;
|
import art.servers.gost.access.types.DatabasePoolConnection;
|
import art.servers.gost.access.utils.OSD;
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.FileReader;
|
import java.nio.file.Files;
|
import java.nio.file.StandardCopyOption;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
|
|
public class Controller_ACCESS_QuercusSpeed_Oviedo extends Controller_ACCESS
|
{
|
private ConfigurationDetail configuration = null;
|
|
|
|
public Controller_ACCESS_QuercusSpeed_Oviedo(AccessEnforcement access, DatabasePoolConnection database)
|
{
|
super(access, database);
|
this.configuration = ((Configuration)Shared.configuration).detail;
|
this.setName(Shared.getMessage("Controller access") + " " + access.information.name);
|
}
|
|
|
public AccessEnforcement getAccessEnforcement()
|
{
|
return (AccessEnforcement)getDevice();
|
}
|
|
|
|
public void run()
|
{
|
Shared.traceInformation(getName(),Shared.getMessage("Starting"));
|
|
initialise();
|
|
// Status
|
{
|
AccessEnforcement access = getAccessEnforcement();
|
AccessEnforcement clon = Serialization.clone(access);
|
clon.getDeviceStatus().status = DeviceStatus.STATUS_ONLINE;
|
clon.getDeviceAlarms().clear();
|
Shared.model.updateDevice(access, clon);
|
}
|
|
|
while ((isInterrupted() == false) && (exit == false))
|
{
|
long lastTimestampUpdate = System.currentTimeMillis();
|
|
try
|
{
|
if (Shared.isServerEnabled() == true)
|
{
|
update();
|
}
|
}
|
catch (Exception exception)
|
{
|
}
|
|
AccessEnforcement red = getAccessEnforcement();
|
long timetowait = (red.getDeviceInformation().polling * 1000) - (System.currentTimeMillis() - lastTimestampUpdate);
|
timetowait = Math.min(timetowait, red.getDeviceInformation().polling * 1000);
|
|
if (timetowait > 0)
|
{
|
try
|
{
|
sleep(timetowait);
|
}
|
catch (Exception e)
|
{
|
}
|
}
|
|
if (Shared.model.existsDevice(getAccessEnforcement().getIdentifier()) == false)
|
{
|
Shared.traceInformation(getName(),Shared.getMessage("Device no longer exists"));
|
exit = true;
|
}
|
}
|
|
|
Shared.traceInformation(getName(),Shared.getMessage("Finishing"));
|
}
|
|
|
|
|
|
|
// <editor-fold defaultstate="collapsed" desc="Download and update detections">
|
|
|
|
private void update()
|
{
|
AccessEnforcement access = getAccessEnforcement();
|
AccessEnforcementInformation information = access.getDeviceInformation();
|
|
try
|
{
|
// Read files
|
|
File rootFolder = new File(information.oviedo.detectionsFolder);
|
|
if (rootFolder.exists() == true)
|
{
|
File folders[] = rootFolder.listFiles();
|
|
// Wait all files to finish copy
|
|
try
|
{
|
sleep(60000);
|
}
|
catch (Exception exception)
|
{
|
}
|
|
for (File folder : folders)
|
{
|
if (folder.getName().indexOf(information.oviedo.identifier) == 0)
|
{
|
try
|
{
|
update(folder);
|
}
|
catch (Exception exception)
|
{
|
}
|
}
|
}
|
}
|
}
|
catch (Exception exception)
|
{
|
Shared.traceError(getName(),Shared.getMessage("Update"), exception);
|
}
|
}
|
|
|
|
private void update(File folder)
|
{
|
SimpleDateFormat formato1 = new SimpleDateFormat(Shared.getMessage("ddMMyyyyHHmmss"));
|
SimpleDateFormat formato2 = new SimpleDateFormat(Shared.getMessage("dd/MM/yyyy HH:mm:ss.SSS"));
|
|
AccessEnforcement access = getAccessEnforcement();
|
AccessEnforcementInformation information = access.getDeviceInformation();
|
|
BufferedReader reader = null;
|
|
int totalDetections = 0;
|
int processedDetections = 0;
|
|
try
|
{
|
File idx = getFile(folder, ".idx");
|
File txt = getFile(folder, ".txt");
|
reader = new BufferedReader(new FileReader(txt));
|
String line = reader.readLine();
|
while ((line != null) && (line.trim().length()> 0))
|
{
|
totalDetections = totalDetections + 1;
|
String[] tokens = line.split("\\s+");
|
|
try
|
{
|
int number = Integer.parseInt(tokens[0]);
|
|
AccessEnforcement_Detection detection = new AccessEnforcement_Detection();
|
detection.states = new ArrayList<>();
|
detection.timestamp = formato1.parse(tokens[1]).getTime();
|
detection.device = information;
|
updateImages(detection, idx, number);
|
|
AccessEnforcement_Detection_State detectionState = new AccessEnforcement_Detection_State();
|
detectionState.vehicle = new AccessEnforcement_Detection_State_Vehicle();
|
detectionState.vehicle.plate = tokens[2].toUpperCase();
|
detectionState.vehicle.confidence = (float)Math.min(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4]));
|
|
if ((detection.images != null) && (detection.images.size() == information.oviedo.numberImages))
|
{
|
if (Shared.controllerDetections.hasPermission(detection, detectionState.vehicle.plate) != null)
|
{
|
detectionState.state = AccessEnforcement_Detection_State.STATE_DISCARDED;
|
detectionState.discarded = new AccessEnforcement_Detection_State_Discarded();
|
detectionState.discarded.code = AccessEnforcement_Detection_State_Discarded.DISCARDED_ALLOWED;
|
detectionState.discarded.timestamp = System.currentTimeMillis();
|
detectionState.discarded.user = Shared.getApplicationName();
|
Shared.printcorrect(getName(),Shared.getMessage("Successful (allowed), plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp));
|
}
|
else
|
{
|
detectionState.state = AccessEnforcement_Detection_State.STATE_REVISION_PENDING;
|
detectionState.timestamp = System.currentTimeMillis();
|
Shared.printcorrect(getName(),Shared.getMessage("Successful (revision pending), plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp));
|
}
|
}
|
else
|
{
|
detectionState.state = AccessEnforcement_Detection_State.STATE_DISCARDED;
|
detectionState.discarded = new AccessEnforcement_Detection_State_Discarded();
|
detectionState.discarded.code = AccessEnforcement_Detection_State_Discarded.DISCARDED_MISSING_PICTURES;
|
detectionState.discarded.timestamp = System.currentTimeMillis();
|
detectionState.discarded.description = detectionState.discarded.getDescription(detectionState.discarded.code);
|
// Shared.printerr(getName(),Shared.getMessage("Missing images, plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp));
|
}
|
|
detection.states.add(detectionState);
|
|
if (updateDatabaseDetection(information, detection) == 0)
|
{
|
Shared.printwarning(getName(),Shared.getMessage("Already imported, plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp));
|
}
|
|
processedDetections = processedDetections + 1;
|
}
|
catch (NumberFormatException exception)
|
{
|
// Error al leer la linea
|
|
Shared.printerr(getName(),Shared.getMessage("Line error") + " = " + txt.getAbsolutePath() + ", '" + line + "'");
|
Shared.traceError(getName(),Shared.getMessage("Update"), folder.getAbsolutePath(), exception);
|
}
|
|
line = reader.readLine();
|
}
|
|
reader.close();
|
|
if (totalDetections > 0)
|
{
|
String message = folder.getAbsolutePath() + " : " + processedDetections + " " + Shared.getMessage("of") + " " + totalDetections;
|
Shared.traceInformation(getName(),Shared.getMessage("Update"), message);
|
if (reader != null) reader.close();
|
delete(folder);
|
}
|
}
|
catch (Exception exception)
|
{
|
try
|
{
|
if (reader != null) reader.close();
|
File fileerror = new File(information.storage.errorFolder + "/" + folder.getName());
|
fileerror.getParentFile().mkdirs();
|
Files.move(folder.toPath(), fileerror.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
}
|
catch (Exception e)
|
{
|
}
|
|
Shared.traceError(getName(),Shared.getMessage("Update"), folder.getAbsolutePath(), exception);
|
|
}
|
finally
|
{
|
try { if (reader != null) reader.close(); } catch (Exception exception) {};
|
}
|
}
|
|
|
|
|
private void updateImages(AccessEnforcement_Detection detection, File idx, int number)
|
{
|
BufferedReader reader = null;
|
|
AccessEnforcement access = getDevice();
|
|
try
|
{
|
int currentOvreview = 0;
|
reader = new BufferedReader(new FileReader(idx));
|
String line = reader.readLine();
|
while ((line != null) && (line.trim().length()> 0))
|
{
|
String[] tokens = line.split("\\s+");
|
|
int detectionNumber = Integer.parseInt(tokens[1]);
|
|
if (detectionNumber == number)
|
{
|
int fileNumber = Integer.parseInt(tokens[0]);
|
int imageNumber = Integer.parseInt(tokens[2]);
|
int imageType = Integer.parseInt(tokens[3]);
|
AccessEnforcement_Detection_Image image = new AccessEnforcement_Detection_Image();
|
image.data = Files.readAllBytes(new File(idx.getParentFile().getAbsolutePath() + "/" + String.format("%07d", fileNumber) + ".jpg").toPath());
|
image.format = AccessEnforcement_Detection_Image.FORMAT_JPG;
|
|
switch(imageType)
|
{
|
case 1: image.name = AccessEnforcement_Detection_Image.NAME_OVERVIEW + " " + (++currentOvreview);
|
OSD.osd(detection, image, access.getDeviceInformation().getOSD(image.name));
|
break;
|
|
case 2: image.name = AccessEnforcement_Detection_Image.NAME_PLATE;
|
OSD.osd(detection, image, access.getDeviceInformation().getOSD(image.name));
|
break;
|
|
case 3: image.name = AccessEnforcement_Detection_Image.NAME_PLATE_CLIP;
|
break;
|
}
|
|
if (detection.images == null)
|
{
|
detection.images = new ArrayList<AccessEnforcement_Detection_Image>();
|
}
|
|
detection.images.add(image);
|
}
|
|
line = reader.readLine();
|
}
|
}
|
catch (Exception exception)
|
{
|
Shared.traceError(getName(),Shared.getMessage("Update images"), idx.getAbsolutePath(), exception);
|
}
|
finally
|
{
|
try { if (reader != null) reader.close(); } catch (Exception exception) {};
|
}
|
}
|
|
|
|
|
|
|
private File getFile(File folder, String extension) throws Exception
|
{
|
for (File file : folder.listFiles())
|
{
|
if (file.getName().toLowerCase().endsWith(extension) == true)
|
{
|
return file;
|
}
|
}
|
|
throw new Exception(Shared.getMessage("File with extension does no exists") + " : " + extension);
|
}
|
|
|
|
|
|
}
|