/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jerome.utils.device; /** * Class that implements the text to morse code coversion * * 摩斯密码转换器 * */ class MorseCodeConverter { private static final long SPEED_BASE = 100; static final long DOT = SPEED_BASE; static final long DASH = SPEED_BASE * 3; static final long GAP = SPEED_BASE; static final long LETTER_GAP = SPEED_BASE * 3; static final long WORD_GAP = SPEED_BASE * 7; /** The characters from 'A' to 'Z' */ private static final long[][] LETTERS = new long[][] { /* A */new long[] { DOT, GAP, DASH }, /* B */new long[] { DASH, GAP, DOT, GAP, DOT, GAP, DOT }, /* C */new long[] { DASH, GAP, DOT, GAP, DASH, GAP, DOT }, /* D */new long[] { DASH, GAP, DOT, GAP, DOT }, /* E */new long[] { DOT }, /* F */new long[] { DOT, GAP, DOT, GAP, DASH, GAP, DOT }, /* G */new long[] { DASH, GAP, DASH, GAP, DOT }, /* H */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DOT }, /* I */new long[] { DOT, GAP, DOT }, /* J */new long[] { DOT, GAP, DASH, GAP, DASH, GAP, DASH }, /* K */new long[] { DASH, GAP, DOT, GAP, DASH }, /* L */new long[] { DOT, GAP, DASH, GAP, DOT, GAP, DOT }, /* M */new long[] { DASH, GAP, DASH }, /* N */new long[] { DASH, GAP, DOT }, /* O */new long[] { DASH, GAP, DASH, GAP, DASH }, /* P */new long[] { DOT, GAP, DASH, GAP, DASH, GAP, DOT }, /* Q */new long[] { DASH, GAP, DASH, GAP, DOT, GAP, DASH }, /* R */new long[] { DOT, GAP, DASH, GAP, DOT }, /* S */new long[] { DOT, GAP, DOT, GAP, DOT }, /* T */new long[] { DASH }, /* U */new long[] { DOT, GAP, DOT, GAP, DASH }, /* V */new long[] { DOT, GAP, DOT, GAP, DASH }, /* W */new long[] { DOT, GAP, DASH, GAP, DASH }, /* X */new long[] { DASH, GAP, DOT, GAP, DOT, GAP, DASH }, /* Y */new long[] { DASH, GAP, DOT, GAP, DASH, GAP, DASH }, /* Z */new long[] { DASH, GAP, DASH, GAP, DOT, GAP, DOT }, }; /** The characters from '0' to '9' */ private static final long[][] NUMBERS = new long[][] { /* 0 */new long[] { DASH, GAP, DASH, GAP, DASH, GAP, DASH, GAP, DASH }, /* 1 */new long[] { DOT, GAP, DASH, GAP, DASH, GAP, DASH, GAP, DASH }, /* 2 */new long[] { DOT, GAP, DOT, GAP, DASH, GAP, DASH, GAP, DASH }, /* 3 */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DASH, GAP, DASH }, /* 4 */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DOT, GAP, DASH }, /* 5 */new long[] { DOT, GAP, DOT, GAP, DOT, GAP, DOT, GAP, DOT }, /* 6 */new long[] { DASH, GAP, DOT, GAP, DOT, GAP, DOT, GAP, DOT }, /* 7 */new long[] { DASH, GAP, DASH, GAP, DOT, GAP, DOT, GAP, DOT }, /* 8 */new long[] { DASH, GAP, DASH, GAP, DASH, GAP, DOT, GAP, DOT }, /* 9 */new long[] { DASH, GAP, DASH, GAP, DASH, GAP, DASH, GAP, DOT }, }; private static final long[] ERROR_GAP = new long[] { GAP }; /** Return the pattern data for a given character */ static long[] pattern(char c) { if (c >= 'A' && c <= 'Z') { return LETTERS[c - 'A']; } if (c >= 'a' && c <= 'z') { return LETTERS[c - 'a']; } else if (c >= '0' && c <= '9') { return NUMBERS[c - '0']; } else { return ERROR_GAP; } } static long[] pattern(String str) { boolean lastWasWhitespace; int strlen = str.length(); // Calculate how long our array needs to be. int len = 1; lastWasWhitespace = true; for (int i = 0; i < strlen; i++) { char c = str.charAt(i); if (Character.isWhitespace(c)) { if (!lastWasWhitespace) { len++; lastWasWhitespace = true; } } else { if (!lastWasWhitespace) { len++; } lastWasWhitespace = false; len += pattern(c).length; } } // Generate the pattern array. Note that we put an extra element of 0 // in at the beginning, because the pattern always starts with the // pause, // not with the vibration. long[] result = new long[len + 1]; result[0] = 0; int pos = 1; lastWasWhitespace = true; for (int i = 0; i < strlen; i++) { char c = str.charAt(i); if (Character.isWhitespace(c)) { if (!lastWasWhitespace) { result[pos] = WORD_GAP; pos++; lastWasWhitespace = true; } } else { if (!lastWasWhitespace) { result[pos] = LETTER_GAP; pos++; } lastWasWhitespace = false; long[] letter = pattern(c); System.arraycopy(letter, 0, result, pos, letter.length); pos += letter.length; } } return result; } }