62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
/**
|
|
* @file signal-store.js
|
|
* @brief 信号数据缓存 — 接收 WS 推送并更新内存 + localStorage 持久化
|
|
*/
|
|
|
|
|
|
var SignalStore = {
|
|
data: { out: [], in: [], yk: [], ao: [], param: [] },
|
|
|
|
/**
|
|
* @brief 合并 WS 推送数据到缓存, 并持久化到 localStorage
|
|
* @param {object} push {out:[...], in:[...], ...}
|
|
*/
|
|
update: function(push) {
|
|
var self = this;
|
|
['out', 'in', 'yk', 'ao', 'param'].forEach(function(type) {
|
|
if (push[type])
|
|
{
|
|
var map = {};
|
|
self.data[type].forEach(function(s) { map[s.saddr] = s; });
|
|
push[type].forEach(function(s) { map[s.saddr] = s; });
|
|
self.data[type] = Object.keys(map).map(function(k) { return map[k]; });
|
|
}
|
|
});
|
|
this._save();
|
|
},
|
|
|
|
get: function(type) {
|
|
return this.data[type] || [];
|
|
},
|
|
|
|
addFromPush: function(type, item) {
|
|
this.data[type].push(item);
|
|
this._save();
|
|
},
|
|
|
|
remove: function(type, saddr) {
|
|
this.data[type] = this.data[type].filter(function(s) { return s.saddr !== saddr; });
|
|
this._save();
|
|
},
|
|
|
|
/** @brief 从 localStorage 恢复缓存 */
|
|
restore: function() {
|
|
try {
|
|
var saved = localStorage.getItem('rtu_signals');
|
|
if (saved) {
|
|
var parsed = JSON.parse(saved);
|
|
if (parsed && parsed.out) { this.data = parsed; }
|
|
}
|
|
} catch (e) { /* ignore corrupt data */ }
|
|
},
|
|
|
|
/** @brief 持久化到 localStorage (debounced) */
|
|
_save: function() {
|
|
var self = this;
|
|
if (this._timer) clearTimeout(this._timer);
|
|
this._timer = setTimeout(function() {
|
|
try { localStorage.setItem('rtu_signals', JSON.stringify(self.data)); } catch (e) {}
|
|
}, 500);
|
|
}
|
|
};
|