coursework
interface.cpp@0:b7287557047e, 2016-11-27 (annotated)
- Committer:
- riyood
- Date:
- Sun Nov 27 17:57:06 2016 +0000
- Revision:
- 0:b7287557047e
function;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
riyood | 0:b7287557047e | 1 | #include "main.h" |
riyood | 0:b7287557047e | 2 | #include "rtos.h" |
riyood | 0:b7287557047e | 3 | #include <vector> |
riyood | 0:b7287557047e | 4 | #include <algorithm> |
riyood | 0:b7287557047e | 5 | |
riyood | 0:b7287557047e | 6 | std::vector<Signal> recall; |
riyood | 0:b7287557047e | 7 | |
riyood | 0:b7287557047e | 8 | |
riyood | 0:b7287557047e | 9 | bool get_amplitude (float & amplitude) { |
riyood | 0:b7287557047e | 10 | if(!serial.scanf("%f", &litude)) |
riyood | 0:b7287557047e | 11 | serial.puts("Invalid amplitude!\r\n"); |
riyood | 0:b7287557047e | 12 | else if(!(0 <= amplitude && amplitude <= 3.3f)) |
riyood | 0:b7287557047e | 13 | serial.puts("Amplitude not in range [0, 3.3].\r\n"); |
riyood | 0:b7287557047e | 14 | else return 1; |
riyood | 0:b7287557047e | 15 | return 0; |
riyood | 0:b7287557047e | 16 | } |
riyood | 0:b7287557047e | 17 | |
riyood | 0:b7287557047e | 18 | bool get_frequency (float & frequency) { |
riyood | 0:b7287557047e | 19 | if(!serial.scanf("%f", &frequency)) |
riyood | 0:b7287557047e | 20 | serial.puts("Invalid frequency!\r\n"); |
riyood | 0:b7287557047e | 21 | else if(!(0 <= frequency && frequency <= 100000)) |
riyood | 0:b7287557047e | 22 | serial.puts("Frequency not in range [0, 100000].\r\n"); |
riyood | 0:b7287557047e | 23 | else return 1; |
riyood | 0:b7287557047e | 24 | return 0; |
riyood | 0:b7287557047e | 25 | } |
riyood | 0:b7287557047e | 26 | |
riyood | 0:b7287557047e | 27 | |
riyood | 0:b7287557047e | 28 | osThreadId mainThreadId; |
riyood | 0:b7287557047e | 29 | |
riyood | 0:b7287557047e | 30 | void callback_on_input() { |
riyood | 0:b7287557047e | 31 | // inform mainThread that there is user input |
riyood | 0:b7287557047e | 32 | osSignalSet(mainThreadId, 0x1); |
riyood | 0:b7287557047e | 33 | //Thread::wait(1000); // wait 1s |
riyood | 0:b7287557047e | 34 | } |
riyood | 0:b7287557047e | 35 | |
riyood | 0:b7287557047e | 36 | void userInterfaceFunc (void const* args) { |
riyood | 0:b7287557047e | 37 | mainThreadId = Thread::gettid(); |
riyood | 0:b7287557047e | 38 | serial.attach(&callback_on_input); |
riyood | 0:b7287557047e | 39 | while(1) { |
riyood | 0:b7287557047e | 40 | serial.puts("\r\n"); |
riyood | 0:b7287557047e | 41 | serial.puts("Enter signal to generate, in the form:\r\n"); |
riyood | 0:b7287557047e | 42 | serial.puts(" * constant <amplitude>\r\n"); |
riyood | 0:b7287557047e | 43 | serial.puts(" * sine <amplitude> <frequency>\r\n"); |
riyood | 0:b7287557047e | 44 | serial.puts(" * square <amplitude> <frequency>\r\n"); |
riyood | 0:b7287557047e | 45 | serial.puts(" * recall <index>\r\n"); |
riyood | 0:b7287557047e | 46 | serial.puts(" * clear\r\n"); |
riyood | 0:b7287557047e | 47 | |
riyood | 0:b7287557047e | 48 | char* str = buffer; |
riyood | 0:b7287557047e | 49 | Signal signal; |
riyood | 0:b7287557047e | 50 | |
riyood | 0:b7287557047e | 51 | while(1) { |
riyood | 0:b7287557047e | 52 | serial.puts("Choice: "); |
riyood | 0:b7287557047e | 53 | serial.flush(); |
riyood | 0:b7287557047e | 54 | |
riyood | 0:b7287557047e | 55 | osSignalClear(mainThreadId, 0x1); // ensure thread_signal is cleared |
riyood | 0:b7287557047e | 56 | Thread::signal_wait(0x1); // now wait for that thread_signal |
riyood | 0:b7287557047e | 57 | serial.scanf("%s", str); // then get the available user input |
riyood | 0:b7287557047e | 58 | |
riyood | 0:b7287557047e | 59 | if(0==strcmp(str, "constant")) { |
riyood | 0:b7287557047e | 60 | signal.frequency = 0; |
riyood | 0:b7287557047e | 61 | if(get_amplitude(signal.amplitude)) |
riyood | 0:b7287557047e | 62 | { signal.type = CONSTANT; break; } |
riyood | 0:b7287557047e | 63 | } |
riyood | 0:b7287557047e | 64 | else if(0==strcmp(str, "sine")) { |
riyood | 0:b7287557047e | 65 | if(get_amplitude(signal.amplitude) |
riyood | 0:b7287557047e | 66 | && get_frequency(signal.frequency)) |
riyood | 0:b7287557047e | 67 | { signal.type = SINE; break; } |
riyood | 0:b7287557047e | 68 | } |
riyood | 0:b7287557047e | 69 | else if(0==strcmp(str, "square")) { |
riyood | 0:b7287557047e | 70 | if(get_amplitude(signal.amplitude) |
riyood | 0:b7287557047e | 71 | && get_frequency(signal.frequency)) |
riyood | 0:b7287557047e | 72 | { signal.type = SQUARE; break; } |
riyood | 0:b7287557047e | 73 | } |
riyood | 0:b7287557047e | 74 | else if(0==strcmp(str, "recall")) { |
riyood | 0:b7287557047e | 75 | int i, max = recall.size()-1; |
riyood | 0:b7287557047e | 76 | if(!serial.scanf("%d", &i)) |
riyood | 0:b7287557047e | 77 | serial.puts("Invalid index!\r\n"); |
riyood | 0:b7287557047e | 78 | else if(i<0 || i>max) |
riyood | 0:b7287557047e | 79 | serial.printf("Index not in range [0, %d].\r\n", max); |
riyood | 0:b7287557047e | 80 | else { signal = recall[i]; break; } |
riyood | 0:b7287557047e | 81 | } |
riyood | 0:b7287557047e | 82 | else if(0==strcmp(str, "clear")) { |
riyood | 0:b7287557047e | 83 | recall.clear(); |
riyood | 0:b7287557047e | 84 | serial.puts("Done.\r\n"); |
riyood | 0:b7287557047e | 85 | } |
riyood | 0:b7287557047e | 86 | else serial.puts("Invalid command!\r\n"); |
riyood | 0:b7287557047e | 87 | } |
riyood | 0:b7287557047e | 88 | serial.printf("Done: %s.\r\n", signal.c_str(buffer)); |
riyood | 0:b7287557047e | 89 | |
riyood | 0:b7287557047e | 90 | if(std::find(recall.begin(), recall.end(), signal) == recall.end()) // if signal does not already exists |
riyood | 0:b7287557047e | 91 | { |
riyood | 0:b7287557047e | 92 | serial.printf("Index of signal is %d.\r\n", recall.size()); // then add the new signal |
riyood | 0:b7287557047e | 93 | recall.push_back(signal); // and provide its index |
riyood | 0:b7287557047e | 94 | } |
riyood | 0:b7287557047e | 95 | updateSignal(signal); |
riyood | 0:b7287557047e | 96 | serial.puts("----------------------\r\n"); |
riyood | 0:b7287557047e | 97 | } |
riyood | 0:b7287557047e | 98 | } |
riyood | 0:b7287557047e | 99 |