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};