artemis_port_util 0.0.2 copy "artemis_port_util: ^0.0.2" to clipboard
artemis_port_util: ^0.0.2 copied to clipboard

Reliable serial (COM) port printing for Flutter. Easily list ports, open connections, send commands, and wait for structured responses with built-in timeout handling, result classification (ok, error, [...]

example/lib/main.dart

import 'dart:convert';
import 'dart:developer';
import 'package:artemis_port_util/artemis_port_util.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // TRY THIS: Try running your application with "flutter run". You'll see
        // the application has a purple toolbar. Then, without quitting the app,
        // try changing the seedColor in the colorScheme below to Colors.green
        // and then invoke "hot reload" (save your changes or press the "hot
        // reload" button in a Flutter-supported IDE, or press "r" if you used
        // the command line to start the app).
        //
        // Notice that the counter didn't reset back to zero; the application
        // state is not lost during the reload. To reset the state, use hot
        // restart instead.
        //
        // This works for code too, not just values: Most code changes can be
        // tested with just a hot reload.
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var availablePorts = [];
  List<ArtemisPortDevice> printers = [];

  @override
  void initState() {
    super.initState();
    initPorts();
  }

  void initPorts() {
    setState(() => availablePorts = ArtemisPortUtil.getPorts);
    setState(() => printers = ArtemisPortUtil.getPorts.map((a)=>ArtemisPortDevice(portName: a,config: ArtemisPortDeviceSetting(portName: a,baudRate: BaudRate.br_9600,handshake: Handshake.none),)).toList());
  }

  void testQuery() async {
    // Example: DLE EOT 4 (0x10 0x04 0x04) β€” ask paper roll status.
  }

  // Future<dynamic> portPrint(ArtemisSerialPort port) async {
  //   final result = await port.printData("SQ");
  //   // final result = await port.queryStatus();
  //   log(result.toString());
  //   // log(result.text??'');
  //   return result;
  // }

  @override
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _incrementCounter method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.
    return Scaffold(
      appBar: AppBar(
        // TRY THIS: Try changing the color here to a specific color (to
        // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar
        // change color while the other colors stay the same.
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView(
              children: [
                ...printers.map((portDevice){
                  final port = portDevice.portName;
                  return  ExpansionTile(
                    leading: IconButton(
                      onPressed: () async {
                        portDevice.asPrinter.connect();
                        // ArtemisPortPrint.log(port, "AV");
                        //
                        //                         final response = await ArtemisPortPrint.sendAndWait(
                        //                           port,
                        //                           request: [0x10, 0x04, 0x04], // e.g., ESC/POS DLE EOT 4 (paper status)
                        //                           timeout: const Duration(seconds: 1),
                        //                         );
                        //
                        // // Decide: timeout/no-response
                        //                         if (response.isEmpty) {
                        //                           // handle no response
                        //                           log("no response");
                        //                         } else {
                        //                           log("parse response");
                        //                           // parse response bytes
                        //                         }
                        //                         await ArtemisPortPrint.printBytesToCom(portName: 'COM3', bytes:utf8.encode("AV"));
                        //                       testQuery();
                        // portPrint(port);
                        // port.queryStatus();
                        // SerialProbe().test6();
                      },
                      icon: Icon(Icons.home),
                    ),
                    title: Row(
                      children: [
                        Text(portDevice.portName),
                        TextButton(
                          onPressed: () {
                            // portPrint(port);

                            portDevice.asPrinter.testQuery();
                          },
                          child: Text("port print"),
                        ),
                        TextButton(
                          onPressed: () {
                            try {
                              log("trying to se ${portDevice.portName} as barcode reader");
                              final reader = ArtemisPortBarcodeListener( onData: (String d) {

                                // log("barcode scanned ${d}");
                              },
                                  config: ArtemisPortDeviceSetting(portName: portDevice.portName,baudRate: BaudRate.br_9600,handshake: Handshake.none),
                                  portName: portDevice.portName);
                              reader.open();
                              reader.startListening();
                              reader.onBarcode.listen((d) {
                                log("barcode scanned ${d}");
                              });
                            }catch(e){
                              log("E $e");
                            }
                          },
                          child: Text("set as br"),
                        ),


                        Builder(
                          builder: (BuildContext context) {
                            final listenable = portDevice.asPrinter.statusListenable;

                            return ValueListenableBuilder<DeviceStatus>(
                              valueListenable: listenable,
                              builder: (context, status, _) {
                                switch (status.state) {
                                  case StatusState.online:
                                    return const Text('🟒 Ready');
                                  case StatusState.busy:
                                    return const Text('πŸ–¨ Printing…');
                                  case StatusState.paperOut:
                                    return const Text('πŸ“„βŒ Paper out');
                                  case StatusState.paperJam:
                                    return const Text('🧩 Paper jam');
                                  case StatusState.printHeadLifted:
                                    return const Text('πŸ”§ Head lifted');
                                  case StatusState.offline:
                                    return const Text('πŸ”΄ Offline');
                                  case StatusState.unknown:
                                    return Text('❔ ${status.desc}');
                                }
                              },
                            );
                          },
                        ),
                        // ValueListenableBuilder(
                        //   valueListenable: port.status,
                        //   builder: (context, PrinterStatus status, _) {
                        //     switch (status) {
                        //       case PrinterStatus.offline:
                        //         return TextButton(
                        //           onPressed: () {
                        //             port.connect();
                        //
                        //           },
                        //           child: Text("Connect"),
                        //
                        //         );
                        //       case PrinterStatus.ready:
                        //         return TextButton(
                        //           onPressed: () {
                        //             port.disconnect();
                        //           },
                        //           child: Text("Disconnect"),
                        //         );
                        //       case PrinterStatus.printing:
                        //         return const Text("πŸ–¨ Printing...");
                        //       case PrinterStatus.waiting:
                        //         return const Text("βŒ› Waiting response...");
                        //       case PrinterStatus.error:
                        //         return const Text("⚠️ Error");
                        //       case PrinterStatus.connecting:
                        //         return const Text("πŸ”„ Connecting...");
                        //     }
                        //   },
                        //
                        // ),
                      ],
                    ),
                    trailing: Builder(
                      builder: (BuildContext context) {
                        final listenable = portDevice.asPrinter.portStatusListenable;

                        return ValueListenableBuilder<PortStatus>(
                          valueListenable: listenable,
                          builder: (context, status, _) {
                            return Text(status.name);

                          },
                        );
                      },
                    ),

                    children: [
                      // CardListTile('Description', port.description, port),
                      // CardListTile('Transport', port.transport.toTransport(), port),
                      // CardListTile('USB Bus', port.busNumber?.toPadded(), port),
                      // CardListTile('USB Device', port.deviceNumber?.toPadded(), port),
                      // CardListTile('Vendor ID', port.vendorId?.toHex(), port),
                      // CardListTile('Product ID', port.productId?.toHex(), port),
                      // CardListTile('Manufacturer', port.manufacturer, port),
                      // CardListTile('Product Name', port.productName, port),
                      // CardListTile('Serial Number', port.serialNumber, port),
                      // CardListTile('MAC Address', port.macAddress, port),
                    ],
                  );
                })
              ],
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(child: Icon(Icons.refresh), onPressed: initPorts),
    );
  }
}

class CardListTile extends StatelessWidget {
  final String name;
  final String? value;
  final SerialPort? port;

  const CardListTile(this.name, this.value, this.port, {super.key});

  @override
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(title: Text("value" ?? 'N/A'), subtitle: Text(name), onTap: () {}),
    );
  }
}
0
likes
0
points
50
downloads

Publisher

unverified uploader

Weekly Downloads

Reliable serial (COM) port printing for Flutter. Easily list ports, open connections, send commands, and wait for structured responses with built-in timeout handling, result classification (ok, error, unknown, timeout), and optional STX/ETX framing. Perfect for receipt printers, label printers, and other serial devices that require request β†’ response communication.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter, flutter_libserialport

More

Packages that depend on artemis_port_util