![](/media/cache/group/mouse.jpg.50x50_q85.jpg)
AC and lights remotely controlled over Wifi, or set to automatic
Fork of ACandLightsandWifi by
main.cpp@1:7fff8f0dce62, 2016-06-17 (annotated)
- Committer:
- jzacaroli
- Date:
- Fri Jun 17 15:35:04 2016 +0000
- Revision:
- 1:7fff8f0dce62
- Parent:
- 0:e5aa1648b1c5
AC/Lights over Wifi
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jzacaroli | 1:7fff8f0dce62 | 1 | /* Simpler prog based on the serial passthrough code to enable a command line driven test of esp8266 |
jzacaroli | 1:7fff8f0dce62 | 2 | * wifi modules. |
jzacaroli | 1:7fff8f0dce62 | 3 | * NB this uses the mbed sleep() command to form a low power system but on some MCUs this is a problem |
jzacaroli | 1:7fff8f0dce62 | 4 | * this works fine on an lpc1768 but not as yet on the KL25Z |
jzacaroli | 1:7fff8f0dce62 | 5 | */ |
wadh4587 | 0:e5aa1648b1c5 | 6 | |
jzacaroli | 1:7fff8f0dce62 | 7 | #include "mbed.h" |
jzacaroli | 1:7fff8f0dce62 | 8 | #include "DS1820.h" |
jzacaroli | 1:7fff8f0dce62 | 9 | |
wadh4587 | 0:e5aa1648b1c5 | 10 | Serial pc(USBTX, USBRX); // serial terminal for the pc connection |
wadh4587 | 0:e5aa1648b1c5 | 11 | Serial dev(PTE0,PTE1); // for KL25Z... asuming one can't use the PTA1 version which is the stdio |
jzacaroli | 1:7fff8f0dce62 | 12 | DigitalOut led1(LED1); // two leds |
jzacaroli | 1:7fff8f0dce62 | 13 | DigitalOut led2(LED2); // to allow visual check of bidirectional comms |
jzacaroli | 1:7fff8f0dce62 | 14 | DigitalOut led3(LED3); //third led to check status of loading |
jzacaroli | 1:7fff8f0dce62 | 15 | DigitalOut rst(PTD7); // single digital pin to drive the esp8266 reset line |
jzacaroli | 1:7fff8f0dce62 | 16 | |
jzacaroli | 1:7fff8f0dce62 | 17 | |
jzacaroli | 1:7fff8f0dce62 | 18 | PwmOut Lights(PTE31); // Output to the lighting system |
jzacaroli | 1:7fff8f0dce62 | 19 | AnalogIn V1(PTB0); // Input from the LDR voltage level telling us brightness information |
jzacaroli | 1:7fff8f0dce62 | 20 | |
jzacaroli | 1:7fff8f0dce62 | 21 | const int MAX_PROBES = 1; |
jzacaroli | 1:7fff8f0dce62 | 22 | DS1820* probe[MAX_PROBES]; |
jzacaroli | 1:7fff8f0dce62 | 23 | DigitalOut fan(PTB11); |
jzacaroli | 1:7fff8f0dce62 | 24 | |
jzacaroli | 1:7fff8f0dce62 | 25 | bool AUTO = false; //Sets whether we are sending data to the server or not |
jzacaroli | 1:7fff8f0dce62 | 26 | float Temp = 0; |
jzacaroli | 1:7fff8f0dce62 | 27 | int Dummy = 0; |
jzacaroli | 1:7fff8f0dce62 | 28 | float intensity = 0; |
jzacaroli | 1:7fff8f0dce62 | 29 | int LightStatus = 0; |
jzacaroli | 1:7fff8f0dce62 | 30 | int START = 0; |
jzacaroli | 1:7fff8f0dce62 | 31 | |
jzacaroli | 1:7fff8f0dce62 | 32 | // subroutine to run anytime a serial interrupt arrives from the device |
jzacaroli | 1:7fff8f0dce62 | 33 | // this basically passes everything thatthe device produces on to the pc terminal screen |
jzacaroli | 1:7fff8f0dce62 | 34 | /*void dev_recv() |
jzacaroli | 1:7fff8f0dce62 | 35 | { |
jzacaroli | 1:7fff8f0dce62 | 36 | |
jzacaroli | 1:7fff8f0dce62 | 37 | led1 = !led1; |
jzacaroli | 1:7fff8f0dce62 | 38 | while(dev.readable()) { |
jzacaroli | 1:7fff8f0dce62 | 39 | pc.putc(dev.getc()); |
jzacaroli | 1:7fff8f0dce62 | 40 | |
jzacaroli | 1:7fff8f0dce62 | 41 | } |
jzacaroli | 1:7fff8f0dce62 | 42 | }*/ |
jzacaroli | 1:7fff8f0dce62 | 43 | // subroutine to service the serial interrupt on the pc connection |
jzacaroli | 1:7fff8f0dce62 | 44 | // this is a bit more complex - it takes what the use sends on the pc and copies it on to the device |
jzacaroli | 1:7fff8f0dce62 | 45 | // the esp should echo these straight back to the the pc if all is well |
jzacaroli | 1:7fff8f0dce62 | 46 | // this also detects the end of command character which is ascii 13 (0x0d) adn adds a linefeed after it =asscii 10 (0x0a) |
jzacaroli | 1:7fff8f0dce62 | 47 | /*void pc_recv() |
jzacaroli | 1:7fff8f0dce62 | 48 | { |
jzacaroli | 1:7fff8f0dce62 | 49 | char c; |
jzacaroli | 1:7fff8f0dce62 | 50 | led2 = !led2; |
jzacaroli | 1:7fff8f0dce62 | 51 | while(pc.readable()) { |
jzacaroli | 1:7fff8f0dce62 | 52 | c = pc.getc(); |
jzacaroli | 1:7fff8f0dce62 | 53 | dev.putc(c); |
jzacaroli | 1:7fff8f0dce62 | 54 | // pc.putc(c); // echo back |
jzacaroli | 1:7fff8f0dce62 | 55 | if(c==13) { |
jzacaroli | 1:7fff8f0dce62 | 56 | dev.putc(10); // send the linefeed to complement the carriage return generated by return key on the pc |
jzacaroli | 1:7fff8f0dce62 | 57 | pc.putc(10); |
jzacaroli | 1:7fff8f0dce62 | 58 | } |
jzacaroli | 1:7fff8f0dce62 | 59 | } |
jzacaroli | 1:7fff8f0dce62 | 60 | } |
jzacaroli | 1:7fff8f0dce62 | 61 | */ |
jzacaroli | 1:7fff8f0dce62 | 62 | void NEWMESSAGE() |
jzacaroli | 1:7fff8f0dce62 | 63 | { |
jzacaroli | 1:7fff8f0dce62 | 64 | char message; |
jzacaroli | 1:7fff8f0dce62 | 65 | pc.putc('#'); |
jzacaroli | 1:7fff8f0dce62 | 66 | while (dev.readable()) { |
jzacaroli | 1:7fff8f0dce62 | 67 | message= (char)dev.getc(); |
jzacaroli | 1:7fff8f0dce62 | 68 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 69 | if(message==':') { |
jzacaroli | 1:7fff8f0dce62 | 70 | message= (char)dev.getc(); |
jzacaroli | 1:7fff8f0dce62 | 71 | break; |
jzacaroli | 1:7fff8f0dce62 | 72 | } |
jzacaroli | 1:7fff8f0dce62 | 73 | } |
jzacaroli | 1:7fff8f0dce62 | 74 | if(message == 'G') { |
jzacaroli | 1:7fff8f0dce62 | 75 | START = 1; |
jzacaroli | 1:7fff8f0dce62 | 76 | } |
jzacaroli | 1:7fff8f0dce62 | 77 | if(message == 'Q') { |
jzacaroli | 1:7fff8f0dce62 | 78 | AUTO=!AUTO; |
jzacaroli | 1:7fff8f0dce62 | 79 | pc.printf("AUTO=!AUTO\r\n",AUTO); |
jzacaroli | 1:7fff8f0dce62 | 80 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 81 | } |
jzacaroli | 1:7fff8f0dce62 | 82 | if(message == 'K') { |
jzacaroli | 1:7fff8f0dce62 | 83 | fan = 1; |
jzacaroli | 1:7fff8f0dce62 | 84 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 85 | } |
jzacaroli | 1:7fff8f0dce62 | 86 | if(message == 'L') { |
jzacaroli | 1:7fff8f0dce62 | 87 | fan = 0; |
jzacaroli | 1:7fff8f0dce62 | 88 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 89 | } |
jzacaroli | 1:7fff8f0dce62 | 90 | if(message == 'Z') { |
jzacaroli | 1:7fff8f0dce62 | 91 | Lights = 0; |
jzacaroli | 1:7fff8f0dce62 | 92 | LightStatus = 0; |
jzacaroli | 1:7fff8f0dce62 | 93 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 94 | } |
jzacaroli | 1:7fff8f0dce62 | 95 | if(message == 'X') { |
jzacaroli | 1:7fff8f0dce62 | 96 | Lights = 0.1; |
jzacaroli | 1:7fff8f0dce62 | 97 | LightStatus = 1; |
jzacaroli | 1:7fff8f0dce62 | 98 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 99 | } |
jzacaroli | 1:7fff8f0dce62 | 100 | if(message == 'Y') { |
jzacaroli | 1:7fff8f0dce62 | 101 | Lights = 0.5; |
jzacaroli | 1:7fff8f0dce62 | 102 | LightStatus = 2; |
jzacaroli | 1:7fff8f0dce62 | 103 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 104 | } |
jzacaroli | 1:7fff8f0dce62 | 105 | if(message == 'W') { |
jzacaroli | 1:7fff8f0dce62 | 106 | Lights = 1; |
jzacaroli | 1:7fff8f0dce62 | 107 | LightStatus = 3; |
jzacaroli | 1:7fff8f0dce62 | 108 | pc.putc(message); |
jzacaroli | 1:7fff8f0dce62 | 109 | } |
jzacaroli | 1:7fff8f0dce62 | 110 | } |
jzacaroli | 1:7fff8f0dce62 | 111 | |
wadh4587 | 0:e5aa1648b1c5 | 112 | int main() |
wadh4587 | 0:e5aa1648b1c5 | 113 | { |
wadh4587 | 0:e5aa1648b1c5 | 114 | pc.baud(115200); |
jzacaroli | 1:7fff8f0dce62 | 115 | dev.baud(115200); |
jzacaroli | 1:7fff8f0dce62 | 116 | printf("Start \r\n"); |
jzacaroli | 1:7fff8f0dce62 | 117 | rst=0; |
jzacaroli | 1:7fff8f0dce62 | 118 | wait(3); |
jzacaroli | 1:7fff8f0dce62 | 119 | rst = 1; // send the esp8266 reset |
jzacaroli | 1:7fff8f0dce62 | 120 | wait(1); |
jzacaroli | 1:7fff8f0dce62 | 121 | |
wadh4587 | 0:e5aa1648b1c5 | 122 | |
jzacaroli | 1:7fff8f0dce62 | 123 | // pc.attach(&pc_recv, Serial::RxIrq); // attach the two interrupt services |
jzacaroli | 1:7fff8f0dce62 | 124 | // dev.attach(&dev_recv, Serial::RxIrq); |
jzacaroli | 1:7fff8f0dce62 | 125 | wait(5); |
jzacaroli | 1:7fff8f0dce62 | 126 | dev.printf("AT+RST\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 127 | wait(10); |
jzacaroli | 1:7fff8f0dce62 | 128 | dev.printf("AT+CWJAP=\"BTHub3-WXWX\",\"fdd6f7c682\"\r\n"); //Don't necessarily need this line as it already should connect |
jzacaroli | 1:7fff8f0dce62 | 129 | wait(10); |
jzacaroli | 1:7fff8f0dce62 | 130 | dev.printf("AT+CIPMUX=1\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 131 | wait(1); |
jzacaroli | 1:7fff8f0dce62 | 132 | dev.printf("AT+CIPSTART=4,\"TCP\",\"192.168.1.95\",333\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 133 | wait(2); |
jzacaroli | 1:7fff8f0dce62 | 134 | /*dev.printf("AT+CIPSEND=4,4\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 135 | wait(1); |
jzacaroli | 1:7fff8f0dce62 | 136 | dev.printf("TEST\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 137 | wait(1);*/ |
jzacaroli | 1:7fff8f0dce62 | 138 | |
jzacaroli | 1:7fff8f0dce62 | 139 | dev.attach(&NEWMESSAGE); //Interrupts and tells us to carry on sending data or not |
jzacaroli | 1:7fff8f0dce62 | 140 | |
jzacaroli | 1:7fff8f0dce62 | 141 | |
jzacaroli | 1:7fff8f0dce62 | 142 | |
jzacaroli | 1:7fff8f0dce62 | 143 | |
jzacaroli | 1:7fff8f0dce62 | 144 | |
wadh4587 | 0:e5aa1648b1c5 | 145 | while(1) { |
jzacaroli | 1:7fff8f0dce62 | 146 | if(START == 0) { |
jzacaroli | 1:7fff8f0dce62 | 147 | Dummy = 1 - Dummy; |
jzacaroli | 1:7fff8f0dce62 | 148 | //pc.printf("Off"); |
jzacaroli | 1:7fff8f0dce62 | 149 | } |
jzacaroli | 1:7fff8f0dce62 | 150 | |
jzacaroli | 1:7fff8f0dce62 | 151 | else if(START == 1) { |
jzacaroli | 1:7fff8f0dce62 | 152 | pc.printf("Start = 1\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 153 | |
jzacaroli | 1:7fff8f0dce62 | 154 | if(AUTO) {//***************AUTOMATIC MODE***********************// |
jzacaroli | 1:7fff8f0dce62 | 155 | |
jzacaroli | 1:7fff8f0dce62 | 156 | pc.printf("AUTO\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 157 | //Code which reads temperature and sets fan on/off accordingly |
jzacaroli | 1:7fff8f0dce62 | 158 | int i; |
jzacaroli | 1:7fff8f0dce62 | 159 | int devices_found=0; |
jzacaroli | 1:7fff8f0dce62 | 160 | // Initialize the probe array to DS1820 objects |
jzacaroli | 1:7fff8f0dce62 | 161 | for (i = 0; i < MAX_PROBES; i++) |
jzacaroli | 1:7fff8f0dce62 | 162 | probe[i] = new DS1820(D0); |
jzacaroli | 1:7fff8f0dce62 | 163 | // Initialize global state variables |
jzacaroli | 1:7fff8f0dce62 | 164 | probe[0]->search_Rom_setup(); |
jzacaroli | 1:7fff8f0dce62 | 165 | // Loop to find all devices on the data line |
jzacaroli | 1:7fff8f0dce62 | 166 | while (probe[devices_found]->search_Rom() and devices_found<MAX_PROBES-1) |
jzacaroli | 1:7fff8f0dce62 | 167 | devices_found++; |
jzacaroli | 1:7fff8f0dce62 | 168 | // If maximum number of probes are found, |
jzacaroli | 1:7fff8f0dce62 | 169 | // bump the counter to include the last array entry |
jzacaroli | 1:7fff8f0dce62 | 170 | if (probe[devices_found]->Rom[0] != 0xFF) |
jzacaroli | 1:7fff8f0dce62 | 171 | devices_found++; |
jzacaroli | 1:7fff8f0dce62 | 172 | |
jzacaroli | 1:7fff8f0dce62 | 173 | if (devices_found==0) |
jzacaroli | 1:7fff8f0dce62 | 174 | printf("No devices found"); |
jzacaroli | 1:7fff8f0dce62 | 175 | else { |
jzacaroli | 1:7fff8f0dce62 | 176 | |
jzacaroli | 1:7fff8f0dce62 | 177 | probe[0]->convert_temperature(DS1820::all_devices); |
jzacaroli | 1:7fff8f0dce62 | 178 | for (i=0; i<devices_found; i++) { |
jzacaroli | 1:7fff8f0dce62 | 179 | Temp = probe[i]->temperature('c'); |
jzacaroli | 1:7fff8f0dce62 | 180 | if(Temp>27) { |
jzacaroli | 1:7fff8f0dce62 | 181 | fan = 1; |
jzacaroli | 1:7fff8f0dce62 | 182 | } else { |
jzacaroli | 1:7fff8f0dce62 | 183 | fan = 0; |
jzacaroli | 1:7fff8f0dce62 | 184 | } |
jzacaroli | 1:7fff8f0dce62 | 185 | } |
jzacaroli | 1:7fff8f0dce62 | 186 | } |
jzacaroli | 1:7fff8f0dce62 | 187 | |
jzacaroli | 1:7fff8f0dce62 | 188 | |
jzacaroli | 1:7fff8f0dce62 | 189 | |
jzacaroli | 1:7fff8f0dce62 | 190 | // Code reads a voltage from an LDR and sets brightness of inside lighting accordingly |
jzacaroli | 1:7fff8f0dce62 | 191 | |
jzacaroli | 1:7fff8f0dce62 | 192 | float v = 3.3*V1.read(); |
jzacaroli | 1:7fff8f0dce62 | 193 | |
jzacaroli | 1:7fff8f0dce62 | 194 | if(v<1) { |
jzacaroli | 1:7fff8f0dce62 | 195 | intensity = 0.1; |
jzacaroli | 1:7fff8f0dce62 | 196 | LightStatus = 1; |
jzacaroli | 1:7fff8f0dce62 | 197 | } else if(v<1.6) { |
jzacaroli | 1:7fff8f0dce62 | 198 | intensity = 0.5; |
jzacaroli | 1:7fff8f0dce62 | 199 | LightStatus = 2; |
jzacaroli | 1:7fff8f0dce62 | 200 | } else if(v<2.2) { |
jzacaroli | 1:7fff8f0dce62 | 201 | intensity = 1; |
jzacaroli | 1:7fff8f0dce62 | 202 | LightStatus = 3; |
jzacaroli | 1:7fff8f0dce62 | 203 | } else { |
jzacaroli | 1:7fff8f0dce62 | 204 | intensity = 0; |
jzacaroli | 1:7fff8f0dce62 | 205 | LightStatus = 0; |
jzacaroli | 1:7fff8f0dce62 | 206 | } |
jzacaroli | 1:7fff8f0dce62 | 207 | Lights = intensity; |
jzacaroli | 1:7fff8f0dce62 | 208 | |
jzacaroli | 1:7fff8f0dce62 | 209 | pc.printf("reached here"); |
jzacaroli | 1:7fff8f0dce62 | 210 | |
jzacaroli | 1:7fff8f0dce62 | 211 | |
jzacaroli | 1:7fff8f0dce62 | 212 | // if(AUTO) { //This is here to make sure that we're still on AutoMode before sending back data |
jzacaroli | 1:7fff8f0dce62 | 213 | pc.printf("ALights = %d\r\n",LightStatus); |
jzacaroli | 1:7fff8f0dce62 | 214 | pc.printf("ATemp = %3.1f\r\n",Temp); |
jzacaroli | 1:7fff8f0dce62 | 215 | pc.printf("AFan = %d\r\n",fan.read()); |
jzacaroli | 1:7fff8f0dce62 | 216 | |
jzacaroli | 1:7fff8f0dce62 | 217 | char msg[80]; |
jzacaroli | 1:7fff8f0dce62 | 218 | sprintf(msg,"Temp %3.1f\r\nFan %d\r\nLights %d\r\n",Temp,fan.read(),LightStatus); |
jzacaroli | 1:7fff8f0dce62 | 219 | dev.printf("AT+CIPSEND=4,%d\r\n",strlen(msg)); |
jzacaroli | 1:7fff8f0dce62 | 220 | wait(0.2); |
jzacaroli | 1:7fff8f0dce62 | 221 | dev.printf("%s",msg); |
jzacaroli | 1:7fff8f0dce62 | 222 | wait(5); |
jzacaroli | 1:7fff8f0dce62 | 223 | // } |
jzacaroli | 1:7fff8f0dce62 | 224 | |
jzacaroli | 1:7fff8f0dce62 | 225 | |
jzacaroli | 1:7fff8f0dce62 | 226 | } else { //***********************MANUAL MODE**************************// |
jzacaroli | 1:7fff8f0dce62 | 227 | Dummy = 1-Dummy; |
jzacaroli | 1:7fff8f0dce62 | 228 | pc.printf("MANUAL\r\n"); |
jzacaroli | 1:7fff8f0dce62 | 229 | |
jzacaroli | 1:7fff8f0dce62 | 230 | int i; |
jzacaroli | 1:7fff8f0dce62 | 231 | int devices_found=0; |
jzacaroli | 1:7fff8f0dce62 | 232 | // Initialize the probe array to DS1820 objects |
jzacaroli | 1:7fff8f0dce62 | 233 | for (i = 0; i < MAX_PROBES; i++) |
jzacaroli | 1:7fff8f0dce62 | 234 | probe[i] = new DS1820(D0); |
jzacaroli | 1:7fff8f0dce62 | 235 | // Initialize global state variables |
jzacaroli | 1:7fff8f0dce62 | 236 | probe[0]->search_Rom_setup(); |
jzacaroli | 1:7fff8f0dce62 | 237 | // Loop to find all devices on the data line |
jzacaroli | 1:7fff8f0dce62 | 238 | while (probe[devices_found]->search_Rom() and devices_found<MAX_PROBES-1) |
jzacaroli | 1:7fff8f0dce62 | 239 | devices_found++; |
jzacaroli | 1:7fff8f0dce62 | 240 | // If maximum number of probes are found, |
jzacaroli | 1:7fff8f0dce62 | 241 | // bump the counter to include the last array entry |
jzacaroli | 1:7fff8f0dce62 | 242 | if (probe[devices_found]->Rom[0] != 0xFF) |
jzacaroli | 1:7fff8f0dce62 | 243 | devices_found++; |
jzacaroli | 1:7fff8f0dce62 | 244 | if (devices_found==0) |
jzacaroli | 1:7fff8f0dce62 | 245 | printf("No devices found"); |
jzacaroli | 1:7fff8f0dce62 | 246 | else { |
jzacaroli | 1:7fff8f0dce62 | 247 | probe[0]->convert_temperature(DS1820::all_devices); |
jzacaroli | 1:7fff8f0dce62 | 248 | for (i=0; i<devices_found; i++) { |
jzacaroli | 1:7fff8f0dce62 | 249 | Temp = probe[i]->temperature('c'); |
jzacaroli | 1:7fff8f0dce62 | 250 | } |
jzacaroli | 1:7fff8f0dce62 | 251 | } |
jzacaroli | 1:7fff8f0dce62 | 252 | pc.printf("mLights = %d\r\n",LightStatus); |
jzacaroli | 1:7fff8f0dce62 | 253 | pc.printf("mTemp = %3.1f\r\n",Temp); |
jzacaroli | 1:7fff8f0dce62 | 254 | pc.printf("mFan = %d\r\n",fan.read()); |
jzacaroli | 1:7fff8f0dce62 | 255 | |
jzacaroli | 1:7fff8f0dce62 | 256 | char msg[80]; |
jzacaroli | 1:7fff8f0dce62 | 257 | sprintf(msg,"Temp %3.1f\r\nFan %d\r\nLights %d\r\n",Temp,fan.read(),LightStatus); |
jzacaroli | 1:7fff8f0dce62 | 258 | dev.printf("AT+CIPSEND=4,%d\r\n",strlen(msg)); |
jzacaroli | 1:7fff8f0dce62 | 259 | wait(0.2); |
jzacaroli | 1:7fff8f0dce62 | 260 | dev.printf("%s",msg); |
jzacaroli | 1:7fff8f0dce62 | 261 | wait(5); |
jzacaroli | 1:7fff8f0dce62 | 262 | } |
jzacaroli | 1:7fff8f0dce62 | 263 | } |
jzacaroli | 1:7fff8f0dce62 | 264 | |
wadh4587 | 0:e5aa1648b1c5 | 265 | } |
jzacaroli | 1:7fff8f0dce62 | 266 | } |