iMin Hardware Plugin

A comprehensive Flutter plugin for controlling iMin POS device hardware features including printer, display, cashbox, light, NFC, RFID, scanner, MSR, electronic scale, serial port, segment display, floating window, and camera scanning.

Features

  • 🖨️ Printer - Print text, images, barcodes, QR codes, and labels
  • 📺 Secondary Display - Show text, images, and videos on customer display
  • 💰 Cash Box - Cash drawer control with voltage settings
  • 💡 Light Control - USB LED indicator lights (red/green)
  • 💳 NFC Reader - NFC card reading with real-time tag stream
  • 📷 Scanner - Hardware barcode/QR code scanner
  • 💳 MSR - Magnetic stripe card reader
  • ⚖️ Electronic Scale - Weight measurement and pricing (Android 13+)
  • 🔌 Serial Port - Serial communication
  • 🔢 Segment Display - USB digital tube display
  • 🪟 Floating Window - System floating window overlay
  • 📸 Camera Scan - Camera-based barcode/QR code scanning (ZXing)
  • 📡 RFID - RFID tag read/write

Supported Devices

  • iMin Crane 1
  • iMin Swan 1/2/3
  • iMin Swift 1/2/2 Ultra
  • iMin Lark 1
  • iMin Falcon 2
  • iMin D4 series
  • iMin M2-Pro

Installation

Add this to your package's pubspec.yaml file:

dependencies:
  imin_hardware_plugin:
    git:
      url: https://github.com/iminsoftware/FlutterApiTest.git
      ref: v1.0.0  # Use specific version tag

Then run:

flutter pub get

Method 2: Using pub.dev (When available)

dependencies:
  imin_hardware_plugin: ^1.0.0

Method 3: Using Local Path

dependencies:
  imin_hardware_plugin:
    path: ../FlutterApiTest

For detailed installation instructions, see GIT_DEPENDENCY_GUIDE.md

Quick Start

Printer Example

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Initialize printer
await IminPrinter.initPrinter();

// Print text
await IminPrinter.printText("Hello World");

// Print and feed paper
await IminPrinter.printAndFeedPaper(100);

Scanner Example

// Start scanning
IminScanner.startScan();

// Listen to scan results
IminScanner.scanStream.listen((barcode) {
  print('Scanned: $barcode');
});

// Stop scanning
IminScanner.stopScan();

Electronic Scale Example (Android 13+)

// Connect to scale service
await IminScaleNew.connectService();

// Start getting weight data
await IminScaleNew.getData();

// Listen to weight events
IminScaleNew.eventStream.listen((event) {
  if (event.isWeight) {
    final data = event.data as ScaleWeightData;
    print('Weight: ${data.net}kg');
  }
});

Usage

Secondary Display

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Check if secondary display is available
bool available = await IminDisplay.isAvailable();

// Enable secondary display
bool success = await IminDisplay.enable();

// Show text
await IminDisplay.showText('Hello, Secondary Display!');

// Show image
await IminDisplay.showImage('/path/to/image.png');

// Play video
await IminDisplay.playVideo('/path/to/video.mp4');

// Clear display
await IminDisplay.clear();

// Disable display
await IminDisplay.disable();

Cash Box

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Open cash box
bool success = await IminCashBox.open();

// Get cash box status
bool isOpen = await IminCashBox.getStatus();

// Set voltage (9V, 12V, or 24V)
bool success = await IminCashBox.setVoltage(CashBoxVoltage.v12);

Light Control

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Connect to light device
bool connected = await IminLight.connect();

// Turn on green light (success/ready state)
bool success = await IminLight.turnOnGreen();

// Turn on red light (error/busy state)
bool success = await IminLight.turnOnRed();

// Turn off all lights
bool success = await IminLight.turnOff();

// Disconnect from device
bool success = await IminLight.disconnect();

NFC Reader

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Check if NFC is available
bool available = await IminNfc.isAvailable();

// Check if NFC is enabled
bool enabled = await IminNfc.isEnabled();

// Open NFC settings
await IminNfc.openSettings();

// Listen to NFC tag stream
IminNfc.tagStream.listen((tag) {
  print('NFC ID: ${tag.id}');
  print('Formatted ID: ${tag.formattedId}'); // e.g., "1234 5678 90AB CDEF"
  print('Content: ${tag.content}');
  print('Technology: ${tag.technology}');
  print('Timestamp: ${tag.timestamp}');
});

Scanner

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Configure scanner (optional)
await IminScanner.configure(
  action: 'com.imin.scanner.api.RESULT_ACTION',
  dataKey: 'decode_data_str',
);

// Start listening
await IminScanner.startListening();

// Listen to scan events
IminScanner.scanStream.listen((result) {
  print('Scanned: ${result.data}');
  print('Timestamp: ${result.timestamp}');
});

// Stop listening
await IminScanner.stopListening();

Floating Window

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Show floating window
bool success = await FloatingWindowApi.show();

// Update text
await FloatingWindowApi.updateText('Hello, Floating Window!');

// Set position
await FloatingWindowApi.setPosition(100, 100);

// Check if showing
bool isShowing = await FloatingWindowApi.isShowing();

// Hide floating window
await FloatingWindowApi.hide();

Camera Scan

import 'package:imin_hardware_plugin/imin_hardware_plugin.dart';

// Quick scan (default formats)
String result = await CameraScanApi.scanQuick();

// Scan QR code only
String qrCode = await CameraScanApi.scanQRCode();

// Scan barcode only
String barcode = await CameraScanApi.scanBarcode();

// Custom scan with specific formats
String customResult = await CameraScanApi.scan(
  formats: [BarcodeFormat.qrCode, BarcodeFormat.code128],
  prompt: 'Scan a code',
);

Permissions

Android

Add the following permissions to your AndroidManifest.xml:

<!-- Display and floating window permissions -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.INTERNET"/>

<!-- USB permissions for light control and segment display -->
<uses-feature android:name="android.hardware.usb.host" android:required="false"/>

<!-- NFC permissions -->
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />

<!-- Camera permissions for camera scan -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>

<!-- Activity configuration for NFC -->
<activity
    android:name=".MainActivity"
    android:launchMode="singleTop">
</activity>

Notes:

  • SYSTEM_ALERT_WINDOW - Required for secondary display overlay and floating window
  • INTERNET - Required for loading network images/videos on secondary display
  • android.hardware.usb.host - Required for USB light device control and segment display
  • android.permission.NFC - Required for NFC card reading
  • android.hardware.nfc - NFC hardware feature (optional)
  • android.permission.CAMERA - Required for camera-based scanning
  • android:launchMode="singleTop" - Required for NFC onNewIntent handling
  • For Android 6.0+, overlay permission needs to be requested at runtime (handled automatically)

Example

See the example directory for a complete sample app.

Development

See DEVELOPMENT.md for development documentation.

License

MIT License

Libraries

imin_hardware_plugin
iMin Hardware Plugin