coursework
Embed:
(wiki syntax)
Show/hide line numbers
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", &litude)) 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
Generated on Thu Jul 14 2022 20:41:36 by 1.7.2