stats

Non blocking Morse

Al eerder had ik een morse generator gebouwd, maar daarin werd de timing met delay() gedaan. Bij gebruik voor een Vosje (zie vossenjacht) had ik een non blocking versie nodig, dus met millis(). De nieuwe morse generator is opgebouwd rond een 'state machine' en daarmee ook nog eens heel compact geschreven.

Een Vosje heeft natuurlijk een (herkennigs) geluidje nodig en daar dient character '*' voor; het vosnummer in piepjes (dit's). Maar bij meer (hulp) vosjes was behoefte aan een extra herkenning, vandaar een extra 'dah' (case 13), waarmee totaal 14 (2x7) units zijn te herkennen. [ '.' t/m '.......' en '.-' t/m '.......-' ]

 
// 1=char, 2=loop, 3=upper, 4=find, 5=morse, 6=spatie,
// 7=dit/dah, 8=room, 9=toon, 10=timer, 11=pause,
// 12=done, 13=extra dah
// s=step, p=pointer, c=char, t=teken, w=wacht, N=vosNr

void loop() {
  mils = millis();
  if (room) room = next - mils; // tijd tot Sync  (step 8)
  if (rest) rest = wait - mils; // pause (step 11)

  if (aan ) {        //  vos actief
    switch (s) {
    case  1 : s++; if (c = txt[p++]) s = 3; break;
    case  2 : p = 0; w = 7; s = 10; break;
    case  3 : s++; n = sizeof(mtab); c = toupper(c); break;
    case  4 : s++; while (n--) if (c == mtab[n].Chr) break; break;
    case  5 : t = mtab[n].Pat;  s = (t) ? 6 : 1; break;
    case  6 : s++; if (c == ' ') s = 10; w = 6; break;
    case  7 : s++; w = (t & 1) ? 3 : 1; t >>= 1; break;
    case  8 : if (room > (w * dot) && !cast) s++; break;
    case  9 : s++; tone(cwePin, hz, (w++ * dot); break;
    case 10 : s++; wait = mils + (w * dot); break;
    case 11 : if (rest) break; s++; if (w == 3) s = 1; break;
    case 12 : s = (t) ? 7 : 1; if (t == 1) s = 13; break;
    case 13 : s = (c == '*' && N > 7) ? 7 : 10; w = 3; break;
    default : s = 1;
  }
 }
 ...
}

Met een beetje fantasie zijn vanuit de commentaren de gebruikte variabelen wel te herleiden. Bij waarden onder de 255 zijn bytes gebruikt (enkele letter), (unsigned) longs bij millis en soms een int. De morseteken lijst is gelijk aan de morse generator van het beacon project.

Timing w: dit=100+100mS, dah=300+100mS, space=600mS, end=700mS

Omdat het Vosje een vorm van wifi gebruikt en de vos-zender de ontvangst kan storen, wordt in case 8 gekeken of de resterende tijd (room en cast) totaan het sync moment voldoende is om nog een toon uit te zenden. Indien die tijd te kort is wordt dit uitgesteld en rekt daarmee de pause tussen de dit's en dah's iets op. In het ergste geval kan als voorbeeld de letter 'A' (dit dah) neigen naar een 'E' (dit) gevolgd door een 'T' (dah).
Met rest (afgeleidevan w) wordt de duur van de tonen en pauses verzorgd. De periode dat het vosje actief is wordt bepaald met aan.

Heb je vragen of opmerkingen? Stuur me een berichtje en je krijgt alle gewenste informatie!

HOME