updateFrom method

void updateFrom(
  1. String statusString, {
  2. required bool sqni,
})

Implementation

void updateFrom(String statusString, {required bool sqni}) {
  try {
    if (statusString.isEmpty) return;

    final sUp = statusString.toUpperCase();

    // ---- First: look for OS in strings like "HDCSQOK#OS=0#...#SI=00"
    final os = StatusParsers.extractOS(sUp);
    if (os != null) {
      switch (os) {
        case '0': // online
          _status
            ..ready = true
            ..init = false
            ..notExist = false
            ..diskError = false
            ..paperJam = false
            ..paperOut = false
            ..powerOff = false
            ..unknown = false
            ..headLifted = false
            ..maxWeightExceeded = false
            ..desc = 'Device is Ready'
            ..state = StatusState.online;
          break;

        case '1': // offline
          _status
            ..ready = false
            ..init = false
            ..notExist = false
            ..diskError = false
            ..paperJam = false
            ..paperOut = false
            ..powerOff = true
            ..unknown = false
            ..headLifted = false
            ..maxWeightExceeded = false
            ..desc = 'Device is Offline'
            ..state = StatusState.offline;
          if (sqni) {
            // match your C# tweak for SQNI case
            _status.powerOff = false;
            _status.unknown = true;
          }
          break;

        case '2': // print head lifted (your C# also set paperJam=true)
          _status
            ..ready = true
            ..init = false
            ..notExist = false
            ..diskError = false
            ..paperJam = true
            ..headLifted = true
            ..paperOut = false
            ..powerOff = false
            ..unknown = false
            ..maxWeightExceeded = false
            ..desc = 'Printer Head Lifted'
            ..state = StatusState.printHeadLifted;
          break;

        case '3': // busy
          _status
            ..ready = true
            ..init = false
            ..notExist = false
            ..diskError = false
            ..paperJam = false
            ..paperOut = false
            ..powerOff = false
            ..unknown = false
            ..headLifted = false
            ..maxWeightExceeded = false
            ..desc = 'Busy'
            ..state = StatusState.busy;
          break;

        default: // other error/unknown
          _status
            ..ready = false
            ..init = false
            ..notExist = false
            ..diskError = false
            ..paperJam = false
            ..paperOut = false
            ..powerOff = false
            ..unknown = true
            ..headLifted = false
            ..maxWeightExceeded = false
            ..desc = 'Unknown'
            ..state = StatusState.unknown;
      }
    }

    // ---- Then: look for SI=.. flags (paper state), if present
    final si = StatusParsers.extractSI(sUp);
    if (si != null) {
      switch (si) {
        case '00':
        case '11':
          _status.paperJam = false;
          _status.paperOut = false;
          break;

        case '10': // normalized from 1O -> paper out
          _status
            ..ready = true
            ..init = false
            ..notExist = false
            ..diskError = false
            ..paperJam = false
            ..paperOut = true
            ..powerOff = false
            ..unknown = false
            ..maxWeightExceeded = false
            ..desc = 'Paper Out'
            ..state = StatusState.paperOut;
          break;

        case '1J': // paper jam
          _status
            ..ready = true
            ..init = false
            ..notExist = false
            ..diskError = false
            ..paperJam = true
            ..paperOut = false
            ..powerOff = false
            ..unknown = false
            ..maxWeightExceeded = false
            ..desc = 'Paper Jam'
            ..state = StatusState.paperJam;
          break;
      }
    }

    // ---- Fallbacks for single-word replies like HDCMXOK / HDCUCOK#999
    if (os == null && si == null) {
      if (sUp.contains('OK')) {
        _status
          ..ready = true
          ..init = false
          ..notExist = false
          ..diskError = false
          ..paperJam = false
          ..paperOut = false
          ..powerOff = false
          ..unknown = false
          ..maxWeightExceeded = false
          ..desc = 'Device is Ready'
          ..state = StatusState.online;
      } else if (sUp.contains('ERR')) {
        // mirrors your C# (ERR still set to Ready/online)
        _status
          ..ready = true
          ..init = false
          ..notExist = false
          ..diskError = false
          ..paperJam = false
          ..paperOut = false
          ..powerOff = false
          ..unknown = false
          ..maxWeightExceeded = false
          ..desc = 'Device is Ready'
          ..state = StatusState.online;
      }
    }

    // publish snapshot
    statusNotifier.value = _status.clone();
  } catch (_) {
    // swallow/log as in C#
  }
}