messageHandler method
void
messageHandler(
- Map<String, dynamic> data
)
Implementation
void messageHandler(Map<String, dynamic> data) {
// update the connection status if needed
status = ProConnectionStatus.connected;
var newdata = {}; // for debug purposes really
switch (data['acn']) {
case 'asl':
// all stage layouts
layouts.clear();
var index = 0;
for (var layout in data['ary']) {
// add layout data to layouts array
var l = ProSDLayout.fromMap(index, layout);
layouts.add(l);
index++;
messageHandler(layout);
}
break;
case 'sl':
// single stage layout
// we only care about the slides and timers
// we don't care about layout or colors
for (var frame in data['fme']) {
if (frame['typ'] == 7) {
var uid = frame['uid'];
if (!timers.containsKey(uid)) timers[uid] = ProTimer.fromMap(data: frame);
if (frame['nme'].isNotEmpty) timers[uid]?.name = frame['nme'];
}
}
break;
case "ath":
//{"acn":"ath","ath":true/false,"err":""}
if (data['ath']) {
print("ProPresenter Listener is Connected");
active = true;
status = ProConnectionStatus.connected;
newdata = {'type': "authentication", 'data': true};
} else {
status = ProConnectionStatus.failed;
active = false;
newdata = {'type': "authentication", 'data': false};
}
getAllLayouts();
break;
case 'vid':
if (!data['txt'].contains('--')) {
timers['vid'] = ProTimer.fromMap(data: data);
newdata = {'type': "timer", data: timers['vid']};
_timerStreamController.add(timers['vid']);
}
break;
case "tmr":
// { "acn": "tmr", "uid": uuid, "txt": "HH:MM:SS"}
if (!data['txt'].contains('--')) {
var uid = data['uid'];
if (!timers.containsKey(uid)) {
timers[uid] = ProTimer.fromMap(data: data);
} else {
timers[uid]?.text = data['txt'];
}
newdata = {'type': "timer", data: timers[uid]};
_timerStreamController.add(timers[uid]);
}
break;
case 'msg':
var txt = data['txt'];
message = txt;
_messageStreamController.add(message);
break;
case "sys":
// Pro6 sends this
// { "acn": "sys", "txt": " 11:17 AM" }
// Pro7 sends this
// { "acn": "sys", "txt": "1626208236" }
var txt = data['txt'];
if (settings.is7) {
systemTime = TimeOfDay.fromTimestamp((int.tryParse(txt) ?? 0) * 1000);
} else {
systemTime = TimeOfDay.fromTimestring(txt);
}
newdata = {'type': "systime", 'data': systemTime};
// _sysStreamController.add(systemTime);
_timerStreamController.add('update');
break;
case "fv":
// we expect a list of 4 items in the 'ary' field identified by their 'acn' field
// cs: current slide
// csn: current slide notes
// ns: next slide
// nsn: next slide notes
var newCurrent = ProSDSlide(settings);
var newNext = ProSDSlide(settings);
for (var blob in data['ary']) {
switch (blob['acn']) {
case "cs":
newCurrent.uid = blob['uid'];
newCurrent.text = blob['txt'];
break;
case "csn":
newCurrent.notes = blob['txt'];
break;
case "ns":
newNext.uid = blob['uid'];
newNext.text = blob['txt'];
break;
case "nsn":
newNext.notes = blob['txt'];
break;
}
}
// save these new slides into the slide memory bank
if (!seenSlides.containsKey(newCurrent.uid)) seenSlides[newCurrent.uid] = newCurrent;
if (!seenSlides.containsKey(newNext.uid)) seenSlides[newNext.uid] = newNext;
// merge new data with existing data
current = seenSlides[newCurrent.uid]!
..text = newCurrent.text
..notes = newCurrent.notes;
next = seenSlides[newNext.uid]!
..text = newNext.text
..notes = newNext.notes;
newdata = {
'type': "slides",
'data': {'current': current, 'next': next}
};
_slideStreamController.add({'current': current, 'next': next});
}
print(newdata);
emit(data['acn']);
notify();
}