github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/mappers/modbus_mapper/src/watchfile.js (about)

     1  const path = require('path');
     2  const fs = require('fs');
     3  const chokidar = require('chokidar');
     4  const filename = 'dpl/deviceProfile.json';
     5  const util = require('util');
     6  
     7  var devIns = new Map();
     8  var devMod = new Map();
     9  var devPro = new Map();
    10  var modVisitr = new Map();
    11  
    12  // watchChange monitor dpl configuration file, reload if changed
    13  function watchChange(paths, onChange) {
    14      if (typeof onChange !== 'function') throw Error(`onChange (${onChange}) is not a function`);
    15  
    16      if (!Array.isArray(paths)) paths = [paths];
    17  
    18      paths.forEach(path => {
    19          if (!(path && fs.existsSync(path))) throw Error(`can't find path ${path}`);
    20      });
    21  
    22      let watcher = chokidar.watch(paths);
    23      watcher.on('ready', ()=>{
    24          watcher.on('add', ()=>{
    25              logger.info('watched file added, load dpl config');
    26              onChange(filename);
    27          });
    28      });
    29  }
    30  
    31  // loadDpl load dpl configuration file
    32  function loadDpl(filename, callback) {
    33      fs.readFile(filename, 'utf-8', (err, data)=>{
    34          if (err) {
    35              logger.error('load dpl config error: ', err);
    36          } else {
    37              let dplConfigs = JSON.parse(data);
    38              processData(dplConfigs, callback);
    39          }
    40      });
    41  }
    42  
    43  // loadConfig load mqtt configuration file
    44  function loadConfig(filename, callback) {
    45      fs.readFile(filename, 'utf-8', (err, data)=>{
    46          if (err) {
    47              logger.error('load config error: ', err);
    48          } else {
    49              let configs = JSON.parse(data);
    50              callback(null, configs);
    51          }
    52      });
    53  }
    54  
    55  // processData parse dpl config for each deviceInstance
    56  function processData(dplConfigs, callback) {
    57      for (let i = 0; i < dplConfigs.deviceInstances.length; i++) {
    58          buildMaps(dplConfigs, i, (err)=>{
    59              if (err) {
    60                  logger.error('build devIns maps error: ', err)
    61              }
    62          });
    63      }
    64      for (let i = 0; i < dplConfigs.deviceModels.length; i++) {
    65          for (let j = 0; j < dplConfigs.deviceModels[i].properties.length; j++){
    66              buildVisitorMaps(dplConfigs, i, j);
    67          }
    68      }
    69      callback(devIns, devMod, devPro, modVisitr);
    70  }
    71  
    72  // buildMaps build three maps 1.map[deviceID]deviceInstance, 2.map[deviceID]deviceModel, 3.map[deviceID]protocol
    73  function buildMaps(dplConfigs, i) {
    74      devIns.set(dplConfigs.deviceInstances[i].id, dplConfigs.deviceInstances[i]);
    75      let foundMod = dplConfigs.deviceModels.findIndex((element)=>{
    76          return element.name === dplConfigs.deviceInstances[i].model;
    77      });
    78      if (foundMod != -1) {
    79          devMod.set(dplConfigs.deviceInstances[i].id, dplConfigs.deviceModels[foundMod]);
    80      } else {
    81          logger.error('failed to find model[%s] for deviceid', dplConfigs.deviceModels[i].model);
    82      }
    83      
    84      let foundPro = dplConfigs.protocols.findIndex((element)=>{
    85          return element.name === dplConfigs.deviceInstances[i].protocol;
    86      });
    87      if (foundPro != -1) {
    88          devPro.set(dplConfigs.deviceInstances[i].id, dplConfigs.protocols[foundMod]);
    89      } else {
    90          logger.error('failed to find protocol[%s] for deviceid', dplConfigs.deviceModels[i].protocol);
    91      } 
    92  }
    93  
    94  // buildVisitorMaps build map[model-property-protocol]propertyVisitor
    95  function buildVisitorMaps(dplConfigs, i, j) {
    96      let foundVisitor = dplConfigs.propertyVisitors.findIndex((element)=>{
    97          return element.modelName === dplConfigs.deviceModels[i].name && element.propertyName === dplConfigs.deviceModels[i].properties[j].name;
    98      });
    99      if (foundVisitor != -1) {
   100          modVisitr.set(util.format('%s-%s-%s', dplConfigs.propertyVisitors[foundVisitor].modelName, dplConfigs.propertyVisitors[foundVisitor].propertyName, dplConfigs.propertyVisitors[foundVisitor].protocol), dplConfigs.propertyVisitors[foundVisitor]);
   101      } else {
   102          logger.error('failed to find visitor for model[%s], property[%s]', dplConfigs.deviceModels[i].name, dplConfigs.deviceModels[i].properties[j].name);
   103      }  
   104  }
   105  
   106  module.exports = {watchChange, loadDpl, loadConfig};