coursework

Committer:
riyood
Date:
Sun Nov 27 17:57:06 2016 +0000
Revision:
0:b7287557047e
function;

Who changed what in which revision?

UserRevisionLine numberNew 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", &amplitude))
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