messageHandler method

void messageHandler(
  1. 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();
}