Nonstop Logo

NonStop

Digital Product Development Experts for Startups & Enterprises

About | Website

morse_tap

Build Status License: MIT

A Flutter package that provides Morse code input functionality using intuitive gestures. Create interactive Morse code experiences with single taps for dots, double taps for dashes, and long presses for spaces.

Morse Tap Demo

Features

MorseTapDetector - Widget that detects specific Morse code patterns using gestures
🎯 MorseTextInput - Real-time gesture-to-text conversion widget
🔄 String Extensions - Convert any string to/from Morse code
Fast Algorithm - Efficient Morse code conversion with comprehensive character support
🎨 Intuitive Gestures - Single tap = dot, double tap = dash, long press = space
📳 Haptic Feedback - Customizable tactile feedback for enhanced user experience

Usage Examples

1. MorseTapDetector - Pattern Detection

Detect when users input a specific Morse code pattern using gestures:

MorseTapDetector(
  expectedMorseCode: "... --- ...", // SOS pattern
  onCorrectSequence: () {
    print("SOS detected!");
    // Handle correct sequence
  },
  onIncorrectSequence: () {
    print("Wrong pattern, try again");
  },
  onSequenceChange: (sequence) {
    print("Current sequence: $sequence");
    // Update UI with current input
  },
  onDotAdded: () => print("Dot added"),
  onDashAdded: () => print("Dash added"),
  onSpaceAdded: () => print("Space added"),
  child: Container(
    width: 200,
    height: 200,
    decoration: BoxDecoration(
      color: Colors.blue,
      borderRadius: BorderRadius.circular(12),
    ),
    child: const Center(
      child: Text(
        'Use Gestures for SOS',
        style: TextStyle(color: Colors.white, fontSize: 20),
      ),
    ),
  ),
)

2. MorseTextInput - Real-time Conversion

Convert tap input to text in real-time:

class MorseInputExample extends StatelessWidget {
  final TextEditingController controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        MorseTextInput(
          controller: controller,
          autoConvertToText: true,
          showMorsePreview: true,
          onTextChanged: (text) {
            print("Converted text: $text");
          },
          decoration: const InputDecoration(
            labelText: 'Tap to input text',
            border: OutlineInputBorder(),
          ),
        ),
        // Your converted text appears in the controller
        TextField(
          controller: controller,
          readOnly: true,
          decoration: const InputDecoration(
            labelText: 'Output',
          ),
        ),
      ],
    );
  }
}

3. String Extensions

Easy string to Morse code conversion:

// Convert text to Morse code
String morse = "HELLO WORLD".toMorseCode();
print(morse); // ".... . .-.. .-.. --- / .-- --- .-. .-.. -.."

// Convert Morse code back to text
String text = "... --- ...".fromMorseCode();
print(text); // "SOS"

// Validate Morse input
bool isValid = "... --- ...".isValidMorseSequence();
print(isValid); // true

// Check if string contains only Morse characters
bool isMorseInput = "... abc".isValidMorseInput();
print(isMorseInput); // false

Configuration

Timing Configuration

Customize the input timeout:

MorseTapDetector(
  expectedMorseCode: "... --- ...",
  inputTimeout: Duration(seconds: 5),  // Time allowed for next input
  onCorrectSequence: () => print("Correct!"),
  child: MyButton(),
)

Note: The timeout resets after each input, allowing users to take their time with long sequences as long as they keep entering characters.

Haptic Feedback

Provide tactile feedback for gestures:

MorseTapDetector(
  expectedMorseCode: "... --- ...",
  hapticConfig: HapticConfig.defaultConfig,  // Enable haptic feedback
  onCorrectSequence: () => print("Correct!"),
  child: MyButton(),
)

Preset configurations:

// Different preset options
HapticConfig.disabled       // No haptic feedback
HapticConfig.light          // Subtle feedback
HapticConfig.defaultConfig  // Moderate feedback  
HapticConfig.strong         // Intense feedback

// Custom configuration
HapticConfig(
  enabled: true,
  dotIntensity: HapticFeedbackType.lightImpact,
  dashIntensity: HapticFeedbackType.mediumImpact,
  correctSequenceIntensity: HapticFeedbackType.heavyImpact,
)

Visual Feedback

Control visual feedback options:

MorseTextInput(
  controller: controller,
  showMorsePreview: true,              // Show Morse preview
  feedbackColor: Colors.green,         // Tap feedback color
  tapAreaHeight: 150.0,               // Height of tap area
  autoConvertToText: false,           // Keep as Morse code
)

Supported Characters

The package supports:

  • Letters: A-Z (26 letters)
  • Numbers: 0-9 (10 digits)
  • Punctuation: . , ? ' ! / ( ) & : ; = + - _ " $ @

See the complete mapping in MorseCodec class documentation.

Advanced Usage

Custom Morse Patterns

Create custom pattern detection:

final customPattern = "HELP".toMorseCode();

MorseTapDetector(
  expectedMorseCode: customPattern,
  onCorrectSequence: () => showDialog(
    context: context,
    builder: (context) => AlertDialog(
      title: Text("Help Requested!"),
      content: Text("Someone needs assistance."),
    ),
  ),
  child: EmergencyButton(),
)

Contributing

We welcome contributions in various forms:

  • Proposing new features or enhancements.
  • Reporting and fixing bugs.
  • Engaging in discussions to help make decisions.
  • Improving documentation, as it is essential.
  • Sending Pull Requests is greatly appreciated!

Stay connected and get the latest updates!

LinkedIn X.com Instagram YouTube Email


⭐ Star us on GitHub if this helped you!

📜 License

This project is licensed under the MIT License - see the LICENSE file for details.

🎉 Founded by Ajay Kumar 🎉**

Libraries

morse_tap
A Flutter package that provides Morse code input functionality through tap-based widgets.