Liam Decaster
/
PM2_Example_IRSensor
Hello there
main.cpp@5:887081decd5c, 2021-03-13 (annotated)
- Committer:
- pmic
- Date:
- Sat Mar 13 15:21:09 2021 +0100
- Revision:
- 5:887081decd5c
- Parent:
- 4:dcdcb25d1069
- Child:
- 6:6c1c38d4faa4
Added various tests for pc.printf with Buffered Serial.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
boro | 0:5d4d21d56334 | 1 | #include "mbed.h" |
boro | 0:5d4d21d56334 | 2 | #include "platform/mbed_thread.h" |
pmic | 5:887081decd5c | 3 | #include "iostream" |
pmic | 5:887081decd5c | 4 | #include "string" |
pmic | 4:dcdcb25d1069 | 5 | #include "BufferedSerial.h" |
pmic | 5:887081decd5c | 6 | #include <math.h> |
pmic | 5:887081decd5c | 7 | #include <stdio.h> |
pmic | 4:dcdcb25d1069 | 8 | |
pmic | 1:4e0e4d0363d9 | 9 | #define pi 3.14159265358979323846 |
pmic | 1:4e0e4d0363d9 | 10 | |
pmic | 3:aa1d854807fe | 11 | using namespace std::chrono; |
pmic | 3:aa1d854807fe | 12 | |
pmic | 5:887081decd5c | 13 | InterruptIn user_button(USER_BUTTON); |
pmic | 5:887081decd5c | 14 | DigitalOut led(LED1); |
pmic | 5:887081decd5c | 15 | BufferedSerial pc(USBTX, USBRX); |
boro | 0:5d4d21d56334 | 16 | |
pmic | 1:4e0e4d0363d9 | 17 | bool executeMainTask = false; |
pmic | 1:4e0e4d0363d9 | 18 | Timer user_button_timer, loop_timer; |
pmic | 4:dcdcb25d1069 | 19 | int Ts_ms = 1000; |
boro | 0:5d4d21d56334 | 20 | |
pmic | 2:4ba1937ce284 | 21 | void button_fall(); // stuff |
pmic | 2:4ba1937ce284 | 22 | void button_rise(); // stuff |
boro | 0:5d4d21d56334 | 23 | |
pmic | 5:887081decd5c | 24 | void reverse(char* str, int len); |
pmic | 5:887081decd5c | 25 | int intToStr(int x, char str[], int d); |
pmic | 5:887081decd5c | 26 | void ftoa(float n, char* res, int afterpoint); |
pmic | 5:887081decd5c | 27 | |
pmic | 1:4e0e4d0363d9 | 28 | AnalogIn analogIn(PA_0); |
pmic | 1:4e0e4d0363d9 | 29 | float dist = 0.0f; |
boro | 0:5d4d21d56334 | 30 | |
boro | 0:5d4d21d56334 | 31 | int main() |
boro | 0:5d4d21d56334 | 32 | { |
pmic | 3:aa1d854807fe | 33 | // pc.baud(115200); |
pmic | 1:4e0e4d0363d9 | 34 | user_button.fall(&button_fall); |
pmic | 1:4e0e4d0363d9 | 35 | user_button.rise(&button_rise); |
pmic | 1:4e0e4d0363d9 | 36 | loop_timer.reset(); |
boro | 0:5d4d21d56334 | 37 | |
boro | 0:5d4d21d56334 | 38 | while (true) { |
pmic | 1:4e0e4d0363d9 | 39 | |
pmic | 1:4e0e4d0363d9 | 40 | /* ------------- start hacking ------------- -------------*/ |
boro | 0:5d4d21d56334 | 41 | |
pmic | 1:4e0e4d0363d9 | 42 | if(executeMainTask) { |
pmic | 4:dcdcb25d1069 | 43 | // dist = analogIn.read()*3.3f; |
pmic | 4:dcdcb25d1069 | 44 | // printf("measurement: %d\r\n", (static_cast<int>(dist * 1000))); |
pmic | 4:dcdcb25d1069 | 45 | |
pmic | 4:dcdcb25d1069 | 46 | Timer s; |
pmic | 5:887081decd5c | 47 | |
pmic | 5:887081decd5c | 48 | s.start(); |
pmic | 5:887081decd5c | 49 | char res0[20]; |
pmic | 5:887081decd5c | 50 | float val0 = 233.007; |
pmic | 5:887081decd5c | 51 | ftoa(val0, res0, 4); |
pmic | 5:887081decd5c | 52 | pc.write(res0, sizeof(res0)); |
pmic | 5:887081decd5c | 53 | int buffered_time_ftoa = duration_cast<milliseconds>(s.elapsed_time()).count(); |
pmic | 5:887081decd5c | 54 | thread_sleep_for(100); |
pmic | 4:dcdcb25d1069 | 55 | |
pmic | 5:887081decd5c | 56 | s.reset(); |
pmic | 5:887081decd5c | 57 | char res1[20]; |
pmic | 5:887081decd5c | 58 | float val1 = 233.007; |
pmic | 5:887081decd5c | 59 | ftoa(val1, res1, 4); |
pmic | 5:887081decd5c | 60 | printf("%s\r\n", res1); |
pmic | 5:887081decd5c | 61 | int polled_time_ftoa = duration_cast<milliseconds>(s.elapsed_time()).count(); |
pmic | 5:887081decd5c | 62 | thread_sleep_for(100); |
pmic | 5:887081decd5c | 63 | |
pmic | 5:887081decd5c | 64 | s.reset(); |
pmic | 4:dcdcb25d1069 | 65 | char msg[] = "Hello World - buffered\n"; |
pmic | 4:dcdcb25d1069 | 66 | pc.write(msg, sizeof(msg)); |
pmic | 4:dcdcb25d1069 | 67 | int buffered_time = duration_cast<milliseconds>(s.elapsed_time()).count(); |
pmic | 5:887081decd5c | 68 | thread_sleep_for(100); |
pmic | 4:dcdcb25d1069 | 69 | |
pmic | 4:dcdcb25d1069 | 70 | s.reset(); |
pmic | 4:dcdcb25d1069 | 71 | printf("Hello World - blocking\n"); |
pmic | 4:dcdcb25d1069 | 72 | int polled_time = duration_cast<milliseconds>(s.elapsed_time()).count(); |
pmic | 4:dcdcb25d1069 | 73 | s.stop(); |
pmic | 5:887081decd5c | 74 | thread_sleep_for(100); |
pmic | 4:dcdcb25d1069 | 75 | |
pmic | 5:887081decd5c | 76 | printf("printf buffered took %d us\n", buffered_time_ftoa); |
pmic | 5:887081decd5c | 77 | printf("printf blocking took %d us\n", polled_time_ftoa); |
pmic | 4:dcdcb25d1069 | 78 | printf("printf buffered took %d us\n", buffered_time); |
pmic | 4:dcdcb25d1069 | 79 | printf("printf blocking took %d us\n", polled_time); |
pmic | 5:887081decd5c | 80 | thread_sleep_for(100); |
pmic | 4:dcdcb25d1069 | 81 | |
pmic | 4:dcdcb25d1069 | 82 | |
pmic | 4:dcdcb25d1069 | 83 | |
boro | 0:5d4d21d56334 | 84 | } else { |
boro | 0:5d4d21d56334 | 85 | |
boro | 0:5d4d21d56334 | 86 | } |
pmic | 1:4e0e4d0363d9 | 87 | |
pmic | 1:4e0e4d0363d9 | 88 | /* ------------- stop hacking ------------- -------------*/ |
pmic | 1:4e0e4d0363d9 | 89 | |
pmic | 1:4e0e4d0363d9 | 90 | if(executeMainTask) { |
pmic | 1:4e0e4d0363d9 | 91 | led = !led; |
pmic | 1:4e0e4d0363d9 | 92 | } |
pmic | 3:aa1d854807fe | 93 | int dT_loop = Ts_ms - duration_cast<milliseconds>(loop_timer.elapsed_time()).count(); |
pmic | 1:4e0e4d0363d9 | 94 | thread_sleep_for(dT_loop); |
boro | 0:5d4d21d56334 | 95 | } |
boro | 0:5d4d21d56334 | 96 | } |
pmic | 1:4e0e4d0363d9 | 97 | |
pmic | 1:4e0e4d0363d9 | 98 | void button_fall() |
pmic | 1:4e0e4d0363d9 | 99 | { |
pmic | 1:4e0e4d0363d9 | 100 | user_button_timer.reset(); |
pmic | 1:4e0e4d0363d9 | 101 | user_button_timer.start(); |
pmic | 1:4e0e4d0363d9 | 102 | } |
pmic | 1:4e0e4d0363d9 | 103 | |
pmic | 1:4e0e4d0363d9 | 104 | void button_rise() |
pmic | 1:4e0e4d0363d9 | 105 | { |
pmic | 3:aa1d854807fe | 106 | int t_button = duration_cast<milliseconds>(user_button_timer.elapsed_time()).count(); |
pmic | 1:4e0e4d0363d9 | 107 | user_button_timer.stop(); |
pmic | 1:4e0e4d0363d9 | 108 | if(t_button > 200) executeMainTask = !executeMainTask; |
pmic | 5:887081decd5c | 109 | } |
pmic | 5:887081decd5c | 110 | |
pmic | 5:887081decd5c | 111 | void reverse(char* str, int len) |
pmic | 5:887081decd5c | 112 | { |
pmic | 5:887081decd5c | 113 | int i = 0, j = len - 1, temp; |
pmic | 5:887081decd5c | 114 | while (i < j) { |
pmic | 5:887081decd5c | 115 | temp = str[i]; |
pmic | 5:887081decd5c | 116 | str[i] = str[j]; |
pmic | 5:887081decd5c | 117 | str[j] = temp; |
pmic | 5:887081decd5c | 118 | i++; |
pmic | 5:887081decd5c | 119 | j--; |
pmic | 5:887081decd5c | 120 | } |
pmic | 5:887081decd5c | 121 | } |
pmic | 5:887081decd5c | 122 | |
pmic | 5:887081decd5c | 123 | int intToStr(int x, char str[], int d) |
pmic | 5:887081decd5c | 124 | { |
pmic | 5:887081decd5c | 125 | int i = 0; |
pmic | 5:887081decd5c | 126 | while (x) { |
pmic | 5:887081decd5c | 127 | str[i++] = (x % 10) + '0'; |
pmic | 5:887081decd5c | 128 | x = x / 10; |
pmic | 5:887081decd5c | 129 | } |
pmic | 5:887081decd5c | 130 | |
pmic | 5:887081decd5c | 131 | // If number of digits required is more, then |
pmic | 5:887081decd5c | 132 | // add 0s at the beginning |
pmic | 5:887081decd5c | 133 | while (i < d) |
pmic | 5:887081decd5c | 134 | str[i++] = '0'; |
pmic | 5:887081decd5c | 135 | |
pmic | 5:887081decd5c | 136 | reverse(str, i); |
pmic | 5:887081decd5c | 137 | str[i] = '\0'; |
pmic | 5:887081decd5c | 138 | return i; |
pmic | 5:887081decd5c | 139 | } |
pmic | 5:887081decd5c | 140 | |
pmic | 5:887081decd5c | 141 | void ftoa(float n, char* res, int afterpoint) |
pmic | 5:887081decd5c | 142 | { |
pmic | 5:887081decd5c | 143 | // Extract integer part |
pmic | 5:887081decd5c | 144 | int ipart = (int)n; |
pmic | 5:887081decd5c | 145 | |
pmic | 5:887081decd5c | 146 | // Extract floating part |
pmic | 5:887081decd5c | 147 | float fpart = n - (float)ipart; |
pmic | 5:887081decd5c | 148 | |
pmic | 5:887081decd5c | 149 | // convert integer part to string |
pmic | 5:887081decd5c | 150 | int i = intToStr(ipart, res, 0); |
pmic | 5:887081decd5c | 151 | |
pmic | 5:887081decd5c | 152 | // check for display option after point |
pmic | 5:887081decd5c | 153 | if (afterpoint != 0) { |
pmic | 5:887081decd5c | 154 | res[i] = '.'; // add dot |
pmic | 5:887081decd5c | 155 | |
pmic | 5:887081decd5c | 156 | // Get the value of fraction part upto given no. |
pmic | 5:887081decd5c | 157 | // of points after dot. The third parameter |
pmic | 5:887081decd5c | 158 | // is needed to handle cases like 233.007 |
pmic | 5:887081decd5c | 159 | fpart = fpart * pow(10, afterpoint); |
pmic | 5:887081decd5c | 160 | |
pmic | 5:887081decd5c | 161 | intToStr((int)fpart, res + i + 1, afterpoint); |
pmic | 5:887081decd5c | 162 | } |
pmic | 5:887081decd5c | 163 | } |