Siphamandla Simelane / Mbed 2 deprecated slider_diatonic_SP

Dependencies:   SLCD TSI mbed

Fork of slider_diatonic_v1 by Vishal Bharam

Committer:
scohennm
Date:
Tue Dec 16 03:14:27 2014 +0000
Revision:
0:6c16ec0e7b9d
Child:
1:6f0197189fcc
Simple Iambic keyer. KL46Z speed select via capacitive slider.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
scohennm 0:6c16ec0e7b9d 1 #include "mbed.h"
scohennm 0:6c16ec0e7b9d 2 #include "SLCD.h"
scohennm 0:6c16ec0e7b9d 3 #include "TSISensor.h"
scohennm 0:6c16ec0e7b9d 4
scohennm 0:6c16ec0e7b9d 5 #define BASESPEED 1.200
scohennm 0:6c16ec0e7b9d 6 #define DOT 1
scohennm 0:6c16ec0e7b9d 7 #define DASH 3
scohennm 0:6c16ec0e7b9d 8 #define INTERCHAR 3
scohennm 0:6c16ec0e7b9d 9 #define CHANNELON 0
scohennm 0:6c16ec0e7b9d 10 #define CHANNELOFF 1
scohennm 0:6c16ec0e7b9d 11 #define LCDLEN 10
scohennm 0:6c16ec0e7b9d 12 #define DOTMESS "DIT"
scohennm 0:6c16ec0e7b9d 13 #define DASHMESS "DAH"
scohennm 0:6c16ec0e7b9d 14 #define IAMMESS "IAMB"
scohennm 0:6c16ec0e7b9d 15 #define NULLMESS "111" // LCD idle message
scohennm 0:6c16ec0e7b9d 16 #define FIXEDWPM 13
scohennm 0:6c16ec0e7b9d 17 #define LOWSPEED 5
scohennm 0:6c16ec0e7b9d 18 #define SPPEDINT 25.0 // This gives a max speed of 30 - 5 + 25
scohennm 0:6c16ec0e7b9d 19
scohennm 0:6c16ec0e7b9d 20 #define STATECOEF 2
scohennm 0:6c16ec0e7b9d 21 #define IDLE 0
scohennm 0:6c16ec0e7b9d 22 #define DIT 1
scohennm 0:6c16ec0e7b9d 23 #define DAH 2
scohennm 0:6c16ec0e7b9d 24 #define IAM 3
scohennm 0:6c16ec0e7b9d 25
scohennm 0:6c16ec0e7b9d 26 SLCD slcd; //define LCD display
scohennm 0:6c16ec0e7b9d 27 // keyer test
scohennm 0:6c16ec0e7b9d 28 TSISensor tsiScaling; // Capacitive sensor/slider
scohennm 0:6c16ec0e7b9d 29 DigitalIn RtButton(PTC12);
scohennm 0:6c16ec0e7b9d 30 DigitalIn LftButton(PTC3);
scohennm 0:6c16ec0e7b9d 31 DigitalIn DahPaddle(PTD7);
scohennm 0:6c16ec0e7b9d 32 DigitalIn DitPaddle(PTD6);
scohennm 0:6c16ec0e7b9d 33 DigitalOut led(LED_RED);
scohennm 0:6c16ec0e7b9d 34 DigitalOut outPin(PTC9); //J1-16
scohennm 0:6c16ec0e7b9d 35 int KeyState = IDLE;
scohennm 0:6c16ec0e7b9d 36
scohennm 0:6c16ec0e7b9d 37
scohennm 0:6c16ec0e7b9d 38 void LCDMessNoDwell(char *lMess){
scohennm 0:6c16ec0e7b9d 39 slcd.Home();
scohennm 0:6c16ec0e7b9d 40 slcd.clear();
scohennm 0:6c16ec0e7b9d 41 slcd.printf(lMess);
scohennm 0:6c16ec0e7b9d 42 }
scohennm 0:6c16ec0e7b9d 43
scohennm 0:6c16ec0e7b9d 44 void makeDit (float dotLen,DigitalOut outChannel, DigitalOut cloneChannel) {
scohennm 0:6c16ec0e7b9d 45 outChannel.write(CHANNELON);
scohennm 0:6c16ec0e7b9d 46 cloneChannel.write(CHANNELON);
scohennm 0:6c16ec0e7b9d 47 wait(dotLen);
scohennm 0:6c16ec0e7b9d 48 outChannel.write(CHANNELOFF);
scohennm 0:6c16ec0e7b9d 49 cloneChannel.write(CHANNELOFF);
scohennm 0:6c16ec0e7b9d 50 wait(float(DOT)*dotLen);
scohennm 0:6c16ec0e7b9d 51 return;
scohennm 0:6c16ec0e7b9d 52 }
scohennm 0:6c16ec0e7b9d 53
scohennm 0:6c16ec0e7b9d 54 void makeDah (float dotLen,DigitalOut outChannel, DigitalOut cloneChannel) {
scohennm 0:6c16ec0e7b9d 55 outChannel.write(CHANNELON);
scohennm 0:6c16ec0e7b9d 56 cloneChannel.write(CHANNELON);
scohennm 0:6c16ec0e7b9d 57 wait(float(DASH)*dotLen);
scohennm 0:6c16ec0e7b9d 58 outChannel.write(CHANNELOFF);
scohennm 0:6c16ec0e7b9d 59 cloneChannel.write(CHANNELOFF);
scohennm 0:6c16ec0e7b9d 60 wait(float(DOT)*dotLen);
scohennm 0:6c16ec0e7b9d 61 return;
scohennm 0:6c16ec0e7b9d 62 }
scohennm 0:6c16ec0e7b9d 63
scohennm 0:6c16ec0e7b9d 64
scohennm 0:6c16ec0e7b9d 65 int main(){
scohennm 0:6c16ec0e7b9d 66 int wpm = FIXEDWPM;
scohennm 0:6c16ec0e7b9d 67 float elementLen; // period in seconds
scohennm 0:6c16ec0e7b9d 68 int RButtonState;
scohennm 0:6c16ec0e7b9d 69 int LButtonState;
scohennm 0:6c16ec0e7b9d 70 int DahPaddleState;
scohennm 0:6c16ec0e7b9d 71 int DitPaddleState;
scohennm 0:6c16ec0e7b9d 72 char lcdData[LCDLEN];
scohennm 0:6c16ec0e7b9d 73 float tempValue;
scohennm 0:6c16ec0e7b9d 74 int lastKeyHit = DIT;
scohennm 0:6c16ec0e7b9d 75
scohennm 0:6c16ec0e7b9d 76
scohennm 0:6c16ec0e7b9d 77 elementLen = BASESPEED / (float) wpm;
scohennm 0:6c16ec0e7b9d 78
scohennm 0:6c16ec0e7b9d 79 led.write(CHANNELOFF);
scohennm 0:6c16ec0e7b9d 80 outPin.write(CHANNELOFF);
scohennm 0:6c16ec0e7b9d 81 sprintf (lcdData,"%d",wpm);
scohennm 0:6c16ec0e7b9d 82 LCDMessNoDwell(lcdData);
scohennm 0:6c16ec0e7b9d 83
scohennm 0:6c16ec0e7b9d 84
scohennm 0:6c16ec0e7b9d 85 while (true) {
scohennm 0:6c16ec0e7b9d 86 /*
scohennm 0:6c16ec0e7b9d 87 RButtonState = !RtButton.read(); // button is pulled up so false is when button is pushed it's inverted to avoid confusion downstream
scohennm 0:6c16ec0e7b9d 88 if (RButtonState){
scohennm 0:6c16ec0e7b9d 89 KeyState = DAH;
scohennm 0:6c16ec0e7b9d 90 }
scohennm 0:6c16ec0e7b9d 91 LButtonState = !LftButton.read();
scohennm 0:6c16ec0e7b9d 92 if (LButtonState) {
scohennm 0:6c16ec0e7b9d 93 KeyState = DIT;
scohennm 0:6c16ec0e7b9d 94 }
scohennm 0:6c16ec0e7b9d 95 */
scohennm 0:6c16ec0e7b9d 96 RButtonState = !RtButton.read();
scohennm 0:6c16ec0e7b9d 97 LButtonState = !LftButton.read();
scohennm 0:6c16ec0e7b9d 98 DahPaddleState =!DahPaddle.read();
scohennm 0:6c16ec0e7b9d 99 DitPaddleState = !DitPaddle.read();
scohennm 0:6c16ec0e7b9d 100 KeyState = LButtonState + STATECOEF*RButtonState;
scohennm 0:6c16ec0e7b9d 101 KeyState = KeyState + DitPaddleState + STATECOEF*DahPaddleState;
scohennm 0:6c16ec0e7b9d 102
scohennm 0:6c16ec0e7b9d 103 switch (KeyState) {
scohennm 0:6c16ec0e7b9d 104 case DAH:{
scohennm 0:6c16ec0e7b9d 105 LCDMessNoDwell(DASHMESS);
scohennm 0:6c16ec0e7b9d 106 makeDah(elementLen,outPin,led);
scohennm 0:6c16ec0e7b9d 107 KeyState = IDLE;
scohennm 0:6c16ec0e7b9d 108 lastKeyHit = DAH;
scohennm 0:6c16ec0e7b9d 109 sprintf (lcdData,"%d",wpm);
scohennm 0:6c16ec0e7b9d 110 LCDMessNoDwell(lcdData);
scohennm 0:6c16ec0e7b9d 111 break;
scohennm 0:6c16ec0e7b9d 112 }
scohennm 0:6c16ec0e7b9d 113 case DIT:{
scohennm 0:6c16ec0e7b9d 114 LCDMessNoDwell(DOTMESS);
scohennm 0:6c16ec0e7b9d 115 makeDit(elementLen,outPin,led);
scohennm 0:6c16ec0e7b9d 116 KeyState = IDLE;
scohennm 0:6c16ec0e7b9d 117 lastKeyHit = DIT;
scohennm 0:6c16ec0e7b9d 118 sprintf (lcdData,"%d",wpm);
scohennm 0:6c16ec0e7b9d 119 LCDMessNoDwell(lcdData);
scohennm 0:6c16ec0e7b9d 120 break;
scohennm 0:6c16ec0e7b9d 121 }
scohennm 0:6c16ec0e7b9d 122 case IAM:{
scohennm 0:6c16ec0e7b9d 123 LCDMessNoDwell(IAMMESS);
scohennm 0:6c16ec0e7b9d 124 if (lastKeyHit == DAH){;
scohennm 0:6c16ec0e7b9d 125 makeDit(elementLen,outPin,led);
scohennm 0:6c16ec0e7b9d 126 makeDah( elementLen,outPin,led);
scohennm 0:6c16ec0e7b9d 127 lastKeyHit = DAH;
scohennm 0:6c16ec0e7b9d 128 } else {
scohennm 0:6c16ec0e7b9d 129 makeDah(elementLen,outPin,led);
scohennm 0:6c16ec0e7b9d 130 makeDit(elementLen,outPin,led);
scohennm 0:6c16ec0e7b9d 131 lastKeyHit = DIT;
scohennm 0:6c16ec0e7b9d 132 }
scohennm 0:6c16ec0e7b9d 133 KeyState = IDLE;
scohennm 0:6c16ec0e7b9d 134 sprintf (lcdData,"%d",wpm);
scohennm 0:6c16ec0e7b9d 135 LCDMessNoDwell(lcdData);
scohennm 0:6c16ec0e7b9d 136 break;
scohennm 0:6c16ec0e7b9d 137 }
scohennm 0:6c16ec0e7b9d 138 case IDLE:{
scohennm 0:6c16ec0e7b9d 139 tempValue = tsiScaling.readPercentage();
scohennm 0:6c16ec0e7b9d 140 if(tempValue > 0) {
scohennm 0:6c16ec0e7b9d 141 wpm = LOWSPEED + int(tempValue * SPPEDINT);
scohennm 0:6c16ec0e7b9d 142 elementLen = BASESPEED / (float) wpm;
scohennm 0:6c16ec0e7b9d 143 sprintf (lcdData,"%d",wpm);
scohennm 0:6c16ec0e7b9d 144 LCDMessNoDwell(lcdData);
scohennm 0:6c16ec0e7b9d 145 }
scohennm 0:6c16ec0e7b9d 146 break;
scohennm 0:6c16ec0e7b9d 147 }
scohennm 0:6c16ec0e7b9d 148 }
scohennm 0:6c16ec0e7b9d 149
scohennm 0:6c16ec0e7b9d 150 } // while forever
scohennm 0:6c16ec0e7b9d 151 }// end main