Yann Garcia
/
SignalGeneratorApp
This little program demonstrates how to use the SignalGenerator library.
main.cpp@1:719b21661920, 2010-11-16 (annotated)
- Committer:
- Yann
- Date:
- Tue Nov 16 10:37:46 2010 +0000
- Revision:
- 1:719b21661920
- Parent:
- 0:481720b53aed
V0.0.0.2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Yann | 1:719b21661920 | 1 | #include "SignalGenerator.h" // It includes 'mbed.h' header |
Yann | 0:481720b53aed | 2 | |
Yann | 1:719b21661920 | 3 | /* CPU Available indicator |
Yann | 0:481720b53aed | 4 | */ |
Yann | 1:719b21661920 | 5 | DigitalOut g_availableLed(LED1); //<! Led used to indicate the program is alive |
Yann | 1:719b21661920 | 6 | void AvailableLedIndicator(); //<! Ticker callback |
Yann | 0:481720b53aed | 7 | Ticker g_available; |
Yann | 0:481720b53aed | 8 | |
Yann | 1:719b21661920 | 9 | /* SignalGenerator usage |
Yann | 0:481720b53aed | 10 | */ |
Yann | 0:481720b53aed | 11 | SignalGenerator g_signal(p18); |
Yann | 1:719b21661920 | 12 | void SynchronousUserInput(); //<! Ticker callback |
Yann | 0:481720b53aed | 13 | Ticker g_synchronousUserInput; |
Yann | 1:719b21661920 | 14 | Serial g_debug(USBTX, USBRX); //<! Needed to detect that the user pressed a key |
Yann | 1:719b21661920 | 15 | SignalGenerator::SignalGeneratorType DisplaySignalGeneratorTestMenuAndGetChoice(); //<! User menu to select a signal type |
Yann | 0:481720b53aed | 16 | |
Yann | 1:719b21661920 | 17 | /* Program Entry Point |
Yann | 1:719b21661920 | 18 | */ |
Yann | 0:481720b53aed | 19 | int main() { |
Yann | 1:719b21661920 | 20 | volatile SignalGenerator::SignalGeneratorType _choice; //<! User selects the desired signal type |
Yann | 1:719b21661920 | 21 | volatile int frequency; //<! Signal frequency |
Yann | 0:481720b53aed | 22 | |
Yann | 0:481720b53aed | 23 | wait(1); // Needed after startup |
Yann | 0:481720b53aed | 24 | |
Yann | 0:481720b53aed | 25 | // Launch available indicator |
Yann | 0:481720b53aed | 26 | g_availableLed = 1; |
Yann | 0:481720b53aed | 27 | g_available.attach(&AvailableLedIndicator, 2.0); // Never detached |
Yann | 0:481720b53aed | 28 | |
Yann | 0:481720b53aed | 29 | // Start infinite loop |
Yann | 0:481720b53aed | 30 | while(true) |
Yann | 0:481720b53aed | 31 | { |
Yann | 0:481720b53aed | 32 | // Acquire settings |
Yann | 0:481720b53aed | 33 | _choice = DisplaySignalGeneratorTestMenuAndGetChoice(); |
Yann | 0:481720b53aed | 34 | printf("\r\nEnter signal frequency (< 1MHz/# of samples): "); |
Yann | 0:481720b53aed | 35 | scanf("%d", &frequency); |
Yann | 0:481720b53aed | 36 | |
Yann | 0:481720b53aed | 37 | // Prepare the signal |
Yann | 0:481720b53aed | 38 | g_signal.SetSignalFrequency(_choice, frequency); |
Yann | 0:481720b53aed | 39 | |
Yann | 0:481720b53aed | 40 | // Launch execution |
Yann | 0:481720b53aed | 41 | if (g_signal.BeginRunAsync() == -1) { |
Yann | 0:481720b53aed | 42 | // Synchronous mode |
Yann | 0:481720b53aed | 43 | g_synchronousUserInput.attach(&SynchronousUserInput, 0.005); // 5ms |
Yann | 0:481720b53aed | 44 | g_signal.Run(); // Never stopped |
Yann | 0:481720b53aed | 45 | printf("\r\nSignal Generator terminated\r\n"); |
Yann | 0:481720b53aed | 46 | g_synchronousUserInput.detach(); |
Yann | 0:481720b53aed | 47 | } else { |
Yann | 0:481720b53aed | 48 | // Asynchronous mode |
Yann | 0:481720b53aed | 49 | printf("\r\n\r\nPress any key to terminate\r\n"); |
Yann | 0:481720b53aed | 50 | while (getchar() != 'q'); |
Yann | 0:481720b53aed | 51 | g_signal.EndRunAsync(); |
Yann | 0:481720b53aed | 52 | } |
Yann | 0:481720b53aed | 53 | } // End of 'while' statement |
Yann | 0:481720b53aed | 54 | } // End of main program |
Yann | 0:481720b53aed | 55 | |
Yann | 1:719b21661920 | 56 | /** Callbak used by CPU availabe ticker to indicate the program is alive |
Yann | 1:719b21661920 | 57 | */ |
Yann | 0:481720b53aed | 58 | void AvailableLedIndicator() { |
Yann | 0:481720b53aed | 59 | g_availableLed != g_availableLed; |
Yann | 0:481720b53aed | 60 | } // End of function AvailableLedIndicator |
Yann | 0:481720b53aed | 61 | |
Yann | 1:719b21661920 | 62 | /** Callbak used when SignalLibrary is used in synchronous mode (Run() method) |
Yann | 1:719b21661920 | 63 | */ |
Yann | 0:481720b53aed | 64 | void SynchronousUserInput() { |
Yann | 0:481720b53aed | 65 | if (g_debug.readable()) { |
Yann | 0:481720b53aed | 66 | g_signal.Stop(); |
Yann | 0:481720b53aed | 67 | getchar(); |
Yann | 0:481720b53aed | 68 | } |
Yann | 0:481720b53aed | 69 | } // End of function SynchronousUserInput |
Yann | 0:481720b53aed | 70 | |
Yann | 1:719b21661920 | 71 | /** Display the user menu |
Yann | 1:719b21661920 | 72 | */ |
Yann | 0:481720b53aed | 73 | SignalGenerator::SignalGeneratorType DisplaySignalGeneratorTestMenuAndGetChoice() |
Yann | 0:481720b53aed | 74 | { |
Yann | 0:481720b53aed | 75 | do { |
Yann | 0:481720b53aed | 76 | printf("\r\n\r\nTest demo v0.1 - Generate signal\r\n"); |
Yann | 0:481720b53aed | 77 | printf("\tSquareSignal:\t0\r\n"); |
Yann | 0:481720b53aed | 78 | printf("\tTriangleSignal:\t1\r\n"); |
Yann | 0:481720b53aed | 79 | printf("\tSawtoothSignal:\t2\r\n"); |
Yann | 0:481720b53aed | 80 | printf("\tReverse sawtoothSignal:\t3\r\n"); |
Yann | 0:481720b53aed | 81 | printf("\tSinusSignal:\t4\r\n"); |
Yann | 0:481720b53aed | 82 | switch (getchar()) { |
Yann | 0:481720b53aed | 83 | case '0' : |
Yann | 0:481720b53aed | 84 | return SignalGenerator::SquareSignal; |
Yann | 0:481720b53aed | 85 | case '1' : |
Yann | 0:481720b53aed | 86 | return SignalGenerator::TriangleSignal; |
Yann | 0:481720b53aed | 87 | case '2' : |
Yann | 0:481720b53aed | 88 | return SignalGenerator::SawtoothSignal; |
Yann | 0:481720b53aed | 89 | case '3' : |
Yann | 0:481720b53aed | 90 | return SignalGenerator::ReverseSawtoothSignal; |
Yann | 0:481720b53aed | 91 | case '4' : |
Yann | 0:481720b53aed | 92 | return SignalGenerator::SinusSignal; |
Yann | 0:481720b53aed | 93 | } // End of 'switch' statement |
Yann | 0:481720b53aed | 94 | } while (true); |
Yann | 0:481720b53aed | 95 | } // End of function DisplaySignalGeneratorTestMenuAndGetChoice |