| /* |
| * 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.example.android.apis.os; |
| |
| /** 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; |
| } |
| } |