Search in sources :

Example 1 with DriverService

use of org.openmuc.framework.driver.spi.DriverService in project OpenMUC by isc-konstanz.

the class DataManager method handleInterruptEvent.

private void handleInterruptEvent() {
    if (stopFlag) {
        prepareStop();
        return;
    }
    long currentTime = 0;
    if (newRootConfigWithoutDefaults != null) {
        currentTime = System.currentTimeMillis();
        applyConfiguration(newRootConfigWithoutDefaults, currentTime);
        newRootConfigWithoutDefaults = null;
        newConfigSignal.countDown();
    }
    synchronized (receivedRecordContainers) {
        List<ChannelRecordContainer> recordContainers;
        LoggingController loggingController = new LoggingController(activeDataLoggers);
        List<ChannelRecordContainerImpl> channelRecordContainerList = new ArrayList<>();
        while ((recordContainers = receivedRecordContainers.poll()) != null) {
            recordContainers.stream().map(recContainer -> (ChannelRecordContainerImpl) recContainer).filter(containerImpl -> containerImpl.getChannel().getChannelState() == ChannelState.LISTENING || containerImpl.getChannel().getDriverId().equals(DriverOptionsFactory.VIRTUAL)).forEach(containerImpl -> {
                containerImpl.getChannel().setNewRecord(containerImpl.getRecord());
                if (containerImpl.getChannel().isLoggingEvent())
                    channelRecordContainerList.add(containerImpl);
            });
        }
        loggingController.deliverLogsToEventBasedLogServices(channelRecordContainerList);
    }
    synchronized (samplingTaskFinished) {
        SamplingTask samplingTask;
        while ((samplingTask = samplingTaskFinished.poll()) != null) {
            samplingTask.storeValues();
            samplingTask.device.taskFinished();
        }
    }
    synchronized (tasksFinished) {
        DeviceTask deviceTask;
        while ((deviceTask = tasksFinished.poll()) != null) {
            deviceTask.device.taskFinished();
        }
    }
    synchronized (newDrivers) {
        // Needed to synchronize with getRunningDrivers
        synchronized (activeDrivers) {
            activeDrivers.putAll(newDrivers);
        }
        for (Entry<String, DriverService> newDriverEntry : newDrivers.entrySet()) {
            String driverId = newDriverEntry.getKey();
            logger.info("Registered driver: " + driverId);
            DriverConfigImpl driverConfig = rootConfig.driverConfigsById.get(driverId);
            if (driverConfig == null) {
                continue;
            }
            driverConfig.activeDriver = newDriverEntry.getValue();
            for (DeviceConfigImpl deviceConfig : driverConfig.deviceConfigsById.values()) {
                deviceConfig.device.driverRegisteredSignal();
            }
        }
        newDrivers.clear();
    }
    synchronized (newServers) {
        if (!newServers.isEmpty()) {
            activeServers.addAll(newServers);
            for (ServerService server : newServers) {
                logger.info("Registered server: {}", server.getId());
                notifyServer(server);
            }
            newServers.clear();
        }
    }
    synchronized (newDataLoggers) {
        if (!newDataLoggers.isEmpty()) {
            activeDataLoggers.addAll(newDataLoggers);
            for (DataLoggerService dataLogger : newDataLoggers) {
                logger.info("Registered data logger: {}", dataLogger.getId());
                dataLogger.setChannelsToLog(rootConfig.logChannels);
            }
            newDataLoggers.clear();
        }
    }
    if (driverToBeRemovedId != null) {
        DriverService removedDriver;
        synchronized (activeDrivers) {
            removedDriver = activeDrivers.remove(driverToBeRemovedId);
        }
        if (removedDriver == null) {
            // drivers was removed before it was added to activeDrivers
            newDrivers.remove(driverToBeRemovedId);
            driverRemovedSignal.countDown();
        } else {
            DriverConfigImpl driverConfig = rootConfig.driverConfigsById.get(driverToBeRemovedId);
            if (driverConfig != null) {
                activeDeviceCountDown = driverConfig.deviceConfigsById.size();
                if (activeDeviceCountDown > 0) {
                    // all devices have to be given a chance to finish their current task and disconnect:
                    for (DeviceConfigImpl deviceConfig : driverConfig.deviceConfigsById.values()) {
                        deviceConfig.device.driverDeregisteredSignal();
                    }
                    synchronized (driverRemovedSignal) {
                        if (activeDeviceCountDown == 0) {
                            driverRemovedSignal.countDown();
                        }
                    }
                } else {
                    driverRemovedSignal.countDown();
                }
            } else {
                driverRemovedSignal.countDown();
            }
        }
        driverToBeRemovedId = null;
    }
    if (serverToBeRemoved != null) {
        if (!activeServers.remove(serverToBeRemoved)) {
            newServers.remove(serverToBeRemoved);
        }
        serverToBeRemoved = null;
        serverRemovedSignal.countDown();
    }
    if (dataLoggerToBeRemoved != null) {
        if (!activeDataLoggers.remove(dataLoggerToBeRemoved)) {
            newDataLoggers.remove(dataLoggerToBeRemoved);
        }
        dataLoggerToBeRemoved = null;
        dataLoggerRemovedSignal.countDown();
    }
    synchronized (connectionFailures) {
        if (currentTime == 0) {
            currentTime = System.currentTimeMillis();
        }
        Device connectionFailureDevice;
        while ((connectionFailureDevice = connectionFailures.poll()) != null) {
            connectionFailureDevice.connectFailureSignal(currentTime);
        }
    }
    synchronized (connectedDevices) {
        if (currentTime == 0) {
            currentTime = System.currentTimeMillis();
        }
        Device connectedDevice;
        while ((connectedDevice = connectedDevices.poll()) != null) {
            connectedDevice.connectedSignal(currentTime);
        }
    }
    synchronized (newWriteTasks) {
        addTasksAndClear(newWriteTasks);
    }
    synchronized (newReadTasks) {
        addTasksAndClear(newReadTasks);
    }
    synchronized (disconnectedDevices) {
        Device connectedDevice;
        while ((connectedDevice = disconnectedDevices.poll()) != null) {
            connectedDevice.disconnectedSignal();
        }
    }
}
Also used : Arrays(java.util.Arrays) ListIterator(java.util.ListIterator) DeviceScanInfo(org.openmuc.framework.config.DeviceScanInfo) LoggerFactory(org.slf4j.LoggerFactory) DriverInfo(org.openmuc.framework.config.DriverInfo) Connection(org.openmuc.framework.driver.spi.Connection) Channel(org.openmuc.framework.dataaccess.Channel) DriverConfig(org.openmuc.framework.config.DriverConfig) DeviceScanListener(org.openmuc.framework.config.DeviceScanListener) Map(java.util.Map) ParseException(org.openmuc.framework.config.ParseException) ServerMapping(org.openmuc.framework.config.ServerMapping) ServerService(org.openmuc.framework.server.spi.ServerService) ConnectionException(org.openmuc.framework.driver.spi.ConnectionException) ScanException(org.openmuc.framework.config.ScanException) Deactivate(org.osgi.service.component.annotations.Deactivate) DriverDeviceScanListener(org.openmuc.framework.driver.spi.DriverDeviceScanListener) ReferencePolicy(org.osgi.service.component.annotations.ReferencePolicy) ConfigWriteException(org.openmuc.framework.config.ConfigWriteException) Collectors(java.util.stream.Collectors) Flag(org.openmuc.framework.data.Flag) FileNotFoundException(java.io.FileNotFoundException) Executors(java.util.concurrent.Executors) ChannelState(org.openmuc.framework.dataaccess.ChannelState) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) ChannelScanInfo(org.openmuc.framework.config.ChannelScanInfo) ChannelConfig(org.openmuc.framework.config.ChannelConfig) ChannelChangeListener(org.openmuc.framework.dataaccess.ChannelChangeListener) Entry(java.util.Map.Entry) Optional(java.util.Optional) Queue(java.util.Queue) ReadRecordContainer(org.openmuc.framework.dataaccess.ReadRecordContainer) DataLoggerNotAvailableException(org.openmuc.framework.dataaccess.DataLoggerNotAvailableException) TransformerException(javax.xml.transform.TransformerException) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) DriverOptionsFactory(org.openmuc.framework.config.option.DriverOptionsFactory) HashMap(java.util.HashMap) Deque(java.util.Deque) RootConfig(org.openmuc.framework.config.RootConfig) ConfigService(org.openmuc.framework.config.ConfigService) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) LogicalDeviceChangeListener(org.openmuc.framework.dataaccess.LogicalDeviceChangeListener) ChannelRecordContainer(org.openmuc.framework.driver.spi.ChannelRecordContainer) Component(org.osgi.service.component.annotations.Component) WriteValueContainer(org.openmuc.framework.dataaccess.WriteValueContainer) TransformerFactoryConfigurationError(javax.xml.transform.TransformerFactoryConfigurationError) DataLoggerService(org.openmuc.framework.datalogger.spi.DataLoggerService) Activate(org.osgi.service.component.annotations.Activate) DriverNotAvailableException(org.openmuc.framework.config.DriverNotAvailableException) LinkedList(java.util.LinkedList) ArgumentSyntaxException(org.openmuc.framework.config.ArgumentSyntaxException) ServerMappingContainer(org.openmuc.framework.server.spi.ServerMappingContainer) CommandProcessor(org.apache.felix.service.command.CommandProcessor) ConfigChangeListener(org.openmuc.framework.config.ConfigChangeListener) Logger(org.slf4j.Logger) ReentrantLock(java.util.concurrent.locks.ReentrantLock) IOException(java.io.IOException) File(java.io.File) LogicalDevice(org.openmuc.framework.dataaccess.LogicalDevice) ScanInterruptedException(org.openmuc.framework.config.ScanInterruptedException) DeviceConfig(org.openmuc.framework.config.DeviceConfig) ReferenceCardinality(org.osgi.service.component.annotations.ReferenceCardinality) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) DriverService(org.openmuc.framework.driver.spi.DriverService) LinkedBlockingDeque(java.util.concurrent.LinkedBlockingDeque) DataAccessService(org.openmuc.framework.dataaccess.DataAccessService) DeviceState(org.openmuc.framework.dataaccess.DeviceState) Reference(org.osgi.service.component.annotations.Reference) LogChannel(org.openmuc.framework.datalogger.spi.LogChannel) RecordsReceivedListener(org.openmuc.framework.driver.spi.RecordsReceivedListener) DataLoggerService(org.openmuc.framework.datalogger.spi.DataLoggerService) LogicalDevice(org.openmuc.framework.dataaccess.LogicalDevice) ArrayList(java.util.ArrayList) ChannelRecordContainer(org.openmuc.framework.driver.spi.ChannelRecordContainer) ServerService(org.openmuc.framework.server.spi.ServerService) DriverService(org.openmuc.framework.driver.spi.DriverService)

Example 2 with DriverService

use of org.openmuc.framework.driver.spi.DriverService in project OpenMUC by isc-konstanz.

the class DataManager method scanForChannels.

@Override
public List<ChannelScanInfo> scanForChannels(String deviceId, String settings) throws DriverNotAvailableException, UnsupportedOperationException, ArgumentSyntaxException, ScanException {
    // TODO this function is probably not thread safe
    DeviceConfigImpl config = (DeviceConfigImpl) this.rootConfig.getDevice(deviceId);
    if (config == null) {
        throw new ScanException("No device with ID \"" + deviceId + "\" found.");
    }
    DriverService activeDriver = activeDrivers.get(config.driverParent.id);
    if (activeDriver == null) {
        throw new DriverNotAvailableException();
    }
    waitTilDeviceIsConnected(config.device);
    try {
        return config.device.connection.scanForChannels(settings);
    } catch (ConnectionException e) {
        config.device.disconnectedSignal();
        throw new ScanException(e.getMessage(), e);
    }
}
Also used : ScanException(org.openmuc.framework.config.ScanException) DriverNotAvailableException(org.openmuc.framework.config.DriverNotAvailableException) ConnectionException(org.openmuc.framework.driver.spi.ConnectionException) DriverService(org.openmuc.framework.driver.spi.DriverService)

Example 3 with DriverService

use of org.openmuc.framework.driver.spi.DriverService in project OpenMUC by isc-konstanz.

the class DataManager method interruptDeviceScan.

@Override
public void interruptDeviceScan(String driverId) throws DriverNotAvailableException, UnsupportedOperationException {
    DriverService driver = activeDrivers.get(driverId);
    if (driver == null) {
        throw new DriverNotAvailableException();
    }
    driver.interruptDeviceScan();
}
Also used : DriverNotAvailableException(org.openmuc.framework.config.DriverNotAvailableException) DriverService(org.openmuc.framework.driver.spi.DriverService)

Example 4 with DriverService

use of org.openmuc.framework.driver.spi.DriverService in project OpenMUC by isc-konstanz.

the class DataManager method scanForDevices.

@Override
public void scanForDevices(String driverId, String settings, DeviceScanListener scanListener) throws DriverNotAvailableException {
    DriverService driver = activeDrivers.get(driverId);
    if (driver == null) {
        throw new DriverNotAvailableException();
    }
    executor.execute(new ScanForDevicesTask(driver, settings, scanListener));
}
Also used : DriverNotAvailableException(org.openmuc.framework.config.DriverNotAvailableException) DriverService(org.openmuc.framework.driver.spi.DriverService)

Example 5 with DriverService

use of org.openmuc.framework.driver.spi.DriverService in project OpenMUC by isc-konstanz.

the class DataManager method scanForDevices.

@Override
public List<DeviceScanInfo> scanForDevices(String driverId, String settings) throws DriverNotAvailableException, ArgumentSyntaxException, ScanException, ScanInterruptedException {
    DriverService driver = activeDrivers.get(driverId);
    if (driver == null) {
        throw new DriverNotAvailableException();
    }
    BlockingScanListener blockingScanListener = new BlockingScanListener();
    try {
        driver.scanForDevices(settings, blockingScanListener);
    } catch (RuntimeException e) {
        if (e instanceof UnsupportedOperationException) {
            throw e;
        }
        throw new ScanException(e);
    }
    return blockingScanListener.scanInfos;
}
Also used : ScanException(org.openmuc.framework.config.ScanException) DriverNotAvailableException(org.openmuc.framework.config.DriverNotAvailableException) DriverService(org.openmuc.framework.driver.spi.DriverService)

Aggregations

DriverNotAvailableException (org.openmuc.framework.config.DriverNotAvailableException)5 DriverService (org.openmuc.framework.driver.spi.DriverService)5 ScanException (org.openmuc.framework.config.ScanException)3 ConnectionException (org.openmuc.framework.driver.spi.ConnectionException)2 File (java.io.File)1 FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Deque (java.util.Deque)1 HashMap (java.util.HashMap)1 LinkedHashMap (java.util.LinkedHashMap)1 LinkedList (java.util.LinkedList)1 List (java.util.List)1 ListIterator (java.util.ListIterator)1 Map (java.util.Map)1 Entry (java.util.Map.Entry)1 Optional (java.util.Optional)1 Queue (java.util.Queue)1 CountDownLatch (java.util.concurrent.CountDownLatch)1