coursework

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers interface.cpp Source File

interface.cpp

00001 #include "main.h"
00002 #include "rtos.h"
00003 #include <vector>
00004 #include <algorithm>
00005 
00006 std::vector<Signal> recall;
00007 
00008 
00009 bool get_amplitude (float & amplitude) {
00010     if(!serial.scanf("%f", &amplitude))
00011         serial.puts("Invalid amplitude!\r\n");
00012     else if(!(0 <= amplitude && amplitude <= 3.3f))
00013         serial.puts("Amplitude not in range [0, 3.3].\r\n");
00014     else return 1;
00015     return 0;
00016 }
00017 
00018 bool get_frequency (float & frequency) {
00019     if(!serial.scanf("%f", &frequency))
00020         serial.puts("Invalid frequency!\r\n");
00021     else if(!(0 <= frequency && frequency <= 100000))
00022         serial.puts("Frequency not in range [0, 100000].\r\n");
00023     else return 1;
00024     return 0;
00025 }
00026 
00027 
00028 osThreadId mainThreadId;
00029 
00030 void callback_on_input() {
00031     // inform mainThread that there is user input
00032     osSignalSet(mainThreadId, 0x1);
00033     //Thread::wait(1000);           // wait 1s
00034 }
00035 
00036 void userInterfaceFunc (void const* args) {
00037     mainThreadId = Thread::gettid();
00038     serial.attach(&callback_on_input);
00039     while(1) {
00040         serial.puts("\r\n");
00041         serial.puts("Enter signal to generate, in the form:\r\n");
00042         serial.puts("  * constant <amplitude>\r\n");
00043         serial.puts("  * sine <amplitude> <frequency>\r\n");
00044         serial.puts("  * square <amplitude> <frequency>\r\n");
00045         serial.puts("  * recall <index>\r\n");
00046         serial.puts("  * clear\r\n");
00047 
00048         char* str = buffer;
00049         Signal signal;
00050 
00051         while(1) {
00052             serial.puts("Choice: ");
00053             serial.flush();
00054 
00055             osSignalClear(mainThreadId, 0x1);   // ensure thread_signal is cleared
00056             Thread::signal_wait(0x1);           // now wait for that thread_signal
00057             serial.scanf("%s", str);            // then get the available user input
00058 
00059             if(0==strcmp(str, "constant")) {
00060                 signal.frequency = 0;
00061                 if(get_amplitude(signal.amplitude))
00062                 { signal.type = CONSTANT; break; }
00063             }
00064             else if(0==strcmp(str, "sine")) {
00065                 if(get_amplitude(signal.amplitude)
00066                 && get_frequency(signal.frequency))
00067                 { signal.type = SINE; break; }
00068             }
00069             else if(0==strcmp(str, "square")) {
00070                 if(get_amplitude(signal.amplitude)
00071                 && get_frequency(signal.frequency))
00072                 { signal.type = SQUARE; break; }
00073             }
00074             else if(0==strcmp(str, "recall")) {
00075                 int i, max = recall.size()-1;
00076                 if(!serial.scanf("%d", &i))
00077                     serial.puts("Invalid index!\r\n");
00078                 else if(i<0 || i>max)
00079                     serial.printf("Index not in range [0, %d].\r\n", max);
00080                 else { signal = recall[i]; break; }
00081             }
00082             else if(0==strcmp(str, "clear")) {
00083                 recall.clear();
00084                 serial.puts("Done.\r\n");
00085             }
00086             else serial.puts("Invalid command!\r\n");
00087         }
00088         serial.printf("Done: %s.\r\n", signal.c_str(buffer));
00089 
00090         if(std::find(recall.begin(), recall.end(), signal) == recall.end()) // if signal does not already exists
00091         {
00092             serial.printf("Index of signal is %d.\r\n", recall.size());     // then add the new signal
00093             recall.push_back(signal);                                       // and provide its index
00094         }
00095         updateSignal(signal);
00096         serial.puts("----------------------\r\n");
00097     }
00098 }
00099