Описание
Драйвер устройства реализуется в виде сервиса. Так как сервис гарантировано существует в одном экземпляре, он может монопольно занимать порт и другие ресурсы, связанные с устройством. Должен предоставлять необходимые методы, свойства и события для взаимодействия и "мониторинга". Для хранения любых настроек можно использовать соответствующую секцию конфига (см сервис) Прим.: в дальнейшем настройки порта могут быть перенесены из секции "devices" в настройки сервиса
Прикладные компоненты взаимодействуют с устройством только через такой сервис. Для примера можно посмотреть BillValidatorService в ветке demo(http://gitlab.quokka.pub/LikeAWildfire/QComponent4/blob/demo/src/Services/BillValidatorService.js)
Пример
Кусок конфига для этого сервиса
"devices": {
"billValidator": {
"port": {
"name": "COM3",
"baudRate": 9600
}
},
}
................................................
"services": [
{
"name": "BillValidator",
"displayName": "Bill Validator",
"type": "Services.BillValidatorService",
"description": "Handle CashCode devices",
"startup": "always"
},
................................................
получение имени порта
var self=this;
// obtain reference to related config branch
// note: this.config provided by base class (AbstractService)
var confPart = this.config.get('system.devices.billValidator');
/* Subscribe to port settings changes */
var portRef = confPart.ref('port');
portRef.subscribe(function(val){
self._handlePort(val);
});
/* OR get port settings once */
this._handlePort(portRef.get());
подключение Важно: BillValidatorService использует SerialManager - обертку над модулем serialport Умеет все что умеет serialport, но еще может делать reconnect
_handlePort: function(portConf) {
// obtain port name
this.portName = portConf.get('name');
// create port options ( serialport/SerialManager constructor second argument )
var opts = {};
var baudRate = portConf.get('baudRate');
if (baudRate) opts.baudRate = baudRate;
// connect or reconnect to port
if (!this._serialPort)
this._serialPort = new require('../../platform/SerialManager')(this.portName, opts);
else
this._serialPort.reconnect(this.portName, opts);
},