From 239ba179a1f16cb12150cd831afb8fd685aa04b8 Mon Sep 17 00:00:00 2001 From: Ollo Date: Sat, 31 Oct 2020 01:50:17 +0100 Subject: [PATCH 01/31] SensorPwr for 1Wire routed --- board/PlantCtrlESP32.kicad_pcb | 367 +++++++++++++++++---------------- 1 file changed, 189 insertions(+), 178 deletions(-) diff --git a/board/PlantCtrlESP32.kicad_pcb b/board/PlantCtrlESP32.kicad_pcb index 1d27d2b..f9403fd 100644 --- a/board/PlantCtrlESP32.kicad_pcb +++ b/board/PlantCtrlESP32.kicad_pcb @@ -2,8 +2,8 @@ (general (thickness 1.6) - (drawings 10) - (tracks 1003) + (drawings 11) + (tracks 1011) (zones 0) (modules 134) (nets 72) @@ -34,7 +34,7 @@ ) (setup - (last_trace_width 1.2) + (last_trace_width 0.25) (user_trace_width 0.25) (user_trace_width 0.5) (trace_clearance 0.2) @@ -3240,7 +3240,7 @@ (effects (font (size 1 1) (thickness 0.15))) ) (pad 3 thru_hole oval (at 5 0 90) (size 1.7 1.95) (drill 0.95) (layers *.Cu *.Mask) - (net 28 3_3V)) + (net 36 PWR_SENSORS)) (pad 2 thru_hole oval (at 2.5 0 90) (size 1.7 1.95) (drill 0.95) (layers *.Cu *.Mask) (net 29 Temp)) (pad 1 thru_hole roundrect (at 0 0 90) (size 1.7 1.95) (drill 0.95) (layers *.Cu *.Mask) (roundrect_rratio 0.147059) @@ -5673,6 +5673,9 @@ ) ) + (gr_text "PlantCtrl V0.3" (at 215.4936 48.514) (layer B.SilkS) (tstamp 5F9CBCD8) + (effects (font (size 4 4) (thickness 0.5)) (justify mirror)) + ) (gr_text "Fix Power" (at 212.4964 71.9836) (layer F.SilkS) (tstamp 5F940B2E) (effects (font (size 2 2) (thickness 0.5))) ) @@ -5680,7 +5683,7 @@ (effects (font (size 2 2) (thickness 0.5)) (justify mirror)) ) (gr_circle (center 222.885 102.87) (end 223.52 102.87) (layer Dwgs.User) (width 0.15)) - (gr_text "PlantCtrl V0.3" (at 239.268 101.346) (layer F.SilkS) + (gr_text "PlantCtrl V0.3" (at 215.6968 54.61) (layer F.SilkS) (tstamp 5F9CBCD5) (effects (font (size 4 4) (thickness 0.5))) ) (gr_text "Set to Pump Voltage\nMax 15V" (at 178.816 83.82 90) (layer F.SilkS) @@ -5702,11 +5705,11 @@ (segment (start 228.205 113.8825) (end 227.33 113.8825) (width 0.25) (layer F.Cu) (net 1) (status 20)) (segment (start 227.98 120.245) (end 229.005001 119.219999) (width 0.25) (layer F.Cu) (net 1)) (segment (start 227.33 120.245) (end 227.98 120.245) (width 0.25) (layer F.Cu) (net 1) (status 10)) - (segment (start 227.33 121.445) (end 227.33 120.245) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 227.33 121.445) (end 227.33 120.245) (width 0.25) (layer F.Cu) (net 1) (status 20)) (segment (start 227.1455 121.6295) (end 227.33 121.445) (width 0.25) (layer F.Cu) (net 1)) (segment (start 223.901 121.6295) (end 227.1455 121.6295) (width 0.25) (layer F.Cu) (net 1)) (segment (start 228.9445 106.158) (end 228.981 106.1945) (width 0.25) (layer F.Cu) (net 1)) - (segment (start 228.9445 105.283) (end 228.9445 106.158) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 228.9445 105.283) (end 228.9445 106.158) (width 0.25) (layer F.Cu) (net 1) (status 10)) (segment (start 228.981 114.8715) (end 229.005001 114.682501) (width 0.25) (layer F.Cu) (net 1)) (segment (start 228.981 106.1945) (end 228.981 114.8715) (width 0.25) (layer F.Cu) (net 1)) (segment (start 229.005001 119.219999) (end 228.981 114.8715) (width 0.25) (layer F.Cu) (net 1)) @@ -5716,7 +5719,7 @@ (segment (start 236.625001 119.219999) (end 236.625001 114.682501) (width 0.25) (layer F.Cu) (net 2)) (segment (start 234.95 120.245) (end 235.6 120.245) (width 0.25) (layer F.Cu) (net 2) (status 10)) (segment (start 236.4375 114.495) (end 236.517 114.5745) (width 0.25) (layer F.Cu) (net 2)) - (segment (start 236.4375 105.283) (end 236.4375 114.495) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 236.4375 105.283) (end 236.4375 114.495) (width 0.25) (layer F.Cu) (net 2) (status 10)) (segment (start 236.517 114.5745) (end 235.825 113.8825) (width 0.25) (layer F.Cu) (net 2)) (segment (start 236.625001 114.682501) (end 236.517 114.5745) (width 0.25) (layer F.Cu) (net 2)) (segment (start 242.57 125.77) (end 242.57 120.245) (width 0.5) (layer F.Cu) (net 3) (status 30)) @@ -5726,7 +5729,7 @@ (segment (start 242.57 120.245) (end 243.22 120.245) (width 0.25) (layer F.Cu) (net 3) (status 10)) (segment (start 243.9305 114.454) (end 244.2845 114.808) (width 0.25) (layer F.Cu) (net 3)) (segment (start 244.2845 114.808) (end 244.245001 114.682501) (width 0.25) (layer F.Cu) (net 3)) - (segment (start 243.9305 105.283) (end 243.9305 114.454) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 243.9305 105.283) (end 243.9305 114.454) (width 0.25) (layer F.Cu) (net 3) (status 10)) (segment (start 244.245001 119.219999) (end 244.2845 114.808) (width 0.25) (layer F.Cu) (net 3)) (segment (start 250.19 125.77) (end 250.19 120.245) (width 0.5) (layer F.Cu) (net 4) (status 30)) (segment (start 251.865001 119.219999) (end 251.865001 114.682501) (width 0.25) (layer F.Cu) (net 4)) @@ -5734,7 +5737,7 @@ (segment (start 251.065 113.8825) (end 250.19 113.8825) (width 0.25) (layer F.Cu) (net 4) (status 20)) (segment (start 250.19 120.245) (end 250.84 120.245) (width 0.25) (layer F.Cu) (net 4) (status 10)) (segment (start 251.741 114.454) (end 251.841 114.554) (width 0.25) (layer F.Cu) (net 4)) - (segment (start 251.741 105.283) (end 251.741 114.454) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 251.741 105.283) (end 251.741 114.454) (width 0.25) (layer F.Cu) (net 4) (status 10)) (segment (start 251.841 114.554) (end 251.065 113.8825) (width 0.25) (layer F.Cu) (net 4)) (segment (start 251.865001 114.682501) (end 251.841 114.554) (width 0.25) (layer F.Cu) (net 4)) (segment (start 257.81 125.77) (end 257.81 120.245) (width 0.5) (layer F.Cu) (net 5) (status 30)) @@ -5743,7 +5746,7 @@ (segment (start 258.46 120.245) (end 259.485001 119.219999) (width 0.25) (layer F.Cu) (net 5)) (segment (start 257.81 120.245) (end 258.46 120.245) (width 0.25) (layer F.Cu) (net 5) (status 10)) (segment (start 259.5515 114.4) (end 259.377 114.5745) (width 0.25) (layer F.Cu) (net 5)) - (segment (start 259.5515 105.41) (end 259.5515 114.4) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 259.5515 105.41) (end 259.5515 114.4) (width 0.25) (layer F.Cu) (net 5) (status 10)) (segment (start 259.377 114.5745) (end 258.685 113.8825) (width 0.25) (layer F.Cu) (net 5)) (segment (start 259.485001 114.682501) (end 259.377 114.5745) (width 0.25) (layer F.Cu) (net 5)) (segment (start 265.43 125.77) (end 265.43 120.245) (width 0.5) (layer F.Cu) (net 6) (status 30)) @@ -5752,7 +5755,7 @@ (segment (start 267.105001 119.219999) (end 267.105001 114.682501) (width 0.25) (layer F.Cu) (net 6)) (segment (start 266.08 120.245) (end 267.105001 119.219999) (width 0.25) (layer F.Cu) (net 6)) (segment (start 265.43 120.245) (end 266.08 120.245) (width 0.25) (layer F.Cu) (net 6) (status 10)) - (segment (start 266.9175 105.41) (end 266.9175 114.327) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 266.9175 105.41) (end 266.9175 114.327) (width 0.25) (layer F.Cu) (net 6) (status 10)) (segment (start 264.48 117.245) (end 261.771 117.245) (width 0.5) (layer F.Cu) (net 7) (status 10)) (via (at 261.62 117.094) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) (segment (start 261.771 117.245) (end 261.62 117.094) (width 0.5) (layer F.Cu) (net 7)) @@ -5874,43 +5877,43 @@ (segment (start 203.218999 103.105001) (end 204.724 101.6) (width 0.25) (layer B.Cu) (net 7)) (via (at 204.724 101.6) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) (segment (start 231.775 116.967) (end 231.902 117.094) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 231.775 113.8825) (end 231.775 116.967) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 238.76 117.094) (end 238.76 113.8825) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 231.775 113.8825) (end 231.775 116.967) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 238.76 117.094) (end 238.76 113.8825) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 246.38 114.595) (end 246.38 117.094) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 246.38 113.8825) (end 246.38 114.595) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 246.38 113.8825) (end 246.38 114.595) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 261.62 114.595) (end 261.62 117.094) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 261.62 113.8825) (end 261.62 114.595) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 261.62 113.8825) (end 261.62 114.595) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 254 114.595) (end 254 117.094) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 254 113.8825) (end 254 114.595) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 239.7975 90.5245) (end 239.7975 91.2495) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 254 113.8825) (end 254 114.595) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 239.7975 90.5245) (end 239.7975 91.2495) (width 0.25) (layer F.Cu) (net 7) (status 30)) (segment (start 236.855 80.505) (end 239.7975 83.4475) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 236.855 79.7925) (end 236.855 80.505) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 236.855 79.7925) (end 236.855 80.505) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 232.96 90.5245) (end 233.463 90.0215) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 232.96 91.2495) (end 232.96 90.5245) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 239.7975 90.0215) (end 239.7975 90.5245) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 232.96 91.2495) (end 232.96 90.5245) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 239.7975 90.0215) (end 239.7975 90.5245) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 239.7975 83.4475) (end 239.7975 90.0215) (width 0.25) (layer F.Cu) (net 7)) (segment (start 233.9975 89.995) (end 233.9975 89.916) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 233.468 90.5245) (end 233.9975 89.995) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 233.468 91.2495) (end 233.468 90.5245) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 233.468 90.5245) (end 233.9975 89.995) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 233.468 91.2495) (end 233.468 90.5245) (width 0.25) (layer F.Cu) (net 7) (status 30)) (segment (start 233.463 90.0215) (end 233.9975 89.916) (width 0.25) (layer F.Cu) (net 7)) (segment (start 230.203 89.916) (end 235.204 89.916) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 229.531 91.313) (end 229.531 90.588) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 229.531 90.588) (end 230.203 89.916) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 229.531 91.313) (end 229.531 90.588) (width 0.25) (layer F.Cu) (net 7) (status 30)) + (segment (start 229.531 90.588) (end 230.203 89.916) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 235.204 89.916) (end 239.7975 90.0215) (width 0.25) (layer F.Cu) (net 7)) (segment (start 233.9975 89.916) (end 235.204 89.916) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 243.798 90.588) (end 243.798 91.313) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 243.2315 90.0215) (end 243.798 90.588) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 243.798 90.588) (end 244.47 89.916) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 247.6715 90.588) (end 247.6715 91.313) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 246.9995 89.916) (end 247.6715 90.588) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 243.798 90.588) (end 243.798 91.313) (width 0.25) (layer F.Cu) (net 7) (status 30)) + (segment (start 243.2315 90.0215) (end 243.798 90.588) (width 0.25) (layer F.Cu) (net 7) (status 20)) + (segment (start 243.798 90.588) (end 244.47 89.916) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 247.6715 90.588) (end 247.6715 91.313) (width 0.25) (layer F.Cu) (net 7) (status 30)) + (segment (start 246.9995 89.916) (end 247.6715 90.588) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 242.697 89.916) (end 243.2315 90.0215) (width 0.25) (layer F.Cu) (net 7)) (segment (start 239.7975 90.0215) (end 242.697 89.916) (width 0.25) (layer F.Cu) (net 7)) (segment (start 244.6655 89.916) (end 242.697 89.916) (width 0.25) (layer F.Cu) (net 7)) (segment (start 244.47 89.916) (end 244.6655 89.916) (width 0.25) (layer F.Cu) (net 7)) (segment (start 244.6655 89.916) (end 246.9995 89.916) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 247.6715 93.2485) (end 247.6715 91.313) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 245.67 95.25) (end 247.6715 93.2485) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 190.205 124.46) (end 189.23 124.46) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 247.6715 93.2485) (end 247.6715 91.313) (width 0.25) (layer F.Cu) (net 7) (status 20)) + (segment (start 245.67 95.25) (end 247.6715 93.2485) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 190.205 124.46) (end 189.23 124.46) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 192.5685 122.0965) (end 190.205 124.46) (width 0.25) (layer F.Cu) (net 7)) (segment (start 192.5685 121.4485) (end 192.5685 122.0965) (width 0.25) (layer F.Cu) (net 7)) (via (at 227.0125 79.756) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) @@ -5920,18 +5923,18 @@ (segment (start 227.483501 79.284999) (end 232.383499 79.284999) (width 0.25) (layer F.Cu) (net 7)) (segment (start 227.0125 79.756) (end 227.483501 79.284999) (width 0.25) (layer F.Cu) (net 7)) (segment (start 232.8545 79.756) (end 232.8275 79.7925) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 236.855 79.7925) (end 232.8545 79.756) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 217.5875 81.28) (end 217.4605 81.407) (width 0.5) (layer F.Cu) (net 7)) - (segment (start 217.5875 77.47) (end 217.5875 81.28) (width 0.5) (layer F.Cu) (net 7)) - (segment (start 212.4735 70.0265) (end 212.65 69.85) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 212.4735 75.6525) (end 212.4735 70.0265) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 236.855 79.7925) (end 232.8545 79.756) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 217.5875 81.28) (end 217.4605 81.407) (width 0.5) (layer F.Cu) (net 7) (status 30)) + (segment (start 217.5875 77.47) (end 217.5875 81.28) (width 0.5) (layer F.Cu) (net 7) (status 30)) + (segment (start 212.4735 70.0265) (end 212.65 69.85) (width 0.25) (layer F.Cu) (net 7) (status 30)) + (segment (start 212.4735 75.6525) (end 212.4735 70.0265) (width 0.25) (layer F.Cu) (net 7) (status 30)) (segment (start 202.1205 98.9965) (end 204.724 101.6) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 202.1205 93.7965) (end 202.1205 98.9965) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 217.4605 83.4335) (end 218.0615 84.0345) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 217.4605 81.407) (end 217.4605 83.4335) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 217.4605 81.901) (end 217.4605 81.407) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 215.0605 84.301) (end 217.4605 81.901) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 214.1855 84.301) (end 215.0605 84.301) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 202.1205 93.7965) (end 202.1205 98.9965) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 217.4605 83.4335) (end 218.0615 84.0345) (width 0.25) (layer F.Cu) (net 7) (status 20)) + (segment (start 217.4605 81.407) (end 217.4605 83.4335) (width 0.25) (layer F.Cu) (net 7) (status 10)) + (segment (start 217.4605 81.901) (end 217.4605 81.407) (width 0.25) (layer F.Cu) (net 7) (status 30)) + (segment (start 215.0605 84.301) (end 217.4605 81.901) (width 0.25) (layer F.Cu) (net 7) (status 20)) + (segment (start 214.1855 84.301) (end 215.0605 84.301) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 237.542 100.838) (end 243.13 95.25) (width 0.25) (layer B.Cu) (net 8) (status 20)) (segment (start 199.136 124.206) (end 199.136 112.90159) (width 0.25) (layer B.Cu) (net 8)) (segment (start 211.19959 100.838) (end 237.542 100.838) (width 0.25) (layer B.Cu) (net 8)) @@ -5943,8 +5946,8 @@ (segment (start 200.025 128.905) (end 197.231 126.111) (width 0.25) (layer B.Cu) (net 8)) (segment (start 200.025 132.715) (end 200.025 128.905) (width 0.25) (layer B.Cu) (net 8)) (segment (start 197.231 126.111) (end 199.136 124.206) (width 0.25) (layer B.Cu) (net 8)) - (segment (start 245.5965 92.7835) (end 243.13 95.25) (width 0.25) (layer F.Cu) (net 8)) - (segment (start 245.5965 91.313) (end 245.5965 92.7835) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 245.5965 92.7835) (end 243.13 95.25) (width 0.25) (layer F.Cu) (net 8) (status 20)) + (segment (start 245.5965 91.313) (end 245.5965 92.7835) (width 0.25) (layer F.Cu) (net 8) (status 10)) (segment (start 198.68599 112.71519) (end 211.013189 100.387991) (width 0.25) (layer B.Cu) (net 9)) (segment (start 211.013189 100.387991) (end 235.452009 100.387991) (width 0.25) (layer B.Cu) (net 9)) (segment (start 198.68599 118.56001) (end 198.68599 112.71519) (width 0.25) (layer B.Cu) (net 9)) @@ -5962,8 +5965,8 @@ (segment (start 192.405 130.81) (end 191.3255 129.7305) (width 0.25) (layer B.Cu) (net 9)) (segment (start 191.3255 125.9205) (end 192.024 125.222) (width 0.25) (layer B.Cu) (net 9)) (segment (start 190.286 126.96) (end 191.3255 125.9205) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 241.723 94.117) (end 240.59 95.25) (width 0.25) (layer F.Cu) (net 9)) - (segment (start 241.723 91.313) (end 241.723 94.117) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 241.723 94.117) (end 240.59 95.25) (width 0.25) (layer F.Cu) (net 9) (status 20)) + (segment (start 241.723 91.313) (end 241.723 94.117) (width 0.25) (layer F.Cu) (net 9) (status 10)) (segment (start 233.478 99.822) (end 238.05 95.25) (width 0.25) (layer B.Cu) (net 10) (status 20)) (segment (start 210.94277 99.822) (end 233.478 99.822) (width 0.25) (layer B.Cu) (net 10)) (segment (start 198.12 118.48959) (end 198.12 112.64477) (width 0.25) (layer B.Cu) (net 10)) @@ -5980,8 +5983,8 @@ (segment (start 186.055 128.348285) (end 184.13 126.423285) (width 0.25) (layer B.Cu) (net 10)) (segment (start 186.055 130.81) (end 186.055 128.348285) (width 0.25) (layer B.Cu) (net 10)) (segment (start 184.13 125.71) (end 185.42 124.42) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 237.7225 94.9225) (end 238.05 95.25) (width 0.25) (layer F.Cu) (net 10)) - (segment (start 237.7225 91.2495) (end 237.7225 94.9225) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 237.7225 94.9225) (end 238.05 95.25) (width 0.25) (layer F.Cu) (net 10) (status 30)) + (segment (start 237.7225 91.2495) (end 237.7225 94.9225) (width 0.25) (layer F.Cu) (net 10) (status 30)) (segment (start 178.308 122.174) (end 178.308 125.222) (width 0.25) (layer B.Cu) (net 11)) (segment (start 195.586215 120.135785) (end 180.346215 120.135785) (width 0.25) (layer B.Cu) (net 11)) (segment (start 231.446 99.314) (end 210.81436 99.314) (width 0.25) (layer B.Cu) (net 11)) @@ -5997,8 +6000,8 @@ (segment (start 178.435 127.635) (end 177.165 126.365) (width 0.25) (layer B.Cu) (net 11)) (segment (start 178.435 130.81) (end 178.435 127.635) (width 0.25) (layer B.Cu) (net 11)) (segment (start 178.308 125.222) (end 177.165 126.365) (width 0.25) (layer B.Cu) (net 11)) - (segment (start 235.543 95.217) (end 235.51 95.25) (width 0.25) (layer F.Cu) (net 11)) - (segment (start 235.543 91.2495) (end 235.543 95.217) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 235.543 95.217) (end 235.51 95.25) (width 0.25) (layer F.Cu) (net 11) (status 30)) + (segment (start 235.543 91.2495) (end 235.543 95.217) (width 0.25) (layer F.Cu) (net 11) (status 30)) (segment (start 229.414 98.806) (end 210.68595 98.806) (width 0.25) (layer B.Cu) (net 12)) (segment (start 232.97 95.25) (end 229.414 98.806) (width 0.25) (layer B.Cu) (net 12) (status 10)) (via (at 196.215 112.395) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 12)) @@ -6011,10 +6014,10 @@ (segment (start 195.7975 110.49) (end 195.7975 112.1775) (width 0.25) (layer F.Cu) (net 12) (status 10)) (segment (start 193.875 114.1) (end 193.875 118.745) (width 0.25) (layer F.Cu) (net 12) (status 20)) (segment (start 195.7975 112.1775) (end 193.875 114.1) (width 0.25) (layer F.Cu) (net 12)) - (segment (start 232.97 92.677) (end 231.606 91.313) (width 0.25) (layer F.Cu) (net 12)) - (segment (start 232.97 95.25) (end 232.97 92.677) (width 0.25) (layer F.Cu) (net 12)) - (segment (start 193.7655 118.8545) (end 193.875 118.745) (width 0.25) (layer F.Cu) (net 12)) - (segment (start 193.7655 121.031) (end 193.7655 118.8545) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 232.97 92.677) (end 231.606 91.313) (width 0.25) (layer F.Cu) (net 12) (status 20)) + (segment (start 232.97 95.25) (end 232.97 92.677) (width 0.25) (layer F.Cu) (net 12) (status 10)) + (segment (start 193.7655 118.8545) (end 193.875 118.745) (width 0.25) (layer F.Cu) (net 12) (status 30)) + (segment (start 193.7655 121.031) (end 193.7655 118.8545) (width 0.25) (layer F.Cu) (net 12) (status 30)) (segment (start 188.3775 107.315) (end 187.325 107.315) (width 0.25) (layer F.Cu) (net 13) (status 10)) (segment (start 187.325 107.315) (end 186.055 108.585) (width 0.25) (layer F.Cu) (net 13)) (via (at 186.055 108.585) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 13)) @@ -6025,7 +6028,7 @@ (segment (start 200.90554 107.95) (end 186.69 107.95) (width 0.25) (layer B.Cu) (net 13)) (segment (start 210.499549 98.355991) (end 200.90554 107.95) (width 0.25) (layer B.Cu) (net 13)) (segment (start 227.324009 98.355991) (end 210.499549 98.355991) (width 0.25) (layer B.Cu) (net 13)) - (segment (start 230.43 95.25) (end 227.324009 98.355991) (width 0.25) (layer B.Cu) (net 13)) + (segment (start 230.43 95.25) (end 227.324009 98.355991) (width 0.25) (layer B.Cu) (net 13) (status 10)) (segment (start 219.71 107.7325) (end 219.6735 107.696) (width 0.25) (layer F.Cu) (net 14) (status 30)) (segment (start 219.71 110.9075) (end 219.71 107.7325) (width 0.25) (layer F.Cu) (net 14) (status 30)) (segment (start 261.366 100.838) (end 261.80499 100.39901) (width 0.25) (layer F.Cu) (net 15)) @@ -6044,7 +6047,7 @@ (segment (start 215.66099 109.10799) (end 215.66099 105.112178) (width 0.25) (layer F.Cu) (net 15)) (via (at 212.344 109.728) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 15)) (segment (start 212.2805 109.6645) (end 212.344 109.728) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 210.7295 109.6645) (end 212.2805 109.6645) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 210.7295 109.6645) (end 212.2805 109.6645) (width 0.25) (layer F.Cu) (net 15) (status 10)) (segment (start 212.344 113.03) (end 212.1535 113.2205) (width 0.25) (layer B.Cu) (net 15)) (segment (start 212.344 109.728) (end 212.344 113.03) (width 0.25) (layer B.Cu) (net 15)) (segment (start 208.835 116.539) (end 212.1535 113.2205) (width 0.25) (layer B.Cu) (net 15)) @@ -6062,9 +6065,9 @@ (segment (start 230.450981 105.151607) (end 233.748588 101.854) (width 0.25) (layer F.Cu) (net 15)) (segment (start 226.693295 126.94501) (end 227.966705 126.94501) (width 0.25) (layer F.Cu) (net 15)) (segment (start 222.31999 122.571705) (end 226.693295 126.94501) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.6675 77.47) (end 222.6675 76.595) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 222.6675 77.47) (end 222.6675 76.595) (width 0.25) (layer F.Cu) (net 15) (status 30)) (segment (start 232.90767 78.75499) (end 260.35653 78.75499) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.6675 76.595) (end 222.99251 76.26999) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 222.6675 76.595) (end 222.99251 76.26999) (width 0.25) (layer F.Cu) (net 15) (status 10)) (segment (start 261.80499 100.5246) (end 261.37561 100.95398) (width 0.25) (layer F.Cu) (net 15)) (segment (start 226.4812 106.48301) (end 225.87501 107.0892) (width 0.25) (layer F.Cu) (net 15)) (segment (start 222.99251 76.26999) (end 230.42267 76.26999) (width 0.25) (layer F.Cu) (net 15)) @@ -6145,27 +6148,27 @@ (segment (start 259.4245 63.5) (end 263.33 63.5) (width 0.25) (layer F.Cu) (net 22) (status 10)) (segment (start 201.289 76.2) (end 200.913 75.824) (width 0.5) (layer F.Cu) (net 22) (status 30)) (segment (start 206.895 76.2) (end 201.289 76.2) (width 0.5) (layer F.Cu) (net 22) (status 30)) - (segment (start 218.2225 105.41) (end 218.3495 105.283) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 216.662 105.41) (end 218.2225 105.41) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 218.2225 105.41) (end 218.3495 105.283) (width 0.25) (layer F.Cu) (net 22) (status 30)) + (segment (start 216.662 105.41) (end 218.2225 105.41) (width 0.25) (layer F.Cu) (net 22) (status 20)) (segment (start 224.409 105.283) (end 224.282 105.41) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 225.9695 105.283) (end 224.409 105.283) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 233.3355 105.41) (end 233.4625 105.283) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 231.902 105.41) (end 233.3355 105.41) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 240.8285 105.41) (end 240.9555 105.283) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 239.522 105.41) (end 240.8285 105.41) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 248.639 105.41) (end 248.766 105.283) (width 0.25) (layer F.Cu) (net 22)) - (segment (start 247.142 105.41) (end 248.639 105.41) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 225.9695 105.283) (end 224.409 105.283) (width 0.25) (layer F.Cu) (net 22) (status 10)) + (segment (start 233.3355 105.41) (end 233.4625 105.283) (width 0.25) (layer F.Cu) (net 22) (status 30)) + (segment (start 231.902 105.41) (end 233.3355 105.41) (width 0.25) (layer F.Cu) (net 22) (status 20)) + (segment (start 240.8285 105.41) (end 240.9555 105.283) (width 0.25) (layer F.Cu) (net 22) (status 30)) + (segment (start 239.522 105.41) (end 240.8285 105.41) (width 0.25) (layer F.Cu) (net 22) (status 20)) + (segment (start 248.639 105.41) (end 248.766 105.283) (width 0.25) (layer F.Cu) (net 22) (status 30)) + (segment (start 247.142 105.41) (end 248.639 105.41) (width 0.25) (layer F.Cu) (net 22) (status 20)) (segment (start 199.094999 77.384001) (end 199.136 77.343) (width 0.5) (layer F.Cu) (net 22)) (segment (start 195.061499 77.384001) (end 199.094999 77.384001) (width 0.5) (layer F.Cu) (net 22)) (segment (start 192.2755 74.598002) (end 195.061499 77.384001) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 192.2755 70.969) (end 192.2755 74.598002) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 199.136 77.343) (end 200.913 75.824) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 202.1205 85.4465) (end 202.1205 86.2965) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 202.1205 85.2395) (end 202.1205 85.4465) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 205.8895 81.4705) (end 202.1205 85.2395) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 206.602 81.4705) (end 205.8895 81.4705) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 206.602 76.493) (end 206.895 76.2) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 206.602 81.4705) (end 206.602 76.493) (width 0.5) (layer F.Cu) (net 22)) + (segment (start 192.2755 70.969) (end 192.2755 74.598002) (width 0.5) (layer F.Cu) (net 22) (status 10)) + (segment (start 199.136 77.343) (end 200.913 75.824) (width 0.5) (layer F.Cu) (net 22) (status 20)) + (segment (start 202.1205 85.4465) (end 202.1205 86.2965) (width 0.5) (layer F.Cu) (net 22) (status 30)) + (segment (start 202.1205 85.2395) (end 202.1205 85.4465) (width 0.5) (layer F.Cu) (net 22) (status 20)) + (segment (start 205.8895 81.4705) (end 202.1205 85.2395) (width 0.5) (layer F.Cu) (net 22) (status 10)) + (segment (start 206.602 81.4705) (end 205.8895 81.4705) (width 0.5) (layer F.Cu) (net 22) (status 30)) + (segment (start 206.602 76.493) (end 206.895 76.2) (width 0.5) (layer F.Cu) (net 22) (status 30)) + (segment (start 206.602 81.4705) (end 206.602 76.493) (width 0.5) (layer F.Cu) (net 22) (status 30)) (segment (start 232.6275 133.35) (end 232.6275 134.6565) (width 0.25) (layer F.Cu) (net 23) (status 10)) (segment (start 230.759 136.525) (end 226.06 136.525) (width 0.25) (layer F.Cu) (net 23) (status 20)) (segment (start 232.6275 134.6565) (end 230.759 136.525) (width 0.25) (layer F.Cu) (net 23)) @@ -6199,27 +6202,23 @@ (segment (start 210.1215 104.902) (end 210.1215 110.0455) (width 0.25) (layer B.Cu) (net 25)) (segment (start 210.525 110.998) (end 209.734685 110.998) (width 0.25) (layer F.Cu) (net 25)) (segment (start 209.734685 110.998) (end 209.169 110.998) (width 0.25) (layer F.Cu) (net 25)) - (segment (start 210.7295 111.2025) (end 210.525 110.998) (width 0.25) (layer F.Cu) (net 25)) - (segment (start 210.7295 112.0775) (end 210.7295 111.2025) (width 0.25) (layer F.Cu) (net 25)) - (segment (start 176.632 71.332) (end 176.632 70.582) (width 0.5) (layer F.Cu) (net 25)) - (segment (start 178.882 73.582) (end 176.632 71.332) (width 0.5) (layer F.Cu) (net 25)) + (segment (start 210.7295 111.2025) (end 210.525 110.998) (width 0.25) (layer F.Cu) (net 25) (status 10)) + (segment (start 210.7295 112.0775) (end 210.7295 111.2025) (width 0.25) (layer F.Cu) (net 25) (status 30)) + (segment (start 176.632 71.332) (end 176.632 70.582) (width 0.5) (layer F.Cu) (net 25) (status 30)) + (segment (start 178.882 73.582) (end 176.632 71.332) (width 0.5) (layer F.Cu) (net 25) (status 20)) (segment (start 189.305002 69.419) (end 185.142002 73.582) (width 0.5) (layer F.Cu) (net 25)) (segment (start 190.4255 69.419) (end 189.305002 69.419) (width 0.5) (layer F.Cu) (net 25)) - (segment (start 191.3255 68.519) (end 190.4255 69.419) (width 0.5) (layer F.Cu) (net 25)) + (segment (start 191.3255 68.519) (end 190.4255 69.419) (width 0.5) (layer F.Cu) (net 25) (status 10)) (segment (start 185.142002 73.582) (end 178.882 73.582) (width 0.5) (layer F.Cu) (net 25)) - (segment (start 191.3255 67.969) (end 191.3255 68.519) (width 0.5) (layer F.Cu) (net 25)) + (segment (start 191.3255 67.969) (end 191.3255 68.519) (width 0.5) (layer F.Cu) (net 25) (status 30)) (segment (start 260.085 48.485) (end 253.96 54.61) (width 0.5) (layer F.Cu) (net 26) (status 20)) (segment (start 264.795 48.485) (end 260.085 48.485) (width 0.5) (layer F.Cu) (net 26) (status 10)) - (segment (start 204.6135 91.2965) (end 202.1205 91.2965) (width 0.25) (layer F.Cu) (net 27)) - (segment (start 206.573 91.2965) (end 206.5895 91.313) (width 0.25) (layer F.Cu) (net 27)) - (segment (start 202.1205 91.2965) (end 206.573 91.2965) (width 0.25) (layer F.Cu) (net 27)) + (segment (start 204.6135 91.2965) (end 202.1205 91.2965) (width 0.25) (layer F.Cu) (net 27) (status 20)) + (segment (start 206.573 91.2965) (end 206.5895 91.313) (width 0.25) (layer F.Cu) (net 27) (status 30)) + (segment (start 202.1205 91.2965) (end 206.573 91.2965) (width 0.25) (layer F.Cu) (net 27) (status 30)) (segment (start 195.613 75.824) (end 195.608 75.819) (width 0.25) (layer F.Cu) (net 28)) (segment (start 196.343 75.824) (end 195.613 75.824) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 212.65 95.25) (end 212.65 94.22) (width 0.25) (layer B.Cu) (net 28) (status 10)) - (segment (start 261.67799 88.08001) (end 266.7 83.058) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 265.512 67.136) (end 264.287 67.136) (width 0.25) (layer B.Cu) (net 28) (status 20)) - (segment (start 266.7 68.324) (end 265.512 67.136) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 266.7 83.058) (end 266.7 68.324) (width 0.25) (layer B.Cu) (net 28)) (segment (start 196.211 75.692) (end 196.343 75.824) (width 0.5) (layer F.Cu) (net 28) (status 30)) (segment (start 196.85 118.745) (end 198.755 118.745) (width 0.25) (layer F.Cu) (net 28) (status 10)) (via (at 200.66 115.57) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) @@ -6279,48 +6278,54 @@ (segment (start 202.96751 135.70499) (end 205.935006 135.70499) (width 0.25) (layer F.Cu) (net 28)) (segment (start 201.93 136.7425) (end 202.96751 135.70499) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 212.725 95.175) (end 212.65 95.25) (width 0.5) (layer B.Cu) (net 28) (status 30)) - (segment (start 236.62249 88.08001) (end 236.855 87.8475) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 236.62249 88.08001) (end 236.855 87.8475) (width 0.25) (layer F.Cu) (net 28) (status 30)) (via (at 194.6275 75.692) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) (segment (start 194.7595 75.824) (end 194.6275 75.692) (width 0.5) (layer F.Cu) (net 28)) - (segment (start 196.343 75.824) (end 194.7595 75.824) (width 0.5) (layer F.Cu) (net 28)) + (segment (start 196.343 75.824) (end 194.7595 75.824) (width 0.5) (layer F.Cu) (net 28) (status 10)) (segment (start 194.6275 75.692) (end 209.296 75.692) (width 0.5) (layer B.Cu) (net 28)) (segment (start 209.296 75.692) (end 209.45475 75.85075) (width 0.5) (layer B.Cu) (net 28)) - (segment (start 212.725 89.662) (end 212.725 95.175) (width 0.5) (layer B.Cu) (net 28)) + (segment (start 212.725 89.662) (end 212.725 95.175) (width 0.5) (layer B.Cu) (net 28) (status 20)) (segment (start 212.725 79.121) (end 212.725 89.662) (width 0.5) (layer B.Cu) (net 28)) (segment (start 212.725 88.9) (end 212.725 89.662) (width 0.5) (layer B.Cu) (net 28)) (segment (start 209.45475 75.85075) (end 212.725 79.121) (width 0.5) (layer B.Cu) (net 28) (tstamp 5F9C5393)) (via (at 209.45475 75.85075) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) (segment (start 209.1055 76.2) (end 209.45475 75.85075) (width 0.5) (layer F.Cu) (net 28)) - (segment (start 208.395 76.2) (end 209.1055 76.2) (width 0.5) (layer F.Cu) (net 28)) + (segment (start 208.395 76.2) (end 209.1055 76.2) (width 0.5) (layer F.Cu) (net 28) (status 10)) (via (at 225.6425 85.317) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) (segment (start 225.6425 85.57252) (end 225.6425 85.317) (width 0.25) (layer B.Cu) (net 28)) (segment (start 225.6425 85.317) (end 225.6425 85.57252) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 225.6425 77.47) (end 225.6425 85.317) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 225.6425 77.47) (end 225.6425 85.317) (width 0.25) (layer F.Cu) (net 28) (status 10)) (via (at 234.88099 88.08001) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) (segment (start 235.1135 87.8475) (end 234.88099 88.08001) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 236.855 87.8475) (end 235.1135 87.8475) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 234.88099 88.08001) (end 261.67799 88.08001) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 236.855 87.8475) (end 235.1135 87.8475) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 228.40551 88.08001) (end 225.6425 85.317) (width 0.25) (layer B.Cu) (net 28)) (segment (start 234.88099 88.08001) (end 228.40551 88.08001) (width 0.25) (layer B.Cu) (net 28)) (segment (start 211.5306 88.4676) (end 212.725 89.662) (width 0.25) (layer F.Cu) (net 28)) (via (at 212.725 89.662) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 210.5152 88.4676) (end 211.5306 88.4676) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 210.5152 88.4676) (end 211.5306 88.4676) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 217.07 85.317) (end 212.725 89.662) (width 0.5) (layer B.Cu) (net 28)) (segment (start 225.6425 85.317) (end 217.07 85.317) (width 0.5) (layer B.Cu) (net 28)) (segment (start 223.3565 42.037) (end 240.691002 42.037) (width 0.25) (layer F.Cu) (net 29) (status 10)) (via (at 260.858 46.609) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 29)) (segment (start 240.691002 42.037) (end 256.286 42.037) (width 0.25) (layer F.Cu) (net 29)) (segment (start 256.286 42.037) (end 260.858 46.609) (width 0.25) (layer F.Cu) (net 29)) - (segment (start 260.858 46.609) (end 260.858 66.421) (width 0.25) (layer B.Cu) (net 29)) (segment (start 264.073 69.636) (end 264.287 69.636) (width 0.25) (layer B.Cu) (net 29) (status 30)) (segment (start 260.858 66.421) (end 264.073 69.636) (width 0.25) (layer B.Cu) (net 29) (status 20)) (segment (start 251.639 66.421) (end 248.21 69.85) (width 0.25) (layer B.Cu) (net 29) (status 20)) - (segment (start 260.858 66.421) (end 251.639 66.421) (width 0.25) (layer B.Cu) (net 29)) (segment (start 223.3565 42.912) (end 223.3565 42.037) (width 0.25) (layer F.Cu) (net 29) (status 20)) (segment (start 223.03149 43.23701) (end 223.3565 42.912) (width 0.25) (layer F.Cu) (net 29)) (segment (start 216.86201 43.23701) (end 223.03149 43.23701) (width 0.25) (layer F.Cu) (net 29)) (segment (start 216.408 42.783) (end 216.86201 43.23701) (width 0.25) (layer F.Cu) (net 29)) (segment (start 216.408 41.783) (end 216.408 42.783) (width 0.25) (layer F.Cu) (net 29) (status 10)) + (via (at 260.8072 50.3428) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 29)) + (segment (start 260.858 50.292) (end 260.8072 50.3428) (width 0.25) (layer B.Cu) (net 29)) + (segment (start 260.858 46.609) (end 260.858 50.292) (width 0.25) (layer B.Cu) (net 29)) + (via (at 260.8072 57.912) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 29)) + (segment (start 260.8072 50.3428) (end 260.8072 57.912) (width 0.25) (layer F.Cu) (net 29)) + (segment (start 260.8072 66.3956) (end 260.858 66.4464) (width 0.25) (layer B.Cu) (net 29)) + (segment (start 260.8072 57.912) (end 260.8072 66.3956) (width 0.25) (layer B.Cu) (net 29)) + (segment (start 260.858 66.4464) (end 251.639 66.421) (width 0.25) (layer B.Cu) (net 29)) + (segment (start 260.858 66.421) (end 260.858 66.4464) (width 0.25) (layer B.Cu) (net 29)) (segment (start 219.71 125.77) (end 219.71 120.245) (width 0.5) (layer F.Cu) (net 30) (status 30)) (segment (start 220.585 113.8825) (end 219.71 113.8825) (width 0.25) (layer F.Cu) (net 30) (status 20)) (segment (start 221.385001 114.682501) (end 220.585 113.8825) (width 0.25) (layer F.Cu) (net 30)) @@ -6328,40 +6333,40 @@ (segment (start 219.71 120.245) (end 220.36 120.245) (width 0.25) (layer F.Cu) (net 30) (status 10)) (segment (start 221.361 106.1945) (end 221.361 115.824) (width 0.25) (layer F.Cu) (net 30)) (segment (start 221.3245 106.158) (end 221.361 106.1945) (width 0.25) (layer F.Cu) (net 30)) - (segment (start 221.3245 105.283) (end 221.3245 106.158) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.3245 105.283) (end 221.3245 106.158) (width 0.25) (layer F.Cu) (net 30) (status 10)) (segment (start 221.361 115.824) (end 221.385001 114.682501) (width 0.25) (layer F.Cu) (net 30)) (segment (start 221.385001 119.219999) (end 221.361 115.824) (width 0.25) (layer F.Cu) (net 30)) (segment (start 208.5895 91.313) (end 208.933501 91.657001) (width 0.25) (layer F.Cu) (net 31)) (segment (start 208.933501 91.657001) (end 217.143499 91.657001) (width 0.25) (layer F.Cu) (net 31)) - (segment (start 208.0895 91.313) (end 208.5895 91.313) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 208.0895 91.313) (end 208.5895 91.313) (width 0.25) (layer F.Cu) (net 31) (status 10)) (segment (start 219.0115 89.789) (end 217.143499 91.657001) (width 0.25) (layer F.Cu) (net 31)) - (segment (start 219.0115 87.0345) (end 219.0115 89.789) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 219.0115 87.0345) (end 219.0115 89.789) (width 0.25) (layer F.Cu) (net 31) (status 10)) (segment (start 243.13 69.85) (end 243.13 78.688) (width 0.25) (layer B.Cu) (net 32) (status 10)) (segment (start 243.13 78.688) (end 233.097 78.688) (width 0.25) (layer B.Cu) (net 32)) (via (at 231.775 80.01) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 32)) (segment (start 233.097 78.688) (end 231.775 80.01) (width 0.25) (layer B.Cu) (net 32)) (segment (start 231.775 80.01) (end 231.775 81.8) (width 0.25) (layer F.Cu) (net 32) (status 20)) - (segment (start 227.1665 81.9925) (end 227.1665 82.8675) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 227.859 81.3) (end 227.1665 81.9925) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 231.275 81.3) (end 227.859 81.3) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 231.775 81.8) (end 231.275 81.3) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 214.7205 80.5955) (end 214.7205 81.4705) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 214.7205 79.2995) (end 214.7205 80.5955) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 227.1665 81.9925) (end 227.1665 82.8675) (width 0.25) (layer F.Cu) (net 32) (status 30)) + (segment (start 227.859 81.3) (end 227.1665 81.9925) (width 0.25) (layer F.Cu) (net 32) (status 20)) + (segment (start 231.275 81.3) (end 227.859 81.3) (width 0.25) (layer F.Cu) (net 32) (status 10)) + (segment (start 231.775 81.8) (end 231.275 81.3) (width 0.25) (layer F.Cu) (net 32) (status 30)) + (segment (start 214.7205 80.5955) (end 214.7205 81.4705) (width 0.25) (layer F.Cu) (net 33) (status 30)) + (segment (start 214.7205 79.2995) (end 214.7205 80.5955) (width 0.25) (layer F.Cu) (net 33) (status 20)) (segment (start 214.0735 78.6525) (end 214.7205 79.2995) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 213.4235 78.6525) (end 214.0735 78.6525) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 207.264 109.888) (end 207.264 108.688) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 213.4235 78.6525) (end 214.0735 78.6525) (width 0.25) (layer F.Cu) (net 33) (status 10)) + (segment (start 207.264 109.888) (end 207.264 108.688) (width 0.25) (layer F.Cu) (net 34) (status 20)) (segment (start 208.534 111.436002) (end 207.264 110.166002) (width 0.25) (layer F.Cu) (net 34)) (segment (start 207.264 110.166002) (end 207.264 109.888) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 208.534 113.4475) (end 208.534 111.436002) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 209.577 81.4705) (end 211.7455 81.4705) (width 0.25) (layer F.Cu) (net 35)) - (segment (start 209.577 80.5955) (end 209.577 81.4705) (width 0.25) (layer F.Cu) (net 35)) - (segment (start 207.7215 78.74) (end 209.577 80.5955) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 208.534 113.4475) (end 208.534 111.436002) (width 0.25) (layer F.Cu) (net 34) (status 10)) + (segment (start 209.577 81.4705) (end 211.7455 81.4705) (width 0.25) (layer F.Cu) (net 35) (status 30)) + (segment (start 209.577 80.5955) (end 209.577 81.4705) (width 0.25) (layer F.Cu) (net 35) (status 30)) + (segment (start 207.7215 78.74) (end 209.577 80.5955) (width 0.25) (layer F.Cu) (net 35) (status 20)) (via (at 207.772 78.74) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 35)) (segment (start 207.7215 78.74) (end 207.772 78.74) (width 0.25) (layer F.Cu) (net 35)) (via (at 190.3755 72.964) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 35)) (segment (start 196.1515 78.74) (end 190.3755 72.964) (width 0.25) (layer B.Cu) (net 35)) (segment (start 207.772 78.74) (end 196.1515 78.74) (width 0.25) (layer B.Cu) (net 35)) - (segment (start 190.3755 70.969) (end 190.3755 72.964) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 190.3755 70.969) (end 190.3755 72.964) (width 0.25) (layer F.Cu) (net 35) (status 10)) (segment (start 175.895 129.46) (end 195.58 129.46) (width 0.5) (layer F.Cu) (net 36) (status 30)) (segment (start 195.58 129.46) (end 195.58 129.794) (width 0.5) (layer F.Cu) (net 36) (status 30)) (segment (start 189.23 116.76) (end 175.895 116.76) (width 0.5) (layer F.Cu) (net 36) (status 30)) @@ -6378,7 +6383,6 @@ (segment (start 217.932 42.037) (end 217.678 41.783) (width 0.25) (layer F.Cu) (net 36) (status 30)) (segment (start 220.3815 42.037) (end 217.932 42.037) (width 0.25) (layer F.Cu) (net 36) (status 30)) (segment (start 217.678 42.783) (end 171.958 88.503) (width 0.25) (layer B.Cu) (net 36)) - (segment (start 217.678 41.783) (end 217.678 42.783) (width 0.25) (layer B.Cu) (net 36) (status 10)) (segment (start 174.67 116.76) (end 175.895 116.76) (width 0.25) (layer B.Cu) (net 36) (status 20)) (segment (start 171.958 114.048) (end 174.67 116.76) (width 0.25) (layer B.Cu) (net 36)) (segment (start 171.958 88.503) (end 171.958 114.048) (width 0.25) (layer B.Cu) (net 36)) @@ -6388,12 +6392,19 @@ (segment (start 210.185 131.445) (end 211.335 130.295) (width 0.5) (layer F.Cu) (net 36)) (segment (start 215.265 124.975) (end 211.335 128.905) (width 0.25) (layer F.Cu) (net 36) (status 30)) (segment (start 215.265 124.6775) (end 215.265 124.975) (width 0.25) (layer F.Cu) (net 36) (status 30)) + (segment (start 217.678 42.783) (end 217.678 41.783) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 223.555001 48.660001) (end 217.678 42.783) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 255.440003 48.660001) (end 223.555001 48.660001) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 261.532201 54.752199) (end 255.440003 48.660001) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 263.062 67.136) (end 261.532201 65.606201) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 261.532201 65.606201) (end 261.532201 54.752199) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 264.287 67.136) (end 263.062 67.136) (width 0.25) (layer B.Cu) (net 36)) (segment (start 210.246 119.1555) (end 210.7835 118.618) (width 0.25) (layer F.Cu) (net 37) (status 30)) (segment (start 210.246 121.69) (end 210.246 119.1555) (width 0.25) (layer F.Cu) (net 37) (status 30)) (segment (start 210.7835 118.618) (end 210.7835 118.037) (width 0.25) (layer F.Cu) (net 37) (status 30)) - (segment (start 210.7835 117.797) (end 210.7835 118.618) (width 0.25) (layer F.Cu) (net 37)) - (segment (start 209.409 116.4225) (end 210.7835 117.797) (width 0.25) (layer F.Cu) (net 37)) - (segment (start 208.534 116.4225) (end 209.409 116.4225) (width 0.25) (layer F.Cu) (net 37)) + (segment (start 210.7835 117.797) (end 210.7835 118.618) (width 0.25) (layer F.Cu) (net 37) (status 30)) + (segment (start 209.409 116.4225) (end 210.7835 117.797) (width 0.25) (layer F.Cu) (net 37) (status 20)) + (segment (start 208.534 116.4225) (end 209.409 116.4225) (width 0.25) (layer F.Cu) (net 37) (status 10)) (via (at 201.168 117.348) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) (segment (start 201.422 121.7025) (end 201.422 117.602) (width 0.25) (layer F.Cu) (net 38) (status 10)) (segment (start 201.422 117.602) (end 201.168 117.348) (width 0.25) (layer F.Cu) (net 38)) @@ -6435,14 +6446,14 @@ (segment (start 201.041 107.061) (end 202.1205 105.9815) (width 0.25) (layer B.Cu) (net 40)) (segment (start 199.517 107.061) (end 201.041 107.061) (width 0.25) (layer B.Cu) (net 40)) (segment (start 202.1205 105.9815) (end 210.196018 97.905982) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 227.611 94.971) (end 227.89 95.25) (width 0.25) (layer F.Cu) (net 40)) - (segment (start 227.611 91.2495) (end 227.611 94.971) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 227.611 94.971) (end 227.89 95.25) (width 0.25) (layer F.Cu) (net 40) (status 30)) + (segment (start 227.611 91.2495) (end 227.611 94.971) (width 0.25) (layer F.Cu) (net 40) (status 30)) (segment (start 199.378 114.554) (end 201.676 114.554) (width 0.25) (layer F.Cu) (net 41) (status 10)) (segment (start 204.724 117.602) (end 204.724 121.7025) (width 0.25) (layer F.Cu) (net 41) (status 20)) (segment (start 201.676 114.554) (end 204.724 117.602) (width 0.25) (layer F.Cu) (net 41)) (segment (start 195.5435 114.554) (end 197.878 114.554) (width 0.25) (layer F.Cu) (net 42) (status 30)) - (segment (start 213.7045 114.427) (end 213.8315 114.554) (width 0.25) (layer F.Cu) (net 43)) - (segment (start 213.7045 112.0775) (end 213.7045 114.427) (width 0.25) (layer F.Cu) (net 43)) + (segment (start 213.7045 114.427) (end 213.8315 114.554) (width 0.25) (layer F.Cu) (net 43) (status 30)) + (segment (start 213.7045 112.0775) (end 213.7045 114.427) (width 0.25) (layer F.Cu) (net 43) (status 30)) (segment (start 226.5315 133.35) (end 229.6525 133.35) (width 0.25) (layer F.Cu) (net 44) (status 30)) (segment (start 226.5315 133.35) (end 226.5315 132.8785) (width 0.25) (layer F.Cu) (net 44) (status 30)) (segment (start 226.5315 132.8785) (end 228.092 131.318) (width 0.25) (layer F.Cu) (net 44) (status 10)) @@ -6463,7 +6474,7 @@ (segment (start 256.4495 63.5) (end 256.413 63.5) (width 0.25) (layer F.Cu) (net 45) (status 30)) (segment (start 256.4495 61.272) (end 256.1375 60.96) (width 0.25) (layer F.Cu) (net 45) (status 30)) (segment (start 256.4495 63.5) (end 256.4495 61.272) (width 0.25) (layer F.Cu) (net 45) (status 30)) - (segment (start 222.81 95.25) (end 226.747 91.313) (width 0.25) (layer B.Cu) (net 45)) + (segment (start 222.81 95.25) (end 226.747 91.313) (width 0.25) (layer B.Cu) (net 45) (status 10)) (via (at 255.524 91.059) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 45)) (segment (start 255.27 91.313) (end 255.524 91.059) (width 0.25) (layer B.Cu) (net 45)) (segment (start 226.747 91.313) (end 255.27 91.313) (width 0.25) (layer B.Cu) (net 45)) @@ -6474,15 +6485,15 @@ (via (at 257.6195 67.437) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 45)) (segment (start 259.475001 83.996499) (end 259.475001 69.292501) (width 0.25) (layer B.Cu) (net 45)) (segment (start 259.0165 84.455) (end 259.475001 83.996499) (width 0.25) (layer B.Cu) (net 45)) - (segment (start 256.4495 66.267) (end 257.6195 67.437) (width 0.25) (layer F.Cu) (net 45)) - (segment (start 256.4495 66.04) (end 256.4495 66.267) (width 0.25) (layer F.Cu) (net 45)) + (segment (start 256.4495 66.267) (end 257.6195 67.437) (width 0.25) (layer F.Cu) (net 45) (status 10)) + (segment (start 256.4495 66.04) (end 256.4495 66.267) (width 0.25) (layer F.Cu) (net 45) (status 30)) (segment (start 231.775 83.3) (end 235.2825 83.3) (width 0.25) (layer F.Cu) (net 46) (status 10)) (segment (start 236.0025 82.7675) (end 235.37625 83.39375) (width 0.25) (layer F.Cu) (net 46) (status 10)) (segment (start 236.855 82.7675) (end 236.0025 82.7675) (width 0.25) (layer F.Cu) (net 46) (status 30)) (segment (start 235.37625 83.39375) (end 236.855 84.8725) (width 0.25) (layer F.Cu) (net 46) (status 20)) (segment (start 235.2825 83.3) (end 235.37625 83.39375) (width 0.25) (layer F.Cu) (net 46)) (segment (start 230.62 84.455) (end 229.235 84.455) (width 0.25) (layer F.Cu) (net 46)) - (segment (start 231.775 83.3) (end 230.62 84.455) (width 0.25) (layer F.Cu) (net 46)) + (segment (start 231.775 83.3) (end 230.62 84.455) (width 0.25) (layer F.Cu) (net 46) (status 10)) (via (at 215.3285 90.932) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 46)) (segment (start 213.193 88.7965) (end 215.3285 90.932) (width 0.25) (layer F.Cu) (net 46)) (via (at 219.964 90.678) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 46)) @@ -6491,19 +6502,19 @@ (segment (start 223.012 90.678) (end 229.235 84.455) (width 0.25) (layer F.Cu) (net 46)) (segment (start 219.964 90.678) (end 223.012 90.678) (width 0.25) (layer F.Cu) (net 46)) (segment (start 203.3455 88.7965) (end 205.3756 86.7664) (width 0.25) (layer F.Cu) (net 46)) - (segment (start 202.1205 88.7965) (end 203.3455 88.7965) (width 0.25) (layer F.Cu) (net 46)) + (segment (start 202.1205 88.7965) (end 203.3455 88.7965) (width 0.25) (layer F.Cu) (net 46) (status 10)) (segment (start 211.1629 86.7664) (end 213.193 88.7965) (width 0.25) (layer F.Cu) (net 46)) (segment (start 205.3756 86.7664) (end 211.1629 86.7664) (width 0.25) (layer F.Cu) (net 46)) (segment (start 220.66 116.045) (end 220.185 115.57) (width 0.25) (layer F.Cu) (net 47)) - (segment (start 220.66 117.245) (end 220.66 116.045) (width 0.25) (layer F.Cu) (net 47)) + (segment (start 220.66 117.245) (end 220.66 116.045) (width 0.25) (layer F.Cu) (net 47) (status 10)) (segment (start 220.185 115.57) (end 218.694 115.57) (width 0.25) (layer F.Cu) (net 47)) (segment (start 218.694 115.57) (end 218.186 115.062) (width 0.25) (layer F.Cu) (net 47)) - (segment (start 217.41 110.9075) (end 216.535 110.9075) (width 0.25) (layer F.Cu) (net 47)) + (segment (start 217.41 110.9075) (end 216.535 110.9075) (width 0.25) (layer F.Cu) (net 47) (status 20)) (segment (start 218.186 111.6835) (end 217.41 110.9075) (width 0.25) (layer F.Cu) (net 47)) (segment (start 218.186 115.062) (end 218.186 111.6835) (width 0.25) (layer F.Cu) (net 47)) - (segment (start 215.66 110.9075) (end 216.535 110.9075) (width 0.25) (layer F.Cu) (net 47)) - (segment (start 214.417 109.6645) (end 215.66 110.9075) (width 0.25) (layer F.Cu) (net 47)) - (segment (start 213.7045 109.6645) (end 214.417 109.6645) (width 0.25) (layer F.Cu) (net 47)) + (segment (start 215.66 110.9075) (end 216.535 110.9075) (width 0.25) (layer F.Cu) (net 47) (status 30)) + (segment (start 214.417 109.6645) (end 215.66 110.9075) (width 0.25) (layer F.Cu) (net 47) (status 20)) + (segment (start 213.7045 109.6645) (end 214.417 109.6645) (width 0.25) (layer F.Cu) (net 47) (status 10)) (segment (start 261.56201 101.40399) (end 227.215008 101.40399) (width 0.25) (layer F.Cu) (net 48)) (segment (start 262.255 100.711) (end 261.56201 101.40399) (width 0.25) (layer F.Cu) (net 48)) (segment (start 262.255 80.01705) (end 262.255 100.711) (width 0.25) (layer F.Cu) (net 48)) @@ -6519,7 +6530,7 @@ (segment (start 230.264089 75.474999) (end 232.57659 77.7875) (width 0.25) (layer F.Cu) (net 48)) (segment (start 225.439499 75.474999) (end 230.264089 75.474999) (width 0.25) (layer F.Cu) (net 48)) (segment (start 224.2455 74.281) (end 225.439499 75.474999) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 224.2455 73.406) (end 224.2455 74.281) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 224.2455 73.406) (end 224.2455 74.281) (width 0.25) (layer F.Cu) (net 48) (status 10)) (segment (start 260.02545 77.7875) (end 262.255 80.01705) (width 0.25) (layer F.Cu) (net 48)) (segment (start 232.57659 77.7875) (end 260.02545 77.7875) (width 0.25) (layer F.Cu) (net 48)) (segment (start 263.34001 102.92799) (end 264.16 102.108) (width 0.25) (layer F.Cu) (net 49)) @@ -6538,7 +6549,7 @@ (segment (start 251.14 116.045) (end 250.411 115.316) (width 0.25) (layer F.Cu) (net 49)) (segment (start 248.412 114.808) (end 248.412 112.0645) (width 0.25) (layer F.Cu) (net 49)) (segment (start 264.16 80.01282) (end 260.02968 75.8825) (width 0.25) (layer F.Cu) (net 49)) - (segment (start 240.1205 74.3445) (end 240.1205 73.4695) (width 0.25) (layer F.Cu) (net 49)) + (segment (start 240.1205 74.3445) (end 240.1205 73.4695) (width 0.25) (layer F.Cu) (net 49) (status 20)) (segment (start 241.6585 75.8825) (end 240.1205 74.3445) (width 0.25) (layer F.Cu) (net 49)) (segment (start 260.02968 75.8825) (end 241.6585 75.8825) (width 0.25) (layer F.Cu) (net 49)) (segment (start 234.384998 101.854) (end 262.636 101.854) (width 0.25) (layer F.Cu) (net 50)) @@ -6554,7 +6565,7 @@ (segment (start 233.299 111.5565) (end 232.65 110.9075) (width 0.25) (layer F.Cu) (net 50)) (segment (start 233.299 114.808) (end 233.299 111.5565) (width 0.25) (layer F.Cu) (net 50)) (segment (start 229.77 74.3445) (end 232.5145 77.089) (width 0.25) (layer F.Cu) (net 50)) - (segment (start 229.77 73.4695) (end 229.77 74.3445) (width 0.25) (layer F.Cu) (net 50)) + (segment (start 229.77 73.4695) (end 229.77 74.3445) (width 0.25) (layer F.Cu) (net 50) (status 10)) (segment (start 232.5145 77.089) (end 259.96336 77.089) (width 0.25) (layer F.Cu) (net 50)) (segment (start 262.89 80.391) (end 262.89 81.153) (width 0.25) (layer F.Cu) (net 50)) (segment (start 262.89 81.153) (end 262.89 80.01564) (width 0.25) (layer F.Cu) (net 50)) @@ -6572,17 +6583,17 @@ (segment (start 254.875 110.9075) (end 254 110.9075) (width 0.25) (layer F.Cu) (net 51) (status 20)) (segment (start 256.032 114.3) (end 256.032 112.0645) (width 0.25) (layer F.Cu) (net 51)) (segment (start 245.2005 74.3445) (end 245.9765 75.1205) (width 0.25) (layer F.Cu) (net 51)) - (segment (start 245.2005 73.4695) (end 245.2005 74.3445) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 245.2005 73.4695) (end 245.2005 74.3445) (width 0.25) (layer F.Cu) (net 51) (status 10)) (segment (start 264.9855 79.6925) (end 264.9855 80.391) (width 0.25) (layer F.Cu) (net 51)) (segment (start 260.4135 75.1205) (end 264.9855 79.6925) (width 0.25) (layer F.Cu) (net 51)) (segment (start 245.9765 75.1205) (end 260.4135 75.1205) (width 0.25) (layer F.Cu) (net 51)) (segment (start 264.9855 80.391) (end 264.97999 80.1964) (width 0.25) (layer F.Cu) (net 51)) (segment (start 264.97999 102.4296) (end 264.9855 80.391) (width 0.25) (layer F.Cu) (net 51)) - (segment (start 224.1915 81.9925) (end 224.1915 82.8675) (width 0.25) (layer F.Cu) (net 52)) - (segment (start 223.606 81.407) (end 224.1915 81.9925) (width 0.25) (layer F.Cu) (net 52)) - (segment (start 220.4355 81.407) (end 223.606 81.407) (width 0.25) (layer F.Cu) (net 52)) - (segment (start 219.9615 81.881) (end 220.4355 81.407) (width 0.25) (layer F.Cu) (net 52)) - (segment (start 219.9615 84.0345) (end 219.9615 81.881) (width 0.25) (layer F.Cu) (net 52)) + (segment (start 224.1915 81.9925) (end 224.1915 82.8675) (width 0.25) (layer F.Cu) (net 52) (status 30)) + (segment (start 223.606 81.407) (end 224.1915 81.9925) (width 0.25) (layer F.Cu) (net 52) (status 20)) + (segment (start 220.4355 81.407) (end 223.606 81.407) (width 0.25) (layer F.Cu) (net 52) (status 10)) + (segment (start 219.9615 81.881) (end 220.4355 81.407) (width 0.25) (layer F.Cu) (net 52) (status 30)) + (segment (start 219.9615 84.0345) (end 219.9615 81.881) (width 0.25) (layer F.Cu) (net 52) (status 30)) (segment (start 263.525 101.727) (end 263.525 80.01423) (width 0.25) (layer F.Cu) (net 53)) (segment (start 238.52099 105.338008) (end 241.496998 102.362) (width 0.25) (layer F.Cu) (net 53)) (segment (start 241.496998 102.362) (end 262.89 102.362) (width 0.25) (layer F.Cu) (net 53)) @@ -6596,7 +6607,7 @@ (segment (start 239.635 110.9075) (end 238.76 110.9075) (width 0.25) (layer F.Cu) (net 53) (status 20)) (segment (start 240.792 115.062) (end 240.792 112.0645) (width 0.25) (layer F.Cu) (net 53)) (segment (start 263.525 80.01423) (end 260.02827 76.5175) (width 0.25) (layer F.Cu) (net 53)) - (segment (start 235.0405 74.3445) (end 235.0405 73.4695) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 235.0405 74.3445) (end 235.0405 73.4695) (width 0.25) (layer F.Cu) (net 53) (status 20)) (segment (start 237.2135 76.5175) (end 235.0405 74.3445) (width 0.25) (layer F.Cu) (net 53)) (segment (start 260.02827 76.5175) (end 237.2135 76.5175) (width 0.25) (layer F.Cu) (net 53)) (segment (start 261.38099 110.66849) (end 261.38099 105.338008) (width 0.25) (layer F.Cu) (net 54) (status 10)) @@ -6610,18 +6621,18 @@ (segment (start 262.495 110.9075) (end 261.62 110.9075) (width 0.25) (layer F.Cu) (net 54) (status 20)) (segment (start 263.398 111.8105) (end 262.495 110.9075) (width 0.25) (layer F.Cu) (net 54)) (segment (start 263.398 114.808) (end 263.398 111.8105) (width 0.25) (layer F.Cu) (net 54)) - (segment (start 255.424 73.4695) (end 260.4135 73.4695) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 255.424 73.4695) (end 260.4135 73.4695) (width 0.25) (layer F.Cu) (net 54) (status 10)) (segment (start 265.557 78.613) (end 265.557 80.3275) (width 0.25) (layer F.Cu) (net 54)) (segment (start 260.4135 73.4695) (end 265.557 78.613) (width 0.25) (layer F.Cu) (net 54)) (segment (start 265.43 102.616) (end 265.557 80.3275) (width 0.25) (layer F.Cu) (net 54)) (via (at 252.603 89.281) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 55)) (segment (start 252.63 89.308) (end 252.603 89.281) (width 0.25) (layer F.Cu) (net 55)) - (segment (start 252.63 91.2495) (end 252.63 89.308) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 252.63 91.2495) (end 252.63 89.308) (width 0.25) (layer F.Cu) (net 55) (status 10)) (segment (start 234.188 89.281) (end 234.061 89.154) (width 0.25) (layer B.Cu) (net 55)) (segment (start 252.603 89.281) (end 234.188 89.281) (width 0.25) (layer B.Cu) (net 55)) - (segment (start 214.1855 87.9885) (end 214.1855 87.276) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 214.1855 87.9885) (end 214.1855 87.276) (width 0.25) (layer F.Cu) (net 55) (status 20)) (segment (start 215.351 89.154) (end 214.1855 87.9885) (width 0.25) (layer F.Cu) (net 55)) - (segment (start 215.0235 75.6525) (end 214.3735 75.6525) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 215.0235 75.6525) (end 214.3735 75.6525) (width 0.25) (layer F.Cu) (net 55) (status 20)) (via (at 215.351 89.154) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 55)) (segment (start 234.061 89.154) (end 215.351 89.154) (width 0.25) (layer B.Cu) (net 55)) (segment (start 215.351 76.5458) (end 215.6339 76.2629) (width 0.25) (layer B.Cu) (net 55)) @@ -6629,7 +6640,7 @@ (segment (start 215.6339 76.2629) (end 215.0235 75.6525) (width 0.25) (layer F.Cu) (net 55)) (segment (start 215.75801 76.38701) (end 215.6339 76.2629) (width 0.25) (layer F.Cu) (net 55)) (segment (start 215.0605 87.276) (end 216.3572 85.9793) (width 0.25) (layer F.Cu) (net 55)) - (segment (start 214.1855 87.276) (end 215.0605 87.276) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 214.1855 87.276) (end 215.0605 87.276) (width 0.25) (layer F.Cu) (net 55) (status 10)) (via (at 216.3064 84.6328) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 55)) (segment (start 216.3572 84.6836) (end 216.3064 84.6328) (width 0.25) (layer F.Cu) (net 55)) (segment (start 216.3572 85.9793) (end 216.3572 84.6836) (width 0.25) (layer F.Cu) (net 55)) @@ -6637,14 +6648,14 @@ (segment (start 216.3064 84.6328) (end 216.3064 76.9354) (width 0.25) (layer B.Cu) (net 55)) (segment (start 208.214 103.2805) (end 208.7515 102.743) (width 0.25) (layer F.Cu) (net 56) (status 30)) (segment (start 208.214 105.688) (end 208.214 103.2805) (width 0.25) (layer F.Cu) (net 56) (status 30)) - (segment (start 250.75 72.723) (end 250.798 72.771) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 250.75 72.723) (end 250.798 72.771) (width 0.25) (layer F.Cu) (net 56) (status 30)) (via (at 253.5555 79.47999) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 56)) (via (at 250.1265 71.5645) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 56)) (segment (start 253.5555 74.9935) (end 250.1265 71.5645) (width 0.25) (layer B.Cu) (net 56)) (segment (start 253.5555 79.47999) (end 253.5555 74.9935) (width 0.25) (layer B.Cu) (net 56)) - (segment (start 250.1265 73.3155) (end 250.2805 73.4695) (width 0.25) (layer F.Cu) (net 56)) - (segment (start 250.1265 71.5645) (end 250.1265 73.3155) (width 0.25) (layer F.Cu) (net 56)) - (segment (start 214.21398 105.688) (end 208.214 105.688) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 250.1265 73.3155) (end 250.2805 73.4695) (width 0.25) (layer F.Cu) (net 56) (status 30)) + (segment (start 250.1265 71.5645) (end 250.1265 73.3155) (width 0.25) (layer F.Cu) (net 56) (status 20)) + (segment (start 214.21398 105.688) (end 208.214 105.688) (width 0.25) (layer F.Cu) (net 56) (status 20)) (segment (start 219.51399 100.38799) (end 214.21398 105.688) (width 0.25) (layer F.Cu) (net 56)) (segment (start 261.1796 100.38799) (end 219.51399 100.38799) (width 0.25) (layer F.Cu) (net 56)) (segment (start 261.35498 100.21261) (end 261.1796 100.38799) (width 0.25) (layer F.Cu) (net 56)) @@ -6655,45 +6666,45 @@ (segment (start 212.317499 92.419001) (end 204.597 100.1395) (width 0.25) (layer F.Cu) (net 57)) (segment (start 224.341499 92.419001) (end 212.317499 92.419001) (width 0.25) (layer F.Cu) (net 57)) (segment (start 224.636 92.1245) (end 224.341499 92.419001) (width 0.25) (layer F.Cu) (net 57)) - (segment (start 224.636 91.2495) (end 224.636 92.1245) (width 0.25) (layer F.Cu) (net 57)) - (segment (start 176.02 114.26) (end 175.895 114.26) (width 0.25) (layer B.Cu) (net 57)) - (segment (start 177.19501 113.08499) (end 176.02 114.26) (width 0.25) (layer B.Cu) (net 57)) + (segment (start 224.636 91.2495) (end 224.636 92.1245) (width 0.25) (layer F.Cu) (net 57) (status 10)) + (segment (start 176.02 114.26) (end 175.895 114.26) (width 0.25) (layer B.Cu) (net 57) (status 30)) + (segment (start 177.19501 113.08499) (end 176.02 114.26) (width 0.25) (layer B.Cu) (net 57) (status 20)) (segment (start 180.566007 106.142991) (end 177.19501 109.513988) (width 0.25) (layer B.Cu) (net 57)) (segment (start 198.593509 106.142991) (end 180.566007 106.142991) (width 0.25) (layer B.Cu) (net 57)) (segment (start 177.19501 109.513988) (end 177.19501 113.08499) (width 0.25) (layer B.Cu) (net 57)) (segment (start 204.597 100.1395) (end 198.593509 106.142991) (width 0.25) (layer B.Cu) (net 57)) - (segment (start 220.558 73.406) (end 217.891 70.739) (width 0.25) (layer F.Cu) (net 58)) - (segment (start 221.2705 73.406) (end 220.558 73.406) (width 0.25) (layer F.Cu) (net 58)) - (segment (start 217.891 70.011) (end 217.73 69.85) (width 0.25) (layer F.Cu) (net 58)) - (segment (start 217.891 70.739) (end 217.891 70.011) (width 0.25) (layer F.Cu) (net 58)) - (segment (start 226.795 71.295) (end 226.795 73.4695) (width 0.25) (layer F.Cu) (net 60)) - (segment (start 225.35 69.85) (end 226.795 71.295) (width 0.25) (layer F.Cu) (net 60)) - (segment (start 190.455 114.26) (end 189.23 114.26) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 220.558 73.406) (end 217.891 70.739) (width 0.25) (layer F.Cu) (net 58) (status 10)) + (segment (start 221.2705 73.406) (end 220.558 73.406) (width 0.25) (layer F.Cu) (net 58) (status 30)) + (segment (start 217.891 70.011) (end 217.73 69.85) (width 0.25) (layer F.Cu) (net 58) (status 30)) + (segment (start 217.891 70.739) (end 217.891 70.011) (width 0.25) (layer F.Cu) (net 58) (status 20)) + (segment (start 226.795 71.295) (end 226.795 73.4695) (width 0.25) (layer F.Cu) (net 60) (status 20)) + (segment (start 225.35 69.85) (end 226.795 71.295) (width 0.25) (layer F.Cu) (net 60) (status 10)) + (segment (start 190.455 114.26) (end 189.23 114.26) (width 0.25) (layer F.Cu) (net 61) (status 20)) (segment (start 190.7905 114.5955) (end 190.455 114.26) (width 0.25) (layer F.Cu) (net 61)) - (segment (start 190.7905 121.031) (end 190.7905 114.5955) (width 0.25) (layer F.Cu) (net 61)) - (segment (start 230.43 71.834) (end 232.0655 73.4695) (width 0.25) (layer F.Cu) (net 62)) - (segment (start 230.43 69.85) (end 230.43 71.834) (width 0.25) (layer F.Cu) (net 62)) - (segment (start 233.749999 70.629999) (end 232.97 69.85) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 190.7905 121.031) (end 190.7905 114.5955) (width 0.25) (layer F.Cu) (net 61) (status 10)) + (segment (start 230.43 71.834) (end 232.0655 73.4695) (width 0.25) (layer F.Cu) (net 62) (status 20)) + (segment (start 230.43 69.85) (end 230.43 71.834) (width 0.25) (layer F.Cu) (net 62) (status 10)) + (segment (start 233.749999 70.629999) (end 232.97 69.85) (width 0.25) (layer F.Cu) (net 64) (status 20)) (segment (start 234.305999 70.629999) (end 233.749999 70.629999) (width 0.25) (layer F.Cu) (net 64)) - (segment (start 237.1455 73.4695) (end 234.305999 70.629999) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 237.1455 73.4695) (end 234.305999 70.629999) (width 0.25) (layer F.Cu) (net 64) (status 10)) (segment (start 235.930914 71.374) (end 235.51 70.953086) (width 0.25) (layer F.Cu) (net 66)) (segment (start 241.005 71.374) (end 235.930914 71.374) (width 0.25) (layer F.Cu) (net 66)) - (segment (start 242.2255 72.5945) (end 241.005 71.374) (width 0.25) (layer F.Cu) (net 66)) - (segment (start 235.51 70.953086) (end 235.51 69.85) (width 0.25) (layer F.Cu) (net 66)) - (segment (start 242.2255 73.4695) (end 242.2255 72.5945) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 242.2255 72.5945) (end 241.005 71.374) (width 0.25) (layer F.Cu) (net 66) (status 10)) + (segment (start 235.51 70.953086) (end 235.51 69.85) (width 0.25) (layer F.Cu) (net 66) (status 20)) + (segment (start 242.2255 73.4695) (end 242.2255 72.5945) (width 0.25) (layer F.Cu) (net 66) (status 30)) (segment (start 251.529999 70.629999) (end 251.529999 71.888499) (width 0.25) (layer F.Cu) (net 68)) - (segment (start 250.75 69.85) (end 251.529999 70.629999) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 250.75 69.85) (end 251.529999 70.629999) (width 0.25) (layer F.Cu) (net 68) (status 10)) (segment (start 251.529999 71.888499) (end 252.1585 72.517) (width 0.25) (layer F.Cu) (net 68)) - (segment (start 252.449 72.5945) (end 252.449 73.4695) (width 0.25) (layer F.Cu) (net 68)) - (segment (start 252.3715 72.517) (end 252.449 72.5945) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 252.449 72.5945) (end 252.449 73.4695) (width 0.25) (layer F.Cu) (net 68) (status 30)) + (segment (start 252.3715 72.517) (end 252.449 72.5945) (width 0.25) (layer F.Cu) (net 68) (status 20)) (segment (start 252.1585 72.517) (end 252.3715 72.517) (width 0.25) (layer F.Cu) (net 68)) - (segment (start 249.655 93.805) (end 248.21 95.25) (width 0.25) (layer F.Cu) (net 70)) - (segment (start 249.655 91.2495) (end 249.655 93.805) (width 0.25) (layer F.Cu) (net 70)) + (segment (start 249.655 93.805) (end 248.21 95.25) (width 0.25) (layer F.Cu) (net 70) (status 20)) + (segment (start 249.655 91.2495) (end 249.655 93.805) (width 0.25) (layer F.Cu) (net 70) (status 10)) (segment (start 241.369999 70.629999) (end 241.369999 70.745499) (width 0.25) (layer F.Cu) (net 71)) - (segment (start 240.59 69.85) (end 241.369999 70.629999) (width 0.25) (layer F.Cu) (net 71)) + (segment (start 240.59 69.85) (end 241.369999 70.629999) (width 0.25) (layer F.Cu) (net 71) (status 10)) (segment (start 241.369999 70.745499) (end 242.062 71.4375) (width 0.25) (layer F.Cu) (net 71)) (segment (start 242.062 71.4375) (end 246.38 71.4375) (width 0.25) (layer F.Cu) (net 71)) - (segment (start 247.3055 72.363) (end 247.3055 73.4695) (width 0.25) (layer F.Cu) (net 71)) + (segment (start 247.3055 72.363) (end 247.3055 73.4695) (width 0.25) (layer F.Cu) (net 71) (status 20)) (segment (start 246.38 71.4375) (end 247.3055 72.363) (width 0.25) (layer F.Cu) (net 71)) (zone (net 7) (net_name GND) (layer F.Cu) (tstamp 5F63ABA9) (hatch edge 0.508) From fcaca7435fe567f887db051800d8c5865ca415d0 Mon Sep 17 00:00:00 2001 From: Empire Date: Sat, 31 Oct 2020 03:51:35 +0100 Subject: [PATCH 02/31] make shit work more --- esp32/src/DS18B20.cpp | 22 ++++-------------- esp32/src/main.cpp | 54 ++++++++++++++++--------------------------- 2 files changed, 24 insertions(+), 52 deletions(-) diff --git a/esp32/src/DS18B20.cpp b/esp32/src/DS18B20.cpp index dbe8814..73c52cf 100644 --- a/esp32/src/DS18B20.cpp +++ b/esp32/src/DS18B20.cpp @@ -36,21 +36,15 @@ int Ds18B20::readAllTemperatures(float* pTemperatures, int maxTemperatures) { byte addr[8]; uint8_t scratchPad[SCRATCHPADSIZE]; int currentTemp = 0; -#ifdef DS_DEBUG - int i; -#endif while (this->mDs->search(addr)) { -#ifdef DS_DEBUG - Serial.print(" ROM ="); - for (i = 0; i < 8; i++) { - Serial.write(' '); - Serial.print(addr[i], HEX); - } -#endif this->mDs->reset(); this->mDs->select(addr); this->mDs->write(STARTCONV); + } + delay(750); + + while (this->mDs->search(addr)) { this->mDs->reset(); this->mDs->select(addr); this->mDs->write(READSCRATCH); @@ -68,14 +62,6 @@ int Ds18B20::readAllTemperatures(float* pTemperatures, int maxTemperatures) { // byte 7: DS18S20: COUNT_PER_C // DS18B20 & DS1822: store for crc // byte 8: SCRATCHPAD_CRC -#ifdef DS_DEBUG - Serial.write("\r\nDATA:"); - for (uint8_t i = 0; i < 9; i++) { - Serial.print(scratchPad[i], HEX); - } -#else - delay(50); -#endif for (uint8_t i = 0; i < 9; i++) { scratchPad[i] = this->mDs->read(); } diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index d7c828f..cb17175 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -51,8 +51,8 @@ RTC_DATA_ATTR long lastWaterValue = 0; const char* ntpServer = "pool.ntp.org"; bool warmBoot = true; -bool mode3Active = false; /**< Controller must not sleep */ -bool mDeepsleep = false; +bool volatile mode3Active = false; /**< Controller must not sleep */ +bool volatile mDeepsleep = false; int plantSensor1 = 0; @@ -121,7 +121,9 @@ bool prepareSleep(void *) { } void espDeepSleepFor(long seconds, bool activatePump = false){ - delay(1500); + if(mode3Active){ + return; + } esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF); @@ -147,7 +149,8 @@ void espDeepSleepFor(long seconds, bool activatePump = false){ Serial.print(seconds); Serial.println(" seconds"); esp_sleep_enable_timer_wakeup( (seconds * 1000U * 1000U) ); - wait4sleep.in(500, prepareSleep); + //wait4sleep.in(500, prepareSleep); + mDeepsleep=true; } @@ -183,27 +186,16 @@ void mode2MQTT(){ sensorSolar.setProperty("percent").send(String((100 * solarRawSensor.getAverage() ) / 4095)); sensorSolar.setProperty("volt").send( String(getSolarVoltage()) ); - float temp[2] = { TEMP_INIT_VALUE, TEMP_INIT_VALUE }; - float* pFloat = temp; - int devices = dallas.readAllTemperatures(pFloat, 2); - if (devices < 2) { - if ((pFloat[0] > TEMP_INIT_VALUE) && (pFloat[0] < TEMP_MAX_VALUE) ) { - sensorTemp.setProperty("control").send( String(pFloat[0])); - } - } else if (devices >= 2) { - if ((pFloat[0] > TEMP_INIT_VALUE) && (pFloat[0] < TEMP_MAX_VALUE) ) { - sensorTemp.setProperty("temp").send( String(pFloat[0])); - } - if ((pFloat[1] > TEMP_INIT_VALUE) && (pFloat[1] < TEMP_MAX_VALUE) ) { - sensorTemp.setProperty("control").send( String(pFloat[1])); - } - } + float t1 = temp1.getMedian(); + float t2 = temp2.getMedian(); + sensorTemp.setProperty("control").send( String(t1)); + sensorTemp.setProperty("temp").send( String(t2)); - bool lipoTempWarning = abs(temp[0] - temp[1]) > 5; + bool lipoTempWarning = t1!=85 && t2!=85 && abs(t1 - t2) > 10; if(lipoTempWarning){ - Serial.println("Lipo temp incorrect, panic mode deepsleep"); - espDeepSleepFor(PANIK_MODE_DEEPSLEEP); - return; + Serial.println("Lipo temp incorrect, panic mode deepsleep TODO"); + //espDeepSleepFor(PANIK_MODE_DEEPSLEEP); + //return; } bool hasWater = true;//FIXMEmWaterGone > waterLevelMin.get(); @@ -339,18 +331,12 @@ void readSensors() { /* Required to read the temperature once */ float temp[2] = {0, 0}; float* pFloat = temp; - for(int i=0; i < 10; i++) { - // first read returns crap, ignore result and read twice - if (dallas.readAllTemperatures(pFloat, 2) > 0) { - Serial << "t1: " << String(temp[0]) << endl; - Serial << "t2: " << String(temp[1]) << endl; - } - delay(200); - if (i <= 2) { - temp1.add(temp[0]); - temp2.add(temp[1]); - } + if (dallas.readAllTemperatures(pFloat, 2) > 0) { + Serial << "t1: " << String(temp[0]) << endl; + Serial << "t2: " << String(temp[1]) << endl; } + temp1.add(temp[0]); + temp2.add(temp[1]); /* Use the Ultrasonic sensor to measure waterLevel */ From 8a2f320b1a10a4f9112b4b93f83a9de741d6e750 Mon Sep 17 00:00:00 2001 From: Ollo Date: Sat, 31 Oct 2020 12:44:25 +0100 Subject: [PATCH 03/31] Adapt time comment --- esp32/include/ControllerConfiguration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp32/include/ControllerConfiguration.h b/esp32/include/ControllerConfiguration.h index 7cb273b..e06c6b9 100644 --- a/esp32/include/ControllerConfiguration.h +++ b/esp32/include/ControllerConfiguration.h @@ -11,7 +11,7 @@ #ifndef CONTROLLER_CONFIG_H #define CONTROLLER_CONFIG_H -#define FIRMWARE_VERSION "1.0.6" +#define FIRMWARE_VERSION "1.0.7" #define ADC_TO_VOLT(adc) ((adc) * 3.3 ) / 4095) #define ADC_TO_VOLT_WITH_MULTI(adc, multi) (((adc) * 3.3 * (multi)) / 4095) From 979baf5ff9e2e141a0f62b9c5d3b2c85e390f77a Mon Sep 17 00:00:00 2001 From: Ollo Date: Sat, 31 Oct 2020 12:44:32 +0100 Subject: [PATCH 04/31] Adapt time comment --- esp32/include/HomieConfiguration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esp32/include/HomieConfiguration.h b/esp32/include/HomieConfiguration.h index 9146754..8351c0c 100644 --- a/esp32/include/HomieConfiguration.h +++ b/esp32/include/HomieConfiguration.h @@ -37,8 +37,8 @@ HomieNode stayAlive("stay", "alive", "alive"); /** *********************************** Settings ******************************* */ -HomieSetting deepSleepTime("deepsleep", "time in milliseconds to sleep (0 deactivats it)"); -HomieSetting deepSleepNightTime("nightsleep", "time in milliseconds to sleep (0 uses same setting: deepsleep at night, too)"); +HomieSetting deepSleepTime("deepsleep", "time in seconds to sleep (0 deactivats it)"); +HomieSetting deepSleepNightTime("nightsleep", "time in seconds to sleep (0 uses same setting: deepsleep at night, too)"); HomieSetting wateringDeepSleep("pumpdeepsleep", "time seconds to sleep, while a pump is running"); HomieSetting waterLevelMax("watermaxlevel", "distance (mm) at maximum water level"); From 5b420ab90436c213d665b38e08af70c736f70b56 Mon Sep 17 00:00:00 2001 From: Ollo Date: Sat, 31 Oct 2020 12:44:49 +0100 Subject: [PATCH 05/31] Adapt time comment --- esp32/src/main.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index cb17175..392e04e 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -453,8 +453,8 @@ void systemInit(){ // Set default values //in seconds - deepSleepTime.setDefaultValue(10); - deepSleepNightTime.setDefaultValue(30); + deepSleepTime.setDefaultValue(60); + deepSleepNightTime.setDefaultValue(600); wateringDeepSleep.setDefaultValue(5); /* waterLevelMax 1000 */ /* 100cm in mm */ @@ -504,12 +504,9 @@ void systemInit(){ bool mode1(){ - Serial.println("m1"); + Serial.println("==== Mode 1 ===="); Serial << getCurrentTime() << " curtime" << endl; - /* Disable all sleeping stuff before reading sensors */ - gpio_deep_sleep_hold_dis(); - readSensors(); //queue sensor values for @@ -571,7 +568,7 @@ bool mode1(){ } void mode2(){ - Serial.println("m2"); + Serial.println("==== Mode 2 ===="); systemInit(); /* Jump into Mode 3, if not configured */ From 83c26cc07c426ea89e4df3dd01ba23a31bd872e6 Mon Sep 17 00:00:00 2001 From: Empire Date: Sat, 31 Oct 2020 19:24:44 +0100 Subject: [PATCH 06/31] *cough* --- esp32/include/PlantCtrl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp32/include/PlantCtrl.h b/esp32/include/PlantCtrl.h index 57275f8..f1f8749 100644 --- a/esp32/include/PlantCtrl.h +++ b/esp32/include/PlantCtrl.h @@ -22,10 +22,10 @@ private: HomieNode* mPlant = NULL; int mPinSensor=0; /**< Pin of the moist sensor */ int mPinPump=0; /**< Pin of the pump */ - PlantSettings_t* mSetting; bool mConnected = false; public: + PlantSettings_t* mSetting; /** * @brief Construct a new Plant object * From f8658b78fd2a90f90a473e13505b384b9edb9483 Mon Sep 17 00:00:00 2001 From: Empire Date: Sat, 31 Oct 2020 19:25:13 +0100 Subject: [PATCH 07/31] made deep sleep modes work and behave somewhat correctly, gave mqqt time to publish, gave ntp time to sync --- esp32/src/main.cpp | 158 +++++++++++++++++++++++++-------------------- 1 file changed, 87 insertions(+), 71 deletions(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index cb17175..699f959 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -26,6 +26,7 @@ const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minut #define SOLAR4SENSORS 6.0f #define TEMP_INIT_VALUE -999.0f #define TEMP_MAX_VALUE 85.0f +#define HalfHour 60 /********************* non volatile enable after deepsleep *******************************/ @@ -93,6 +94,30 @@ float getSolarVoltage(){ return SOLAR_VOLT(solarRawSensor.getAverage()); } +void setMoistureTrigger(int plantId, long value){ + if(plantId == 0){ + rtcMoistureTrigger0 = value; + } + if(plantId == 1){ + rtcMoistureTrigger1 = value; + } + if(plantId == 2){ + rtcMoistureTrigger2 = value; + } + if(plantId == 3){ + rtcMoistureTrigger3 = value; + } + if(plantId == 4){ + rtcMoistureTrigger4 = value; + } + if(plantId == 5){ + rtcMoistureTrigger5 = value; + } + if(plantId == 6){ + rtcMoistureTrigger6 = value; + } +} + void readSystemSensors() { lipoRawSensor.add(analogRead(SENSOR_LIPO)); solarRawSensor.add(analogRead(SENSOR_SOLAR)); @@ -108,32 +133,30 @@ long getCurrentTime(){ return tv_now.tv_sec; } -//wait till homie flushed mqtt ect. -bool prepareSleep(void *) { - //FIXME wait till pending mqtt is done, then start sleep via event or whatever - //Homie.disableResetTrigger(); - - bool queueIsEmpty = true; - if(queueIsEmpty){ - mDeepsleep = true; - } - return false; // repeat? true there is something in the queue to be done -} - void espDeepSleepFor(long seconds, bool activatePump = false){ if(mode3Active){ + Serial << "abort deepsleep, mode3Active" << endl; return; } + for(int i = 0;i<10;i++){ + long cTime = getCurrentTime(); + if(cTime < 100000){ + Serial << "Wait for ntp" << endl; + delay(100); + } else { + break; + } + } + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL,ESP_PD_OPTION_ON); + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON); if (activatePump) { - esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON); gpio_deep_sleep_hold_en(); gpio_hold_en(GPIO_NUM_13); //pump pwr } else { - esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF); gpio_hold_dis(GPIO_NUM_13); //pump pwr gpio_deep_sleep_hold_dis(); digitalWrite(OUTPUT_PUMP, LOW); @@ -145,11 +168,10 @@ void espDeepSleepFor(long seconds, bool activatePump = false){ //FIXME fix for outher outputs - Serial.print("Going to sleep for "); + Serial.print("Trying to sleep for "); Serial.print(seconds); Serial.println(" seconds"); esp_sleep_enable_timer_wakeup( (seconds * 1000U * 1000U) ); - //wait4sleep.in(500, prepareSleep); mDeepsleep=true; } @@ -166,7 +188,7 @@ void mode2MQTT(){ } if (deepSleepTime.get()) { - Serial << "sleeping for " << deepSleepTime.get() << endl; + Serial << "deepsleep time is configured to " << deepSleepTime.get() << endl; } /* Publish default values */ @@ -191,6 +213,9 @@ void mode2MQTT(){ sensorTemp.setProperty("control").send( String(t1)); sensorTemp.setProperty("temp").send( String(t2)); + //give mqtt time, use via publish callback instead? + delay(100); + bool lipoTempWarning = t1!=85 && t2!=85 && abs(t1 - t2) > 10; if(lipoTempWarning){ Serial.println("Lipo temp incorrect, panic mode deepsleep TODO"); @@ -198,6 +223,11 @@ void mode2MQTT(){ //return; } + for(int i=0; i < MAX_PLANTS; i++) { + setMoistureTrigger(i, mPlants[i].mSetting->pSensorDry->get()); + } + + bool hasWater = true;//FIXMEmWaterGone > waterLevelMin.get(); //FIXME no water warning message lastPumpRunning = determineNextPump(); @@ -214,10 +244,12 @@ void mode2MQTT(){ gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepNightTime.get(); Serial.println("No pumps to activate and low light, deepSleepNight"); espDeepSleepFor(deepSleepNightTime.get()); + rtcDeepSleepTime = deepSleepNightTime.get(); }else { gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepTime.get(); Serial.println("No pumps to activate, deepSleep"); espDeepSleepFor(deepSleepTime.get()); + rtcDeepSleepTime = deepSleepTime.get(); } }else { @@ -228,30 +260,33 @@ void mode2MQTT(){ } -void setMoistureTrigger(int plantId, long value){ +long getMoistureTrigger(int plantId){ if(plantId == 0){ - rtcMoistureTrigger0 = value; + return rtcMoistureTrigger0; } if(plantId == 1){ - rtcMoistureTrigger1 = value; + return rtcMoistureTrigger1; } if(plantId == 2){ - rtcMoistureTrigger2 = value; + return rtcMoistureTrigger2; } if(plantId == 3){ - rtcMoistureTrigger3 = value; + return rtcMoistureTrigger3; } if(plantId == 4){ - rtcMoistureTrigger4 = value; + return rtcMoistureTrigger4; } if(plantId == 5){ - rtcMoistureTrigger5 = value; + return rtcMoistureTrigger5; } if(plantId == 6){ - rtcMoistureTrigger6 = value; + return rtcMoistureTrigger6; } + return -1; } + + void setLastActivationForPump(int plantId, long value){ if(plantId == 0){ rtcLastActive0 = value; @@ -361,7 +396,7 @@ void onHomieEvent(const HomieEvent& event) { case HomieEventType::MQTT_READY: //wait for rtc sync? rtcDeepSleepTime = deepSleepTime.get(); - Serial << "MQTT ready " << rtcDeepSleepTime << " ms ds" << endl; + Serial << "MQTT ready " << endl; for(int i=0; i < MAX_PLANTS; i++) { mPlants[i].postMQTTconnection(); } @@ -464,6 +499,7 @@ void systemInit(){ Homie.setLoopFunction(homieLoop); Homie.onEvent(onHomieEvent); + //Homie.disableLogging(); Homie.setup(); mConfigured = Homie.isConfigured(); @@ -513,48 +549,25 @@ bool mode1(){ readSensors(); //queue sensor values for - if ((rtcDeepSleepTime == 0) || - (rtcMoistureTrigger0 == 0) || - (rtcMoistureTrigger1 == 0) || - (rtcMoistureTrigger2 == 0) || - (rtcMoistureTrigger3 == 0) || - (rtcMoistureTrigger4 == 0) || - (rtcMoistureTrigger5 == 0) || - (rtcMoistureTrigger6 == 0) - ) - { - Serial.println("RTCm2"); + if (rtcDeepSleepTime == 0){ + Serial.println("1 missing rtc value, going to mode2"); + return true; + } + for(int i = 0;i<6;i++){ + long trigger =getMoistureTrigger(i); + if(trigger == 0){ + Serial << "Missing rtc trigger " << i << endl; return true; + } + if(trigger == DEACTIVATED_PLANT){ + continue; + } + if(mPlants[0].getSensorValue() <= trigger){ + Serial << "plant dry starting mode 2" << i << endl; + return true; + } } - - if ((rtcMoistureTrigger0 != DEACTIVATED_PLANT) && (mPlants[0].getSensorValue() < rtcMoistureTrigger0) ) { - Serial.println("mt0"); - return true; - } - if ((rtcMoistureTrigger1 != DEACTIVATED_PLANT) && (mPlants[1].getSensorValue() < rtcMoistureTrigger1) ) { - Serial.println("mt1"); - return true; - } - if ((rtcMoistureTrigger2 != DEACTIVATED_PLANT) && (mPlants[2].getSensorValue() < rtcMoistureTrigger2) ) { - Serial.println("mt2"); - return true; - } - if ((rtcMoistureTrigger3 != DEACTIVATED_PLANT) && (mPlants[3].getSensorValue() < rtcMoistureTrigger3) ) { - Serial.println("mt3"); - return true; - } - if ((rtcMoistureTrigger4 != DEACTIVATED_PLANT) && (mPlants[4].getSensorValue() < rtcMoistureTrigger4) ) { - Serial.println("mt4"); - return true; - } - if ((rtcMoistureTrigger5 != DEACTIVATED_PLANT) && (mPlants[5].getSensorValue() < rtcMoistureTrigger5) ) { - Serial.println("mt5"); - return true; - } - if ((rtcMoistureTrigger6 != DEACTIVATED_PLANT) && (mPlants[6].getSensorValue() < rtcMoistureTrigger6) ) { - Serial.println("mt6"); - return true; - } + //check how long it was already in mode1 if to long goto mode2 long cTime = getCurrentTime(); @@ -566,6 +579,8 @@ bool mode1(){ if(gotoMode2AfterThisTimestamp < cTime){ Serial.println("Starting mode 2 after specified mode1 time"); return true; + } else { + Serial << "Mode2 Timer " << gotoMode2AfterThisTimestamp << " curtime " << cTime << endl; } return false; } @@ -629,8 +644,7 @@ void setup() { mode2(); } else { Serial.println("nop"); - Serial.flush(); - esp_deep_sleep_start(); + espDeepSleepFor(rtcDeepSleepTime); } } @@ -640,15 +654,17 @@ void setup() { */ void loop() { - if (!mDeepsleep) { + if (!mDeepsleep || mode3Active) { Homie.loop(); } else { + Serial << "Bye" << endl; + Serial.flush(); esp_deep_sleep_start(); } if(millis() > 30000 && !mode3Active){ - Serial << (millis()/ 1000) << "s alive" << endl; + Serial << (millis()/ 1000) << "not terminated watchdog putting to sleep" << endl; Serial.flush(); - esp_deep_sleep_start(); + espDeepSleepFor(rtcDeepSleepTime); } } From 6ba2f92fa73e8b007c397f57cc292e565f40a62e Mon Sep 17 00:00:00 2001 From: Ollo Date: Sun, 1 Nov 2020 13:26:38 +0100 Subject: [PATCH 08/31] Fixed plant loop in mode1 --- esp32/src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 6c803b6..1168e4d 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -550,16 +550,16 @@ bool mode1(){ Serial.println("1 missing rtc value, going to mode2"); return true; } - for(int i = 0;i<6;i++){ + for(int i = 0; i < MAX_PLANTS; i++){ long trigger =getMoistureTrigger(i); - if(trigger == 0){ + if (trigger == 0) { Serial << "Missing rtc trigger " << i << endl; return true; } if(trigger == DEACTIVATED_PLANT){ continue; } - if(mPlants[0].getSensorValue() <= trigger){ + if(mPlants[i].getSensorValue() <= trigger){ Serial << "plant dry starting mode 2" << i << endl; return true; } From e0942212983e61b6fb9a09b3a421c3227d7ec871 Mon Sep 17 00:00:00 2001 From: Ollo Date: Sun, 1 Nov 2020 14:30:26 +0100 Subject: [PATCH 09/31] Publish only temperatur values, if a sensor was found --- esp32/src/main.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 1168e4d..44285b7 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -26,7 +26,7 @@ const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minut #define SOLAR4SENSORS 6.0f #define TEMP_INIT_VALUE -999.0f #define TEMP_MAX_VALUE 85.0f -#define HalfHour 60 +#define HalfHour 60 /********************* non volatile enable after deepsleep *******************************/ @@ -208,10 +208,15 @@ void mode2MQTT(){ sensorSolar.setProperty("percent").send(String((100 * solarRawSensor.getAverage() ) / 4095)); sensorSolar.setProperty("volt").send( String(getSolarVoltage()) ); + float t1 = temp1.getMedian(); + if (t1 != NAN) { + sensorTemp.setProperty("control").send( String(t1)); + } float t2 = temp2.getMedian(); - sensorTemp.setProperty("control").send( String(t1)); - sensorTemp.setProperty("temp").send( String(t2)); + if (t2 != NAN) { + sensorTemp.setProperty("temp").send( String(t2)); + } //give mqtt time, use via publish callback instead? delay(100); @@ -364,14 +369,18 @@ void readSensors() { /* Required to read the temperature once */ - float temp[2] = {0, 0}; + float temp[2] = {TEMP_MAX_VALUE, TEMP_MAX_VALUE}; float* pFloat = temp; - if (dallas.readAllTemperatures(pFloat, 2) > 0) { + int sensors = dallas.readAllTemperatures(pFloat, 2); + if (sensors > 0) { Serial << "t1: " << String(temp[0]) << endl; - Serial << "t2: " << String(temp[1]) << endl; + temp1.add(temp[0]); } - temp1.add(temp[0]); - temp2.add(temp[1]); + if (sensors > 1) { + Serial << "t2: " << String(temp[1]) << endl; + temp2.add(temp[1]); + } + /* Use the Ultrasonic sensor to measure waterLevel */ @@ -408,8 +417,9 @@ void onHomieEvent(const HomieEvent& event) { esp_deep_sleep_start(); break; case HomieEventType::OTA_STARTED: + Homie.getLogger() << "OTA started" << endl; digitalWrite(OUTPUT_SENSOR, HIGH); - digitalWrite(OUTPUT_PUMP, LOW); + digitalWrite(OUTPUT_PUMP, HIGH); gpio_hold_dis(GPIO_NUM_13); //pump pwr gpio_deep_sleep_hold_dis(); for (int i=0; i < MAX_PLANTS; i++) { @@ -418,6 +428,7 @@ void onHomieEvent(const HomieEvent& event) { mode3Active=true; break; case HomieEventType::OTA_SUCCESSFUL: + Homie.getLogger() << "OTA successfull" << endl; digitalWrite(OUTPUT_SENSOR, LOW); digitalWrite(OUTPUT_PUMP, LOW); ESP.restart(); @@ -588,7 +599,7 @@ void mode2(){ /* Jump into Mode 3, if not configured */ if (!mConfigured) { - Serial.println("m3"); + Serial.println("==== Mode 3 ===="); mode3Active = true; } } From b85b2e695259f5ce7ce8543042ce6daad903bb97 Mon Sep 17 00:00:00 2001 From: Ollo Date: Sun, 1 Nov 2020 15:44:49 +0100 Subject: [PATCH 10/31] All parts layouted --- board/PlantCtrlESP32.kicad_pcb | 881 +++++++++++++++++++-------------- 1 file changed, 503 insertions(+), 378 deletions(-) diff --git a/board/PlantCtrlESP32.kicad_pcb b/board/PlantCtrlESP32.kicad_pcb index f9403fd..dba6bef 100644 --- a/board/PlantCtrlESP32.kicad_pcb +++ b/board/PlantCtrlESP32.kicad_pcb @@ -3,7 +3,7 @@ (general (thickness 1.6) (drawings 11) - (tracks 1011) + (tracks 1136) (zones 0) (modules 134) (nets 72) @@ -274,6 +274,42 @@ (uvia_drill 0.1) ) + (module Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder (layer F.Cu) (tedit 5F68FEEF) (tstamp 5F939315) + (at 191.77 103.6828) + (descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator") + (tags "capacitor handsolder") + (path /5F9A17B3) + (attr smd) + (fp_text reference C3 (at 0 -1.68) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 100n (at 0 1.68) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1 0.625) (end -1 -0.625) (layer F.Fab) (width 0.1)) + (fp_line (start -1 -0.625) (end 1 -0.625) (layer F.Fab) (width 0.1)) + (fp_line (start 1 -0.625) (end 1 0.625) (layer F.Fab) (width 0.1)) + (fp_line (start 1 0.625) (end -1 0.625) (layer F.Fab) (width 0.1)) + (fp_line (start -0.261252 -0.735) (end 0.261252 -0.735) (layer F.SilkS) (width 0.12)) + (fp_line (start -0.261252 0.735) (end 0.261252 0.735) (layer F.SilkS) (width 0.12)) + (fp_line (start -1.88 0.98) (end -1.88 -0.98) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.88 -0.98) (end 1.88 -0.98) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.88 -0.98) (end 1.88 0.98) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.88 0.98) (end -1.88 0.98) (layer F.CrtYd) (width 0.05)) + (fp_text user %R (at 0 0) (layer F.Fab) + (effects (font (size 0.5 0.5) (thickness 0.08))) + ) + (pad 1 smd roundrect (at -1.0375 0) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) + (net 7 GND)) + (pad 2 smd roundrect (at 1.0375 0) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) + (net 40 PLANT0_MOIST)) + (model ${KISYS3DMOD}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + (module LED_SMD:LED_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B4B45C9) (tstamp 5F6010DC) (at 219.71 112.395 90) (descr "LED SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") @@ -668,7 +704,7 @@ ) ) - (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F624E68) + (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9EECD1) (at 212.217 112.0775) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") @@ -705,7 +741,7 @@ ) (module Resistor_SMD:R_0612_1632Metric (layer F.Cu) (tedit 5B301BBD) (tstamp 5F624E57) - (at 198.628 114.554) + (at 198.9328 110.5916) (descr "Resistor SMD 0612 (1632 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: https://www.vishay.com/docs/20019/rcwe.pdf), generated with kicad-footprint-generator") (tags resistor) (path /5F85CE2C) @@ -931,7 +967,7 @@ ) (module LED_SMD:LED_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B4B45C9) (tstamp 5F6245B1) - (at 194.056 114.554) + (at 194.3608 110.5916) (descr "LED SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "LED handsolder") (path /5F8539DC) @@ -1683,7 +1719,7 @@ ) (module Connector_JST:JST_EH_B3B-EH-A_1x03_P2.50mm_Vertical (layer F.Cu) (tedit 5C28142C) (tstamp 5F63AEC1) - (at 189.23 111.76 270) + (at 189.5348 107.7976 270) (descr "JST EH series connector, B3B-EH-A (http://www.jst-mfg.com/product/pdf/eng/eEH.pdf), generated with kicad-footprint-generator") (tags "connector JST EH vertical") (path /5F68A563) @@ -1735,7 +1771,7 @@ ) (module Connector_JST:JST_EH_B3B-EH-A_1x03_P2.50mm_Vertical (layer F.Cu) (tedit 5C28142C) (tstamp 5F601659) - (at 182.88 111.76 270) + (at 183.1848 107.7976 270) (descr "JST EH series connector, B3B-EH-A (http://www.jst-mfg.com/product/pdf/eng/eEH.pdf), generated with kicad-footprint-generator") (tags "connector JST EH vertical") (path /5F6870CB) @@ -1787,7 +1823,7 @@ ) (module Connector_JST:JST_EH_B3B-EH-A_1x03_P2.50mm_Vertical (layer F.Cu) (tedit 5C28142C) (tstamp 5F63AF8A) - (at 175.895 111.76 270) + (at 176.1998 107.7976 270) (descr "JST EH series connector, B3B-EH-A (http://www.jst-mfg.com/product/pdf/eng/eEH.pdf), generated with kicad-footprint-generator") (tags "connector JST EH vertical") (path /5F6785CE) @@ -3614,49 +3650,13 @@ ) ) - (module Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder (layer F.Cu) (tedit 5F68FEEF) (tstamp 5F939315) - (at 203.708 107.95 270) - (descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator") - (tags "capacitor handsolder") - (path /5F9A17B3) - (attr smd) - (fp_text reference C3 (at 0 -1.68 90) (layer F.SilkS) - (effects (font (size 1 1) (thickness 0.15))) - ) - (fp_text value 100n (at 0 1.68 90) (layer F.Fab) - (effects (font (size 1 1) (thickness 0.15))) - ) - (fp_line (start -1 0.625) (end -1 -0.625) (layer F.Fab) (width 0.1)) - (fp_line (start -1 -0.625) (end 1 -0.625) (layer F.Fab) (width 0.1)) - (fp_line (start 1 -0.625) (end 1 0.625) (layer F.Fab) (width 0.1)) - (fp_line (start 1 0.625) (end -1 0.625) (layer F.Fab) (width 0.1)) - (fp_line (start -0.261252 -0.735) (end 0.261252 -0.735) (layer F.SilkS) (width 0.12)) - (fp_line (start -0.261252 0.735) (end 0.261252 0.735) (layer F.SilkS) (width 0.12)) - (fp_line (start -1.88 0.98) (end -1.88 -0.98) (layer F.CrtYd) (width 0.05)) - (fp_line (start -1.88 -0.98) (end 1.88 -0.98) (layer F.CrtYd) (width 0.05)) - (fp_line (start 1.88 -0.98) (end 1.88 0.98) (layer F.CrtYd) (width 0.05)) - (fp_line (start 1.88 0.98) (end -1.88 0.98) (layer F.CrtYd) (width 0.05)) - (fp_text user %R (at 0 0 90) (layer F.Fab) - (effects (font (size 0.5 0.5) (thickness 0.08))) - ) - (pad 1 smd roundrect (at -1.0375 0 270) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) - (net 7 GND)) - (pad 2 smd roundrect (at 1.0375 0 270) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) - (net 40 PLANT0_MOIST)) - (model ${KISYS3DMOD}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl - (at (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (module Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder (layer F.Cu) (tedit 5F68FEEF) (tstamp 5F939326) - (at 230.505 98.425 180) + (module Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder (layer F.Cu) (tedit 5F68FEEF) (tstamp 5F9ECC4F) + (at 196.4436 96.3676) (descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator") (tags "capacitor handsolder") (path /5FAEAFAD) (attr smd) - (fp_text reference C4 (at -3.175 0) (layer F.SilkS) + (fp_text reference C4 (at 0.0508 -1.6764) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) (fp_text value 100n (at 0 1.68) (layer F.Fab) @@ -3675,9 +3675,9 @@ (fp_text user %R (at 0 0) (layer F.Fab) (effects (font (size 0.5 0.5) (thickness 0.08))) ) - (pad 2 smd roundrect (at 1.0375 0 180) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) + (pad 2 smd roundrect (at 1.0375 0) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) (net 13 PLANT1_MOIST)) - (pad 1 smd roundrect (at -1.0375 0 180) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) + (pad 1 smd roundrect (at -1.0375 0) (size 1.175 1.45) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.212766) (net 7 GND)) (model ${KISYS3DMOD}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl (at (xyz 0 0 0)) @@ -4019,15 +4019,15 @@ ) (module Diode_SMD:D_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5F68FEF0) (tstamp 5F9393DA) - (at 177.8 107.315 180) + (at 189.8396 96.3168 270) (descr "Diode SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "diode handsolder") (path /5F99DD35) (attr smd) - (fp_text reference D12 (at 3.81 0) (layer F.SilkS) + (fp_text reference D12 (at -3.2004 0.0508 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BAS40 (at 0 1.82) (layer F.Fab) + (fp_text value BAS40 (at 0 1.82 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 2.45 1.12) (end -2.45 1.12) (layer F.CrtYd) (width 0.05)) @@ -4042,12 +4042,12 @@ (fp_line (start -1.6 -0.4) (end -1.6 0.8) (layer F.Fab) (width 0.1)) (fp_line (start -1.2 -0.8) (end -1.6 -0.4) (layer F.Fab) (width 0.1)) (fp_line (start 1.6 -0.8) (end -1.2 -0.8) (layer F.Fab) (width 0.1)) - (fp_text user %R (at 0 0) (layer F.Fab) + (fp_text user %R (at 0 0 90) (layer F.Fab) (effects (font (size 0.8 0.8) (thickness 0.12))) ) - (pad 2 smd roundrect (at 1.4875 0 180) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 2 smd roundrect (at 1.4875 0 270) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 40 PLANT0_MOIST)) - (pad 1 smd roundrect (at -1.4875 0 180) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 1 smd roundrect (at -1.4875 0 270) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 28 3_3V)) (model ${KISYS3DMOD}/Diode_SMD.3dshapes/D_1206_3216Metric.wrl (at (xyz 0 0 0)) @@ -4057,12 +4057,12 @@ ) (module Diode_SMD:D_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5F68FEF0) (tstamp 5F9393ED) - (at 201.549 108.458 90) + (at 192.4812 96.266 90) (descr "Diode SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "diode handsolder") (path /5F99F68E) (attr smd) - (fp_text reference D13 (at 0 -1.82 90) (layer F.SilkS) + (fp_text reference D13 (at 3.1496 0.2032 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) (fp_text value BAS40 (at 0 1.82 90) (layer F.Fab) @@ -4133,15 +4133,15 @@ ) (module Diode_SMD:D_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5F68FEF0) (tstamp 5F939413) - (at 183.515 107.315) + (at 189.7888 89.8144 270) (descr "Diode SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "diode handsolder") (path /5FA40DBC) (attr smd) - (fp_text reference D15 (at 0 -1.82) (layer F.SilkS) + (fp_text reference D15 (at -3.1496 -2.8448 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BAS40 (at 0 1.82) (layer F.Fab) + (fp_text value BAS40 (at 0 1.82 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 2.45 1.12) (end -2.45 1.12) (layer F.CrtYd) (width 0.05)) @@ -4156,12 +4156,12 @@ (fp_line (start -1.6 -0.4) (end -1.6 0.8) (layer F.Fab) (width 0.1)) (fp_line (start -1.2 -0.8) (end -1.6 -0.4) (layer F.Fab) (width 0.1)) (fp_line (start 1.6 -0.8) (end -1.2 -0.8) (layer F.Fab) (width 0.1)) - (fp_text user %R (at 0 0) (layer F.Fab) + (fp_text user %R (at 0 0 90) (layer F.Fab) (effects (font (size 0.8 0.8) (thickness 0.12))) ) - (pad 2 smd roundrect (at 1.4875 0) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 2 smd roundrect (at 1.4875 0 270) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 13 PLANT1_MOIST)) - (pad 1 smd roundrect (at -1.4875 0) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 1 smd roundrect (at -1.4875 0 270) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 28 3_3V)) (model ${KISYS3DMOD}/Diode_SMD.3dshapes/D_1206_3216Metric.wrl (at (xyz 0 0 0)) @@ -4171,18 +4171,18 @@ ) (module Diode_SMD:D_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5F68FEF0) (tstamp 5F93C0FD) - (at 189.865 107.315) + (at 192.5828 89.8144 90) (descr "Diode SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "diode handsolder") (path /5FA42FAF) (attr smd) - (fp_text reference D16 (at -3.175 -1.905) (layer F.SilkS) + (fp_text reference D16 (at 3.2004 -2.794 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BAS40 (at 0 1.82) (layer F.Fab) + (fp_text value BAS40 (at 0 1.82 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text user %R (at 0 0) (layer F.Fab) + (fp_text user %R (at 0 0 90) (layer F.Fab) (effects (font (size 0.8 0.8) (thickness 0.12))) ) (fp_line (start 1.6 -0.8) (end -1.2 -0.8) (layer F.Fab) (width 0.1)) @@ -4197,9 +4197,9 @@ (fp_line (start -2.45 -1.12) (end 2.45 -1.12) (layer F.CrtYd) (width 0.05)) (fp_line (start 2.45 -1.12) (end 2.45 1.12) (layer F.CrtYd) (width 0.05)) (fp_line (start 2.45 1.12) (end -2.45 1.12) (layer F.CrtYd) (width 0.05)) - (pad 1 smd roundrect (at -1.4875 0) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 1 smd roundrect (at -1.4875 0 90) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 13 PLANT1_MOIST)) - (pad 2 smd roundrect (at 1.4875 0) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 2 smd roundrect (at 1.4875 0 90) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 7 GND)) (model ${KISYS3DMOD}/Diode_SMD.3dshapes/D_1206_3216Metric.wrl (at (xyz 0 0 0)) @@ -4247,15 +4247,15 @@ ) (module Diode_SMD:D_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5F68FEF0) (tstamp 5F93944C) - (at 195.3625 118.745 180) + (at 189.8396 83.3628 270) (descr "Diode SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "diode handsolder") (path /5FA413B7) (attr smd) - (fp_text reference D18 (at 0 -1.82) (layer F.SilkS) + (fp_text reference D18 (at -3.2512 0 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BAS40 (at 0 1.82) (layer F.Fab) + (fp_text value BAS40 (at 0 1.82 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 1.6 -0.8) (end -1.2 -0.8) (layer F.Fab) (width 0.1)) @@ -4270,12 +4270,12 @@ (fp_line (start -2.45 -1.12) (end 2.45 -1.12) (layer F.CrtYd) (width 0.05)) (fp_line (start 2.45 -1.12) (end 2.45 1.12) (layer F.CrtYd) (width 0.05)) (fp_line (start 2.45 1.12) (end -2.45 1.12) (layer F.CrtYd) (width 0.05)) - (fp_text user %R (at 0 0) (layer F.Fab) + (fp_text user %R (at 0 0 90) (layer F.Fab) (effects (font (size 0.8 0.8) (thickness 0.12))) ) - (pad 1 smd roundrect (at -1.4875 0 180) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 1 smd roundrect (at -1.4875 0 270) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 28 3_3V)) - (pad 2 smd roundrect (at 1.4875 0 180) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 2 smd roundrect (at 1.4875 0 270) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 12 PLANT2_MOIST)) (model ${KISYS3DMOD}/Diode_SMD.3dshapes/D_1206_3216Metric.wrl (at (xyz 0 0 0)) @@ -4285,15 +4285,15 @@ ) (module Diode_SMD:D_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5F68FEF0) (tstamp 5F93945F) - (at 194.31 110.49 180) + (at 192.4812 83.3628 90) (descr "Diode SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "diode handsolder") (path /5FA433FC) (attr smd) - (fp_text reference D19 (at 0 -1.82) (layer F.SilkS) + (fp_text reference D19 (at 3.302 0.2032 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BAS40 (at 0 1.82) (layer F.Fab) + (fp_text value BAS40 (at 0 1.82 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 1.6 -0.8) (end -1.2 -0.8) (layer F.Fab) (width 0.1)) @@ -4308,12 +4308,12 @@ (fp_line (start -2.45 -1.12) (end 2.45 -1.12) (layer F.CrtYd) (width 0.05)) (fp_line (start 2.45 -1.12) (end 2.45 1.12) (layer F.CrtYd) (width 0.05)) (fp_line (start 2.45 1.12) (end -2.45 1.12) (layer F.CrtYd) (width 0.05)) - (fp_text user %R (at 0 0) (layer F.Fab) + (fp_text user %R (at 0 0 90) (layer F.Fab) (effects (font (size 0.8 0.8) (thickness 0.12))) ) - (pad 1 smd roundrect (at -1.4875 0 180) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 1 smd roundrect (at -1.4875 0 90) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 12 PLANT2_MOIST)) - (pad 2 smd roundrect (at 1.4875 0 180) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) + (pad 2 smd roundrect (at 1.4875 0 90) (size 1.425 1.75) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.175439) (net 7 GND)) (model ${KISYS3DMOD}/Diode_SMD.3dshapes/D_1206_3216Metric.wrl (at (xyz 0 0 0)) @@ -5098,7 +5098,7 @@ ) (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9B9BD8) - (at 226.1235 91.2495) + (at 191.262 100.1268) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") (path /5F993C00) @@ -5170,7 +5170,7 @@ ) (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9B9BFA) - (at 163.449 110.744) + (at 196.3563 100.1268) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") (path /5F99BE26) @@ -5242,7 +5242,7 @@ ) (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9B9C1C) - (at 192.278 121.031) + (at 201.4728 100.1268) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") (path /5F99C2BC) @@ -5313,8 +5313,8 @@ ) ) - (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9B9C3E) - (at 186.4995 148.2725) + (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9EC0D7) + (at 177.4444 119.7864) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") (path /5F99C5A6) @@ -5385,8 +5385,8 @@ ) ) - (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9B9C60) - (at 179.959 148.3995) + (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9EC021) + (at 182.5244 119.7356) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") (path /5F99C828) @@ -5458,7 +5458,7 @@ ) (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9B9C82) - (at 192.0875 148.209) + (at 187.5536 119.7356) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") (path /5F99CBD3) @@ -5566,7 +5566,7 @@ ) (module Resistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolder (layer F.Cu) (tedit 5B301BBD) (tstamp 5F9B9CB5) - (at 197.866 148.1455) + (at 192.8876 119.7864) (descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal with elongated pad for handsoldering. (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator") (tags "resistor handsolder") (path /5F99CEF5) @@ -5701,18 +5701,19 @@ (via (at 256.794 46.736) (size 4) (drill 3) (layers F.Cu B.Cu) (net 0)) (via (at 252.984 83.312) (size 4) (drill 3) (layers F.Cu B.Cu) (net 0)) (segment (start 227.33 125.77) (end 227.33 120.245) (width 0.5) (layer F.Cu) (net 1) (status 30)) - (segment (start 229.005001 114.682501) (end 228.205 113.8825) (width 0.25) (layer F.Cu) (net 1)) (segment (start 228.205 113.8825) (end 227.33 113.8825) (width 0.25) (layer F.Cu) (net 1) (status 20)) - (segment (start 227.98 120.245) (end 229.005001 119.219999) (width 0.25) (layer F.Cu) (net 1)) (segment (start 227.33 120.245) (end 227.98 120.245) (width 0.25) (layer F.Cu) (net 1) (status 10)) (segment (start 227.33 121.445) (end 227.33 120.245) (width 0.25) (layer F.Cu) (net 1) (status 20)) - (segment (start 227.1455 121.6295) (end 227.33 121.445) (width 0.25) (layer F.Cu) (net 1)) - (segment (start 223.901 121.6295) (end 227.1455 121.6295) (width 0.25) (layer F.Cu) (net 1)) (segment (start 228.9445 106.158) (end 228.981 106.1945) (width 0.25) (layer F.Cu) (net 1)) (segment (start 228.9445 105.283) (end 228.9445 106.158) (width 0.25) (layer F.Cu) (net 1) (status 10)) - (segment (start 228.981 114.8715) (end 229.005001 114.682501) (width 0.25) (layer F.Cu) (net 1)) - (segment (start 228.981 106.1945) (end 228.981 114.8715) (width 0.25) (layer F.Cu) (net 1)) - (segment (start 229.005001 119.219999) (end 228.981 114.8715) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 228.9445 105.283) (end 228.9445 113.4253) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 228.4873 113.8825) (end 227.33 113.8825) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 228.9445 113.4253) (end 228.4873 113.8825) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 227.98 120.245) (end 227.9814 120.2436) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 227.9814 120.2436) (end 228.854 120.2436) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 228.854 120.2436) (end 229.7176 119.38) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 229.7176 114.1984) (end 228.9445 113.4253) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 229.7176 119.38) (end 229.7176 114.1984) (width 0.25) (layer F.Cu) (net 1)) (segment (start 234.95 125.77) (end 234.95 120.245) (width 0.5) (layer F.Cu) (net 2) (status 30)) (segment (start 235.825 113.8825) (end 234.95 113.8825) (width 0.25) (layer F.Cu) (net 2) (status 20)) (segment (start 235.6 120.245) (end 236.625001 119.219999) (width 0.25) (layer F.Cu) (net 2)) @@ -5725,12 +5726,15 @@ (segment (start 242.57 125.77) (end 242.57 120.245) (width 0.5) (layer F.Cu) (net 3) (status 30)) (segment (start 243.445 113.8825) (end 242.57 113.8825) (width 0.25) (layer F.Cu) (net 3) (status 20)) (segment (start 244.245001 114.682501) (end 243.445 113.8825) (width 0.25) (layer F.Cu) (net 3)) - (segment (start 243.22 120.245) (end 244.245001 119.219999) (width 0.25) (layer F.Cu) (net 3)) (segment (start 242.57 120.245) (end 243.22 120.245) (width 0.25) (layer F.Cu) (net 3) (status 10)) (segment (start 243.9305 114.454) (end 244.2845 114.808) (width 0.25) (layer F.Cu) (net 3)) (segment (start 244.2845 114.808) (end 244.245001 114.682501) (width 0.25) (layer F.Cu) (net 3)) (segment (start 243.9305 105.283) (end 243.9305 114.454) (width 0.25) (layer F.Cu) (net 3) (status 10)) - (segment (start 244.245001 119.219999) (end 244.2845 114.808) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 244.245001 114.682501) (end 244.245001 114.705001) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 244.245001 114.705001) (end 244.856 115.316) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 244.856 115.316) (end 244.856 119.4816) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 244.0926 120.245) (end 243.22 120.245) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 244.856 119.4816) (end 244.0926 120.245) (width 0.25) (layer F.Cu) (net 3)) (segment (start 250.19 125.77) (end 250.19 120.245) (width 0.5) (layer F.Cu) (net 4) (status 30)) (segment (start 251.865001 119.219999) (end 251.865001 114.682501) (width 0.25) (layer F.Cu) (net 4)) (segment (start 250.84 120.245) (end 251.865001 119.219999) (width 0.25) (layer F.Cu) (net 4)) @@ -5742,20 +5746,24 @@ (segment (start 251.865001 114.682501) (end 251.841 114.554) (width 0.25) (layer F.Cu) (net 4)) (segment (start 257.81 125.77) (end 257.81 120.245) (width 0.5) (layer F.Cu) (net 5) (status 30)) (segment (start 258.685 113.8825) (end 257.81 113.8825) (width 0.25) (layer F.Cu) (net 5) (status 20)) - (segment (start 259.485001 119.219999) (end 259.485001 114.682501) (width 0.25) (layer F.Cu) (net 5)) - (segment (start 258.46 120.245) (end 259.485001 119.219999) (width 0.25) (layer F.Cu) (net 5)) - (segment (start 257.81 120.245) (end 258.46 120.245) (width 0.25) (layer F.Cu) (net 5) (status 10)) (segment (start 259.5515 114.4) (end 259.377 114.5745) (width 0.25) (layer F.Cu) (net 5)) (segment (start 259.5515 105.41) (end 259.5515 114.4) (width 0.25) (layer F.Cu) (net 5) (status 10)) (segment (start 259.377 114.5745) (end 258.685 113.8825) (width 0.25) (layer F.Cu) (net 5)) - (segment (start 259.485001 114.682501) (end 259.377 114.5745) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 260.1468 118.5582) (end 258.46 120.245) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 260.1468 115.3668) (end 260.1468 118.5582) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 258.46 120.245) (end 257.81 120.245) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 259.485001 114.705001) (end 260.1468 115.3668) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 259.485001 114.682501) (end 259.485001 114.705001) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 259.377 114.5745) (end 259.485001 114.682501) (width 0.25) (layer F.Cu) (net 5)) (segment (start 265.43 125.77) (end 265.43 120.245) (width 0.5) (layer F.Cu) (net 6) (status 30)) - (segment (start 266.305 113.8825) (end 265.43 113.8825) (width 0.25) (layer F.Cu) (net 6) (status 20)) - (segment (start 267.105001 114.682501) (end 266.305 113.8825) (width 0.25) (layer F.Cu) (net 6)) - (segment (start 267.105001 119.219999) (end 267.105001 114.682501) (width 0.25) (layer F.Cu) (net 6)) - (segment (start 266.08 120.245) (end 267.105001 119.219999) (width 0.25) (layer F.Cu) (net 6)) - (segment (start 265.43 120.245) (end 266.08 120.245) (width 0.25) (layer F.Cu) (net 6) (status 10)) (segment (start 266.9175 105.41) (end 266.9175 114.327) (width 0.25) (layer F.Cu) (net 6) (status 10)) + (segment (start 266.305 113.8825) (end 265.43 113.8825) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 267.462 115.0395) (end 266.305 113.8825) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 267.462 118.872) (end 267.462 115.0395) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 267.114001 119.219999) (end 267.462 118.872) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 267.105001 119.219999) (end 267.114001 119.219999) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 266.08 120.245) (end 267.105001 119.219999) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 265.43 120.245) (end 266.08 120.245) (width 0.25) (layer F.Cu) (net 6)) (segment (start 264.48 117.245) (end 261.771 117.245) (width 0.5) (layer F.Cu) (net 7) (status 10)) (via (at 261.62 117.094) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) (segment (start 261.771 117.245) (end 261.62 117.094) (width 0.5) (layer F.Cu) (net 7)) @@ -5783,10 +5791,8 @@ (segment (start 223.52 117.094) (end 216.662 117.094) (width 0.5) (layer B.Cu) (net 7)) (segment (start 218.609 117.094) (end 218.76 117.245) (width 0.5) (layer F.Cu) (net 7) (status 30)) (segment (start 216.662 117.094) (end 218.609 117.094) (width 0.5) (layer F.Cu) (net 7) (status 20)) - (segment (start 175.895 124.46) (end 195.58 124.46) (width 0.5) (layer F.Cu) (net 7) (status 30)) - (segment (start 175.895 111.76) (end 189.23 111.76) (width 0.5) (layer F.Cu) (net 7) (status 30)) + (segment (start 176.1998 107.7976) (end 185.0644 107.7976) (width 0.5) (layer F.Cu) (net 7) (status 30)) (segment (start 216.662 130.556) (end 216.662 117.094) (width 0.5) (layer F.Cu) (net 7)) - (segment (start 220.98 134.874) (end 216.662 130.556) (width 0.5) (layer F.Cu) (net 7)) (segment (start 220.98 136.525) (end 220.98 134.874) (width 0.5) (layer F.Cu) (net 7) (status 10)) (segment (start 220.98 136.525) (end 223.52 136.525) (width 0.5) (layer F.Cu) (net 7) (status 30)) (segment (start 195.58 124.46) (end 196.342 124.46) (width 0.5) (layer F.Cu) (net 7) (status 30)) @@ -5798,7 +5804,6 @@ (segment (start 183.082 70.582) (end 183.082 68.02) (width 0.5) (layer F.Cu) (net 7) (status 10)) (segment (start 183.082 68.02) (end 181.356 66.294) (width 0.5) (layer F.Cu) (net 7)) (segment (start 174.752 66.294) (end 172.72 68.326) (width 0.5) (layer F.Cu) (net 7)) - (segment (start 172.72 68.326) (end 172.72 90.678) (width 0.5) (layer F.Cu) (net 7)) (segment (start 183.082 101.04) (end 183.082 101.582) (width 0.5) (layer F.Cu) (net 7) (status 30)) (segment (start 172.72 90.678) (end 183.082 101.04) (width 0.5) (layer F.Cu) (net 7) (status 20)) (segment (start 223.5565 136.4885) (end 223.52 136.525) (width 0.25) (layer F.Cu) (net 7) (status 30)) @@ -5824,20 +5829,15 @@ (segment (start 220.98 136.525) (end 219.679999 135.224999) (width 0.5) (layer B.Cu) (net 7) (status 10)) (segment (start 203.835 131.572) (end 203.835 128.905) (width 0.5) (layer B.Cu) (net 7) (status 20)) (segment (start 207.487999 135.224999) (end 203.835 131.572) (width 0.5) (layer B.Cu) (net 7)) - (segment (start 192.5685 114.554) (end 192.5685 121.4485) (width 0.5) (layer F.Cu) (net 7) (status 10)) - (segment (start 189.23 111.76) (end 191.008 111.76) (width 0.5) (layer F.Cu) (net 7) (status 10)) - (segment (start 192.5685 113.3205) (end 192.5685 114.554) (width 0.5) (layer F.Cu) (net 7) (status 20)) - (segment (start 191.008 111.76) (end 192.5685 113.3205) (width 0.5) (layer F.Cu) (net 7)) - (segment (start 203.1635 100.13) (end 205.7765 102.743) (width 0.25) (layer F.Cu) (net 7) (status 20)) + (segment (start 189.5348 107.7976) (end 191.3128 107.7976) (width 0.5) (layer F.Cu) (net 7) (status 10)) + (segment (start 192.8733 109.3581) (end 192.8733 110.5916) (width 0.5) (layer F.Cu) (net 7) (status 20)) + (segment (start 191.3128 107.7976) (end 192.8733 109.3581) (width 0.5) (layer F.Cu) (net 7)) (segment (start 216.535 113.8825) (end 216.535 116.967) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 216.535 116.967) (end 216.662 117.094) (width 0.25) (layer F.Cu) (net 7)) (segment (start 223.52 113.8825) (end 223.52 117.094) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 263.312 72.136) (end 264.287 72.136) (width 0.25) (layer F.Cu) (net 7) (status 30)) (segment (start 259.4245 68.2485) (end 263.312 72.136) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 259.4245 66.04) (end 259.4245 68.2485) (width 0.25) (layer F.Cu) (net 7) (status 10)) - (segment (start 192.278 110.49) (end 191.008 111.76) (width 0.25) (layer F.Cu) (net 7) (status 10)) - (segment (start 192.8225 110.49) (end 192.278 110.49) (width 0.25) (layer F.Cu) (net 7) (status 30)) - (segment (start 189.23 111.76) (end 191.128 109.862) (width 0.5) (layer F.Cu) (net 7) (status 10)) (segment (start 204.47 136.7425) (end 206.1575 136.7425) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 207.487999 135.412001) (end 207.487999 135.224999) (width 0.25) (layer F.Cu) (net 7)) (via (at 207.487999 135.224999) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) @@ -5866,16 +5866,6 @@ (segment (start 224.155 138.43) (end 235.585 138.43) (width 0.5) (layer F.Cu) (net 7)) (segment (start 235.585 138.43) (end 237.2575 136.7575) (width 0.5) (layer F.Cu) (net 7)) (segment (start 237.2575 133.35) (end 237.2575 136.7575) (width 0.5) (layer F.Cu) (net 7) (status 10)) - (segment (start 242.495 98.425) (end 245.67 95.25) (width 0.25) (layer F.Cu) (net 7) (status 20)) - (segment (start 231.5425 98.425) (end 242.495 98.425) (width 0.25) (layer F.Cu) (net 7) (status 10)) - (segment (start 203.523 107.0975) (end 203.708 106.9125) (width 0.25) (layer F.Cu) (net 7) (status 30)) - (segment (start 201.549 107.0975) (end 203.523 107.0975) (width 0.25) (layer F.Cu) (net 7) (status 30)) - (via (at 202.819 103.505) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) - (segment (start 203.708 104.394) (end 202.819 103.505) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 203.708 106.9125) (end 203.708 104.394) (width 0.25) (layer F.Cu) (net 7) (status 10)) - (segment (start 202.819 103.505) (end 203.218999 103.105001) (width 0.25) (layer B.Cu) (net 7)) - (segment (start 203.218999 103.105001) (end 204.724 101.6) (width 0.25) (layer B.Cu) (net 7)) - (via (at 204.724 101.6) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) (segment (start 231.775 116.967) (end 231.902 117.094) (width 0.25) (layer F.Cu) (net 7)) (segment (start 231.775 113.8825) (end 231.775 116.967) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 238.76 117.094) (end 238.76 113.8825) (width 0.25) (layer F.Cu) (net 7) (status 20)) @@ -5913,9 +5903,6 @@ (segment (start 244.6655 89.916) (end 246.9995 89.916) (width 0.25) (layer F.Cu) (net 7)) (segment (start 247.6715 93.2485) (end 247.6715 91.313) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 245.67 95.25) (end 247.6715 93.2485) (width 0.25) (layer F.Cu) (net 7) (status 10)) - (segment (start 190.205 124.46) (end 189.23 124.46) (width 0.25) (layer F.Cu) (net 7) (status 20)) - (segment (start 192.5685 122.0965) (end 190.205 124.46) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 192.5685 121.4485) (end 192.5685 122.0965) (width 0.25) (layer F.Cu) (net 7)) (via (at 227.0125 79.756) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) (segment (start 229.235 77.5335) (end 227.0125 79.756) (width 0.25) (layer B.Cu) (net 7)) (segment (start 229.235 76.2) (end 229.235 77.5335) (width 0.25) (layer B.Cu) (net 7)) @@ -5928,113 +5915,208 @@ (segment (start 217.5875 77.47) (end 217.5875 81.28) (width 0.5) (layer F.Cu) (net 7) (status 30)) (segment (start 212.4735 70.0265) (end 212.65 69.85) (width 0.25) (layer F.Cu) (net 7) (status 30)) (segment (start 212.4735 75.6525) (end 212.4735 70.0265) (width 0.25) (layer F.Cu) (net 7) (status 30)) - (segment (start 202.1205 98.9965) (end 204.724 101.6) (width 0.25) (layer F.Cu) (net 7)) - (segment (start 202.1205 93.7965) (end 202.1205 98.9965) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 217.4605 83.4335) (end 218.0615 84.0345) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 217.4605 81.407) (end 217.4605 83.4335) (width 0.25) (layer F.Cu) (net 7) (status 10)) (segment (start 217.4605 81.901) (end 217.4605 81.407) (width 0.25) (layer F.Cu) (net 7) (status 30)) (segment (start 215.0605 84.301) (end 217.4605 81.901) (width 0.25) (layer F.Cu) (net 7) (status 20)) (segment (start 214.1855 84.301) (end 215.0605 84.301) (width 0.25) (layer F.Cu) (net 7) (status 10)) - (segment (start 237.542 100.838) (end 243.13 95.25) (width 0.25) (layer B.Cu) (net 8) (status 20)) - (segment (start 199.136 124.206) (end 199.136 112.90159) (width 0.25) (layer B.Cu) (net 8)) - (segment (start 211.19959 100.838) (end 237.542 100.838) (width 0.25) (layer B.Cu) (net 8)) - (segment (start 199.136 112.90159) (end 211.19959 100.838) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 195.4061 95.6426) (end 195.4061 96.3676) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 194.542 94.7785) (end 195.4061 95.6426) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 192.4812 94.7785) (end 194.542 94.7785) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 172.72 68.326) (end 172.6692 75.1332) (width 0.5) (layer F.Cu) (net 7)) + (segment (start 192.803 66.294) (end 181.356 66.294) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 195.563 69.054) (end 192.803 66.294) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 198.628 69.054) (end 195.563 69.054) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 186.13221 80.83779) (end 183.515 83.455) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 192.15619 80.83779) (end 186.13221 80.83779) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 192.4812 81.1628) (end 192.15619 80.83779) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 192.4812 81.8753) (end 192.4812 81.1628) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 178.546 78.486) (end 172.72 78.486) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 183.515 84.455) (end 183.515 83.455) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 183.515 83.455) (end 178.546 78.486) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 172.72 78.486) (end 172.72 90.678) (width 0.5) (layer F.Cu) (net 7)) + (segment (start 172.6692 75.1332) (end 172.72 78.486) (width 0.5) (layer F.Cu) (net 7)) + (via (at 193.9036 82.4992) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 193.2797 81.8753) (end 193.9036 82.4992) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 192.4812 81.8753) (end 193.2797 81.8753) (width 0.25) (layer F.Cu) (net 7)) + (via (at 193.802 88.138) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 193.9036 88.0364) (end 193.802 88.138) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 193.9036 82.4992) (end 193.9036 88.0364) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 192.7717 88.138) (end 192.5828 88.3269) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 193.802 88.138) (end 192.7717 88.138) (width 0.25) (layer F.Cu) (net 7)) + (via (at 194.246646 91.345743) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 194.246646 89.115746) (end 194.246646 91.345743) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 193.4578 88.3269) (end 194.246646 89.115746) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 192.5828 88.3269) (end 193.4578 88.3269) (width 0.25) (layer F.Cu) (net 7)) + (via (at 194.542 94.7785) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 194.246646 94.483146) (end 194.542 94.7785) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 194.246646 91.345743) (end 194.246646 94.483146) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 216.8144 131.3056) (end 216.8144 130.81) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 212.09 136.03) (end 216.8144 131.3056) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 212.09 136.7425) (end 212.09 136.03) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 216.8144 130.81) (end 216.662 130.556) (width 0.5) (layer F.Cu) (net 7)) + (segment (start 220.98 134.874) (end 216.8144 130.81) (width 0.5) (layer F.Cu) (net 7)) + (segment (start 183.855 124.46) (end 182.88 124.46) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 184.30501 124.91001) (end 183.855 124.46) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 184.30501 129.998481) (end 184.30501 124.91001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 182.64349 131.660001) (end 184.30501 129.998481) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 178.026999 131.660001) (end 182.64349 131.660001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 177.584999 131.218001) (end 178.026999 131.660001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 177.584999 125.174999) (end 177.584999 131.218001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 176.87 124.46) (end 177.584999 125.174999) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 175.895 124.46) (end 176.87 124.46) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 188.255 124.46) (end 187.6044 125.1106) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 189.23 124.46) (end 188.255 124.46) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 186.463001 131.660001) (end 182.64349 131.660001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 187.6044 125.1106) (end 187.6044 130.518602) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 194.605 124.46) (end 193.9036 125.1614) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 195.58 124.46) (end 194.605 124.46) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 193.9036 130.569402) (end 192.813001 131.660001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 186.524001 131.660001) (end 186.493501 131.629501) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 193.9036 125.1614) (end 193.9036 130.569402) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 192.813001 131.660001) (end 186.524001 131.660001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 186.493501 131.629501) (end 186.463001 131.660001) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 187.6044 130.518602) (end 186.493501 131.629501) (width 0.5) (layer B.Cu) (net 7)) + (segment (start 190.4277 106.9047) (end 189.5348 107.7976) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 190.4277 103.6828) (end 190.4277 106.9047) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 185.0644 107.7976) (end 189.5348 107.7976) (width 0.5) (layer F.Cu) (net 7) (tstamp 5F9F4093) (status 30)) + (via (at 185.0644 107.7976) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (via (at 185.6232 102.0572) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 185.0644 102.616) (end 185.6232 102.0572) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 185.0644 107.7976) (end 185.0644 102.616) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 185.148 101.582) (end 185.6232 102.0572) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 183.082 101.582) (end 185.148 101.582) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 205.7765 98.5525) (end 205.7765 101.868) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 205.7765 101.868) (end 205.7765 102.743) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 202.1205 93.7965) (end 202.1205 94.8965) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 194.542 94.7785) (end 198.0041 94.7785) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 200.2536 97.028) (end 204.2668 97.028) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 204.2668 97.028) (end 205.7765 98.5525) (width 0.25) (layer F.Cu) (net 7)) + (via (at 204.2668 97.028) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 198.0041 94.7785) (end 200.2536 97.028) (width 0.25) (layer B.Cu) (net 7)) + (segment (start 202.1205 94.8965) (end 204.2668 97.028) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 190.5098 107.7976) (end 189.5348 107.7976) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 190.7325 107.5749) (end 190.5098 107.7976) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 190.7325 103.6828) (end 190.7325 107.5749) (width 0.25) (layer F.Cu) (net 7)) (segment (start 201.93 133.7675) (end 204.47 133.7675) (width 0.5) (layer F.Cu) (net 8) (status 30)) (segment (start 201.93 133.7675) (end 201.0775 133.7675) (width 0.25) (layer F.Cu) (net 8) (status 30)) (via (at 200.025 132.715) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 8)) (segment (start 201.0775 133.7675) (end 200.025 132.715) (width 0.25) (layer F.Cu) (net 8) (status 10)) - (segment (start 200.025 128.905) (end 197.231 126.111) (width 0.25) (layer B.Cu) (net 8)) - (segment (start 200.025 132.715) (end 200.025 128.905) (width 0.25) (layer B.Cu) (net 8)) - (segment (start 197.231 126.111) (end 199.136 124.206) (width 0.25) (layer B.Cu) (net 8)) (segment (start 245.5965 92.7835) (end 243.13 95.25) (width 0.25) (layer F.Cu) (net 8) (status 20)) (segment (start 245.5965 91.313) (end 245.5965 92.7835) (width 0.25) (layer F.Cu) (net 8) (status 10)) - (segment (start 198.68599 112.71519) (end 211.013189 100.387991) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 211.013189 100.387991) (end 235.452009 100.387991) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 198.68599 118.56001) (end 198.68599 112.71519) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 196.088 121.158) (end 198.68599 118.56001) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 193.548 121.158) (end 196.088 121.158) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 235.611 100.229) (end 240.59 95.25) (width 0.25) (layer B.Cu) (net 9) (status 20)) - (segment (start 235.452009 100.387991) (end 235.611 100.229) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 192.024 122.682) (end 193.548 121.158) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 192.024 125.222) (end 192.024 122.682) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 237.542 100.838) (end 211.19959 100.838) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 243.13 95.25) (end 237.542 100.838) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 211.19959 100.838) (end 207.6196 100.838) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 207.6196 100.838) (end 194.4116 114.046) (width 0.25) (layer B.Cu) (net 8)) + (via (at 194.4116 121.3104) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 194.4116 114.046) (end 194.4116 121.3104) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 194.4116 119.8229) (end 194.3751 119.7864) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 194.4116 121.3104) (end 194.4116 119.8229) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 194.977285 121.3104) (end 194.4116 121.3104) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 196.88001 123.213125) (end 194.977285 121.3104) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 196.88001 124.28681) (end 196.88001 123.213125) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 200.025 127.4318) (end 196.88001 124.28681) (width 0.25) (layer B.Cu) (net 8)) + (segment (start 200.025 132.715) (end 200.025 127.4318) (width 0.25) (layer B.Cu) (net 8)) (segment (start 194.31 133.7675) (end 196.85 133.7675) (width 0.5) (layer F.Cu) (net 9) (status 30)) (segment (start 194.31 133.7675) (end 194.31 132.715) (width 0.25) (layer F.Cu) (net 9) (status 10)) (via (at 192.405 130.81) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 9)) (segment (start 194.31 132.715) (end 192.405 130.81) (width 0.25) (layer F.Cu) (net 9)) (segment (start 191.3255 129.7305) (end 191.3255 125.9205) (width 0.25) (layer B.Cu) (net 9)) (segment (start 192.405 130.81) (end 191.3255 129.7305) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 191.3255 125.9205) (end 192.024 125.222) (width 0.25) (layer B.Cu) (net 9)) - (segment (start 190.286 126.96) (end 191.3255 125.9205) (width 0.25) (layer B.Cu) (net 9)) (segment (start 241.723 94.117) (end 240.59 95.25) (width 0.25) (layer F.Cu) (net 9) (status 20)) (segment (start 241.723 91.313) (end 241.723 94.117) (width 0.25) (layer F.Cu) (net 9) (status 10)) - (segment (start 233.478 99.822) (end 238.05 95.25) (width 0.25) (layer B.Cu) (net 10) (status 20)) - (segment (start 210.94277 99.822) (end 233.478 99.822) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 198.12 118.48959) (end 198.12 112.64477) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 185.42 122.174) (end 187.008205 120.585795) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 198.12 112.64477) (end 210.94277 99.822) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 185.42 124.42) (end 185.42 122.174) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 187.008205 120.585795) (end 196.023795 120.585795) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 196.023795 120.585795) (end 198.12 118.48959) (width 0.25) (layer B.Cu) (net 10)) + (via (at 191.3255 125.9205) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 190.53001 125.12501) (end 191.3255 125.9205) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 190.53001 122.09951) (end 190.53001 125.12501) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 189.0411 119.7356) (end 189.0411 120.6106) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 189.0776 120.65) (end 189.6364 121.2088) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 189.0776 116.3828) (end 189.0776 120.65) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 191.5668 115.824) (end 189.6364 115.824) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 207.002809 100.387991) (end 191.5668 115.824) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 235.452009 100.387991) (end 207.002809 100.387991) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 240.59 95.25) (end 235.452009 100.387991) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 189.6364 121.2088) (end 190.53001 122.09951) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 189.6364 115.824) (end 189.0776 116.3828) (width 0.25) (layer B.Cu) (net 9)) + (via (at 189.6364 121.2088) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 189.0411 120.6106) (end 189.6364 121.2088) (width 0.25) (layer F.Cu) (net 9)) (segment (start 186.69 133.7675) (end 189.23 133.7675) (width 0.5) (layer F.Cu) (net 10) (status 30)) (via (at 186.055 130.81) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 10)) (segment (start 186.69 131.445) (end 186.055 130.81) (width 0.25) (layer F.Cu) (net 10)) (segment (start 186.69 133.7675) (end 186.69 131.445) (width 0.25) (layer F.Cu) (net 10) (status 10)) - (segment (start 184.13 126.423285) (end 184.13 125.71) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 186.055 128.348285) (end 184.13 126.423285) (width 0.25) (layer B.Cu) (net 10)) (segment (start 186.055 130.81) (end 186.055 128.348285) (width 0.25) (layer B.Cu) (net 10)) - (segment (start 184.13 125.71) (end 185.42 124.42) (width 0.25) (layer B.Cu) (net 10)) (segment (start 237.7225 94.9225) (end 238.05 95.25) (width 0.25) (layer F.Cu) (net 10) (status 30)) (segment (start 237.7225 91.2495) (end 237.7225 94.9225) (width 0.25) (layer F.Cu) (net 10) (status 30)) - (segment (start 178.308 122.174) (end 178.308 125.222) (width 0.25) (layer B.Cu) (net 11)) - (segment (start 195.586215 120.135785) (end 180.346215 120.135785) (width 0.25) (layer B.Cu) (net 11)) + (via (at 186.055 128.348285) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 184.18001 126.473295) (end 186.055 128.348285) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 184.18001 120.77871) (end 184.18001 126.473295) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 184.0119 120.6106) (end 184.18001 120.77871) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 184.0119 119.7356) (end 184.0119 120.6106) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 184.912 115.062) (end 184.18001 115.79399) (width 0.25) (layer B.Cu) (net 10)) + (segment (start 191.6176 115.062) (end 184.912 115.062) (width 0.25) (layer B.Cu) (net 10)) + (segment (start 206.8576 99.822) (end 191.6176 115.062) (width 0.25) (layer B.Cu) (net 10)) + (segment (start 184.18001 115.79399) (end 184.18001 118.23239) (width 0.25) (layer B.Cu) (net 10)) + (segment (start 233.478 99.822) (end 206.8576 99.822) (width 0.25) (layer B.Cu) (net 10)) + (segment (start 238.05 95.25) (end 233.478 99.822) (width 0.25) (layer B.Cu) (net 10)) + (via (at 184.18001 121.2088) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 184.18001 118.23239) (end 184.18001 120.77871) (width 0.25) (layer B.Cu) (net 10) (tstamp 5F9F1F0E)) + (via (at 184.18001 118.23239) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 184.18001 119.56749) (end 184.0119 119.7356) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 184.18001 118.23239) (end 184.18001 119.56749) (width 0.25) (layer F.Cu) (net 10)) (segment (start 231.446 99.314) (end 210.81436 99.314) (width 0.25) (layer B.Cu) (net 11)) - (segment (start 197.612 118.11) (end 195.586215 120.135785) (width 0.25) (layer B.Cu) (net 11)) (segment (start 235.51 95.25) (end 231.446 99.314) (width 0.25) (layer B.Cu) (net 11) (status 10)) - (segment (start 210.81436 99.314) (end 197.612 112.51636) (width 0.25) (layer B.Cu) (net 11)) - (segment (start 180.346215 120.135785) (end 178.308 122.174) (width 0.25) (layer B.Cu) (net 11)) - (segment (start 197.612 112.51636) (end 197.612 118.11) (width 0.25) (layer B.Cu) (net 11)) (segment (start 178.6525 133.7675) (end 178.435 133.985) (width 0.5) (layer F.Cu) (net 11) (status 30)) (segment (start 181.61 133.7675) (end 178.6525 133.7675) (width 0.5) (layer F.Cu) (net 11) (status 30)) (via (at 178.435 130.81) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 11)) (segment (start 178.435 133.985) (end 178.435 130.81) (width 0.25) (layer F.Cu) (net 11) (status 10)) - (segment (start 178.435 127.635) (end 177.165 126.365) (width 0.25) (layer B.Cu) (net 11)) - (segment (start 178.435 130.81) (end 178.435 127.635) (width 0.25) (layer B.Cu) (net 11)) - (segment (start 178.308 125.222) (end 177.165 126.365) (width 0.25) (layer B.Cu) (net 11)) (segment (start 235.543 95.217) (end 235.51 95.25) (width 0.25) (layer F.Cu) (net 11) (status 30)) (segment (start 235.543 91.2495) (end 235.543 95.217) (width 0.25) (layer F.Cu) (net 11) (status 30)) - (segment (start 229.414 98.806) (end 210.68595 98.806) (width 0.25) (layer B.Cu) (net 12)) + (segment (start 210.81436 99.314) (end 206.6036 99.314) (width 0.25) (layer B.Cu) (net 11)) + (segment (start 206.6036 99.314) (end 191.4144 114.5032) (width 0.25) (layer B.Cu) (net 11)) + (segment (start 191.4144 114.5032) (end 180.34 114.5032) (width 0.25) (layer B.Cu) (net 11)) + (segment (start 180.34 114.5032) (end 179.0192 115.824) (width 0.25) (layer B.Cu) (net 11)) + (via (at 179.0192 121.3104) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (segment (start 179.0192 115.824) (end 179.0192 118.5672) (width 0.25) (layer B.Cu) (net 11)) + (segment (start 179.0192 119.8737) (end 178.9319 119.7864) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 179.0192 121.158) (end 179.0192 119.8737) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 179.0192 118.5672) (end 179.0192 121.158) (width 0.25) (layer B.Cu) (net 11) (tstamp 5F9F11A6)) + (via (at 179.0192 118.2624) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (segment (start 178.9319 118.6545) (end 179.0192 118.5672) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 178.9319 119.7864) (end 178.9319 118.6545) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 179.0192 130.2258) (end 178.435 130.81) (width 0.25) (layer B.Cu) (net 11)) + (segment (start 179.0192 121.158) (end 179.0192 130.2258) (width 0.25) (layer B.Cu) (net 11)) (segment (start 232.97 95.25) (end 229.414 98.806) (width 0.25) (layer B.Cu) (net 12) (status 10)) - (via (at 196.215 112.395) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 12)) - (segment (start 195.7975 111.9775) (end 196.215 112.395) (width 0.25) (layer F.Cu) (net 12)) - (segment (start 195.7975 110.49) (end 195.7975 111.9775) (width 0.25) (layer F.Cu) (net 12) (status 10)) - (segment (start 196.215 113.03) (end 196.338475 113.153475) (width 0.25) (layer B.Cu) (net 12)) - (segment (start 196.215 112.395) (end 196.215 113.03) (width 0.25) (layer B.Cu) (net 12)) - (segment (start 196.338475 113.153475) (end 195.23195 114.26) (width 0.25) (layer B.Cu) (net 12)) - (segment (start 210.68595 98.806) (end 196.338475 113.153475) (width 0.25) (layer B.Cu) (net 12)) - (segment (start 195.7975 110.49) (end 195.7975 112.1775) (width 0.25) (layer F.Cu) (net 12) (status 10)) - (segment (start 193.875 114.1) (end 193.875 118.745) (width 0.25) (layer F.Cu) (net 12) (status 20)) - (segment (start 195.7975 112.1775) (end 193.875 114.1) (width 0.25) (layer F.Cu) (net 12)) (segment (start 232.97 92.677) (end 231.606 91.313) (width 0.25) (layer F.Cu) (net 12) (status 20)) (segment (start 232.97 95.25) (end 232.97 92.677) (width 0.25) (layer F.Cu) (net 12) (status 10)) - (segment (start 193.7655 118.8545) (end 193.875 118.745) (width 0.25) (layer F.Cu) (net 12) (status 30)) - (segment (start 193.7655 121.031) (end 193.7655 118.8545) (width 0.25) (layer F.Cu) (net 12) (status 30)) - (segment (start 188.3775 107.315) (end 187.325 107.315) (width 0.25) (layer F.Cu) (net 13) (status 10)) - (segment (start 187.325 107.315) (end 186.055 108.585) (width 0.25) (layer F.Cu) (net 13)) - (via (at 186.055 108.585) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 13)) - (segment (start 185.0025 107.5325) (end 186.055 108.585) (width 0.25) (layer F.Cu) (net 13) (status 10)) - (segment (start 185.0025 107.315) (end 185.0025 107.5325) (width 0.25) (layer F.Cu) (net 13) (status 30)) - (segment (start 229.4675 98.425) (end 228.6 98.425) (width 0.25) (layer F.Cu) (net 13) (status 10)) - (segment (start 186.69 107.95) (end 186.055 108.585) (width 0.25) (layer B.Cu) (net 13)) - (segment (start 200.90554 107.95) (end 186.69 107.95) (width 0.25) (layer B.Cu) (net 13)) - (segment (start 210.499549 98.355991) (end 200.90554 107.95) (width 0.25) (layer B.Cu) (net 13)) + (segment (start 189.8396 84.8503) (end 192.4812 84.8503) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 192.4812 84.8503) (end 199.6583 84.8503) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 199.6583 84.8503) (end 200.2028 85.3948) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 200.2028 85.3948) (end 200.2028 95.0976) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 202.9603 97.8551) (end 202.9603 100.1268) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 200.2028 95.0976) (end 202.9603 97.8551) (width 0.25) (layer F.Cu) (net 12)) + (via (at 204.1652 99.4156) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 12)) + (segment (start 210.8708 98.806) (end 204.7748 98.806) (width 0.25) (layer B.Cu) (net 12)) + (segment (start 204.7748 98.806) (end 204.1652 99.4156) (width 0.25) (layer B.Cu) (net 12)) + (segment (start 229.414 98.806) (end 210.8708 98.806) (width 0.25) (layer B.Cu) (net 12)) + (segment (start 210.8708 98.806) (end 210.68595 98.806) (width 0.25) (layer B.Cu) (net 12)) + (segment (start 203.6715 99.4156) (end 202.9603 100.1268) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 204.1652 99.4156) (end 203.6715 99.4156) (width 0.25) (layer F.Cu) (net 12)) (segment (start 227.324009 98.355991) (end 210.499549 98.355991) (width 0.25) (layer B.Cu) (net 13)) (segment (start 230.43 95.25) (end 227.324009 98.355991) (width 0.25) (layer B.Cu) (net 13) (status 10)) + (segment (start 197.4811 99.7641) (end 197.8438 100.1268) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 189.7888 91.3019) (end 192.5828 91.3019) (width 0.25) (layer F.Cu) (net 13)) + (via (at 198.4756 98.7552) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 13)) + (segment (start 198.874809 98.355991) (end 198.4756 98.7552) (width 0.25) (layer B.Cu) (net 13)) + (segment (start 210.499549 98.355991) (end 198.874809 98.355991) (width 0.25) (layer B.Cu) (net 13)) + (segment (start 197.5104 99.154715) (end 197.5104 99.1616) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 197.909915 98.7552) (end 197.5104 99.154715) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 198.4756 98.7552) (end 197.909915 98.7552) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 197.5104 99.1616) (end 197.4811 99.7641) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 197.4811 96.3676) (end 197.5104 99.1616) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 193.1404 91.3019) (end 192.5828 91.3019) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 197.4811 95.6426) (end 193.1404 91.3019) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 197.4811 96.3676) (end 197.4811 95.6426) (width 0.25) (layer F.Cu) (net 13)) (segment (start 219.71 107.7325) (end 219.6735 107.696) (width 0.25) (layer F.Cu) (net 14) (status 30)) (segment (start 219.71 110.9075) (end 219.71 107.7325) (width 0.25) (layer F.Cu) (net 14) (status 30)) - (segment (start 261.366 100.838) (end 261.80499 100.39901) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 261.80499 100.39901) (end 261.80499 80.20345) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 215.66099 105.112178) (end 219.935168 100.838) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 219.935168 100.838) (end 261.366 100.838) (width 0.25) (layer F.Cu) (net 15)) (segment (start 208.835 128.905) (end 208.835 116.539) (width 0.25) (layer B.Cu) (net 15) (status 10)) (segment (start 220.7625 78.105) (end 220.7625 75.3475) (width 0.25) (layer F.Cu) (net 15) (status 10)) (segment (start 219.1125 73.6975) (end 219.0375 73.6975) (width 0.25) (layer F.Cu) (net 15)) @@ -6054,33 +6136,19 @@ (via (at 215.66099 109.33201) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 15)) (segment (start 215.265 109.728) (end 215.66099 109.33201) (width 0.25) (layer B.Cu) (net 15)) (segment (start 212.344 109.728) (end 215.265 109.728) (width 0.25) (layer B.Cu) (net 15)) - (segment (start 226.3734 114.99299) (end 228.3829 114.99299) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 225.87501 107.0892) (end 225.87501 114.4946) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 226.67018 106.48301) (end 226.4812 106.48301) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 228.3829 114.99299) (end 228.53099 114.8449) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 227.401408 105.751782) (end 226.67018 106.48301) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 227.401408 101.854) (end 227.401408 105.751782) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 233.748588 101.854) (end 227.401408 101.854) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 227.966705 126.94501) (end 230.450981 124.460734) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 230.450981 105.151607) (end 233.748588 101.854) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 226.693295 126.94501) (end 227.966705 126.94501) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.31999 122.571705) (end 226.693295 126.94501) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.6675 77.47) (end 222.6675 76.595) (width 0.25) (layer F.Cu) (net 15) (status 30)) - (segment (start 232.90767 78.75499) (end 260.35653 78.75499) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.6675 76.595) (end 222.99251 76.26999) (width 0.25) (layer F.Cu) (net 15) (status 10)) - (segment (start 261.80499 100.5246) (end 261.37561 100.95398) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 226.4812 106.48301) (end 225.87501 107.0892) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.99251 76.26999) (end 230.42267 76.26999) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 230.450981 124.460734) (end 230.450981 105.151607) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 261.80499 80.20345) (end 261.80499 100.5246) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 230.42267 76.26999) (end 232.90767 78.75499) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 225.87501 114.4946) (end 226.3734 114.99299) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 261.37561 100.95398) (end 227.028607 100.953981) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 215.66099 105.112178) (end 219.390784 101.382384) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 219.390784 101.382384) (end 219.528768 101.2444) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 227.086598 100.89599) (end 226.600204 101.382384) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 261.80499 100.19581) (end 261.10481 100.89599) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 261.80499 80.20345) (end 261.80499 100.19581) (width 0.25) (layer F.Cu) (net 15)) (segment (start 260.35653 78.75499) (end 261.80499 80.20345) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 227.028607 100.953981) (end 222.65682 105.325768) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.65682 105.325768) (end 222.65682 109.86999) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.65682 109.86999) (end 222.31999 110.20682) (width 0.25) (layer F.Cu) (net 15)) - (segment (start 222.31999 110.20682) (end 222.31999 122.571705) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 232.90767 78.75499) (end 260.35653 78.75499) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 230.42267 76.26999) (end 232.90767 78.75499) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 261.10481 100.89599) (end 227.086598 100.89599) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 222.99251 76.26999) (end 230.42267 76.26999) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 222.6675 76.595) (end 222.99251 76.26999) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 226.600204 101.382384) (end 219.390784 101.382384) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 222.6675 77.47) (end 222.6675 76.595) (width 0.25) (layer F.Cu) (net 15)) (segment (start 227.2935 110.871) (end 227.33 110.9075) (width 0.25) (layer F.Cu) (net 16) (status 30)) (segment (start 227.2935 107.696) (end 227.2935 110.871) (width 0.25) (layer F.Cu) (net 16) (status 30)) (segment (start 250.19 107.7325) (end 250.1535 107.696) (width 0.25) (layer F.Cu) (net 17) (status 30)) @@ -6118,22 +6186,10 @@ (segment (start 262.382 105.41) (end 268.224 105.41) (width 0.5) (layer B.Cu) (net 22)) (segment (start 268.224 131.318) (end 268.224 105.41) (width 0.5) (layer B.Cu) (net 22)) (segment (start 268.224 105.41) (end 268.224 61.214) (width 0.5) (layer B.Cu) (net 22)) - (segment (start 201.44025 112.24975) (end 198.628 109.4375) (width 0.5) (layer F.Cu) (net 22)) - (via (at 202.184 112.903) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 22)) - (segment (start 202.13875 112.94825) (end 201.44025 112.24975) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 202.13875 112.94825) (end 202.184 112.903) (width 0.5) (layer F.Cu) (net 22)) - (segment (start 207.8085 118.618) (end 202.13875 112.94825) (width 0.5) (layer F.Cu) (net 22) (status 10)) - (segment (start 202.184 112.903) (end 202.184 111.506) (width 0.5) (layer B.Cu) (net 22)) (segment (start 264.795 57.785) (end 263.3615 57.785) (width 0.5) (layer F.Cu) (net 22) (status 30)) (segment (start 217.86401 58.87299) (end 200.913 75.824) (width 0.5) (layer F.Cu) (net 22) (status 20)) (segment (start 263.70701 58.87299) (end 217.86401 58.87299) (width 0.5) (layer F.Cu) (net 22) (status 10)) (segment (start 264.795 57.785) (end 263.70701 58.87299) (width 0.5) (layer F.Cu) (net 22) (status 30)) - (segment (start 207.7085 105.9815) (end 211.64199 102.04801) (width 0.5) (layer B.Cu) (net 22)) - (segment (start 207.7085 105.9815) (end 208.28 105.41) (width 0.5) (layer B.Cu) (net 22)) - (segment (start 202.184 111.506) (end 207.7085 105.9815) (width 0.5) (layer B.Cu) (net 22)) - (segment (start 216.662 103.251) (end 215.45901 102.04801) (width 0.5) (layer B.Cu) (net 22)) - (segment (start 216.662 105.41) (end 216.662 103.251) (width 0.5) (layer B.Cu) (net 22)) - (segment (start 211.64199 102.04801) (end 215.45901 102.04801) (width 0.5) (layer B.Cu) (net 22)) (segment (start 218.44 136.525) (end 220.02901 138.11401) (width 0.5) (layer B.Cu) (net 22) (status 10)) (segment (start 253.93801 138.11401) (end 254.56999 138.11401) (width 0.5) (layer B.Cu) (net 22)) (segment (start 220.02901 138.11401) (end 253.93801 138.11401) (width 0.5) (layer B.Cu) (net 22)) @@ -6169,6 +6225,13 @@ (segment (start 206.602 81.4705) (end 205.8895 81.4705) (width 0.5) (layer F.Cu) (net 22) (status 30)) (segment (start 206.602 76.493) (end 206.895 76.2) (width 0.5) (layer F.Cu) (net 22) (status 30)) (segment (start 206.602 81.4705) (end 206.602 76.493) (width 0.5) (layer F.Cu) (net 22) (status 30)) + (via (at 207.700746 111.628054) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 207.33399 111.99481) (end 207.700746 111.628054) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 207.33399 117.26849) (end 207.33399 111.99481) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 207.8085 117.743) (end 207.33399 117.26849) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 207.8085 118.618) (end 207.8085 117.743) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 213.9188 105.41) (end 216.662 105.41) (width 0.25) (layer B.Cu) (net 22)) + (segment (start 207.700746 111.628054) (end 213.9188 105.41) (width 0.25) (layer B.Cu) (net 22)) (segment (start 232.6275 133.35) (end 232.6275 134.6565) (width 0.25) (layer F.Cu) (net 23) (status 10)) (segment (start 230.759 136.525) (end 226.06 136.525) (width 0.25) (layer F.Cu) (net 23) (status 20)) (segment (start 232.6275 134.6565) (end 230.759 136.525) (width 0.25) (layer F.Cu) (net 23)) @@ -6191,17 +6254,6 @@ (segment (start 172.01999 106.14401) (end 171.98599 106.14401) (width 0.5) (layer F.Cu) (net 24)) (segment (start 176.582 101.582) (end 172.01999 106.14401) (width 0.5) (layer F.Cu) (net 24) (status 10)) (segment (start 176.632 70.582) (end 176.632 70.968) (width 0.5) (layer F.Cu) (net 25) (status 30)) - (via (at 207.264 99.314) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 25)) - (segment (start 207.264 99.314) (end 207.829685 99.314) (width 0.25) (layer F.Cu) (net 25)) - (segment (start 207.829685 99.314) (end 207.9625 99.314) (width 0.25) (layer F.Cu) (net 25)) - (via (at 210.1215 104.902) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 25)) - (segment (start 210.1215 101.473) (end 210.1215 104.902) (width 0.25) (layer F.Cu) (net 25)) - (segment (start 207.9625 99.314) (end 210.1215 101.473) (width 0.25) (layer F.Cu) (net 25)) - (via (at 209.169 110.998) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 25)) - (segment (start 210.1215 110.0455) (end 209.169 110.998) (width 0.25) (layer B.Cu) (net 25)) - (segment (start 210.1215 104.902) (end 210.1215 110.0455) (width 0.25) (layer B.Cu) (net 25)) - (segment (start 210.525 110.998) (end 209.734685 110.998) (width 0.25) (layer F.Cu) (net 25)) - (segment (start 209.734685 110.998) (end 209.169 110.998) (width 0.25) (layer F.Cu) (net 25)) (segment (start 210.7295 111.2025) (end 210.525 110.998) (width 0.25) (layer F.Cu) (net 25) (status 10)) (segment (start 210.7295 112.0775) (end 210.7295 111.2025) (width 0.25) (layer F.Cu) (net 25) (status 30)) (segment (start 176.632 71.332) (end 176.632 70.582) (width 0.5) (layer F.Cu) (net 25) (status 30)) @@ -6211,6 +6263,20 @@ (segment (start 191.3255 68.519) (end 190.4255 69.419) (width 0.5) (layer F.Cu) (net 25) (status 10)) (segment (start 185.142002 73.582) (end 178.882 73.582) (width 0.5) (layer F.Cu) (net 25)) (segment (start 191.3255 67.969) (end 191.3255 68.519) (width 0.5) (layer F.Cu) (net 25) (status 30)) + (via (at 205.1304 96.1644) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 25)) + (via (at 185.5216 78.232) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 25)) + (segment (start 185.5216 81.133802) (end 185.5216 78.232) (width 0.25) (layer B.Cu) (net 25)) + (segment (start 200.552198 96.1644) (end 185.5216 81.133802) (width 0.25) (layer B.Cu) (net 25)) + (segment (start 205.1304 96.1644) (end 200.552198 96.1644) (width 0.25) (layer B.Cu) (net 25)) + (segment (start 185.5216 73.961598) (end 185.5216 78.232) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 185.142002 73.582) (end 185.5216 73.961598) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 209.69199 111.75249) (end 210.017 112.0775) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 209.69199 105.33151) (end 209.69199 111.75249) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 212.2424 102.7811) (end 209.69199 105.33151) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 210.017 112.0775) (end 210.7295 112.0775) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 212.2424 99.76441) (end 212.2424 102.7811) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 208.64239 96.1644) (end 212.2424 99.76441) (width 0.25) (layer F.Cu) (net 25)) + (segment (start 205.1304 96.1644) (end 208.64239 96.1644) (width 0.25) (layer F.Cu) (net 25)) (segment (start 260.085 48.485) (end 253.96 54.61) (width 0.5) (layer F.Cu) (net 26) (status 20)) (segment (start 264.795 48.485) (end 260.085 48.485) (width 0.5) (layer F.Cu) (net 26) (status 10)) (segment (start 204.6135 91.2965) (end 202.1205 91.2965) (width 0.25) (layer F.Cu) (net 27) (status 20)) @@ -6220,16 +6286,6 @@ (segment (start 196.343 75.824) (end 195.613 75.824) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 212.65 95.25) (end 212.65 94.22) (width 0.25) (layer B.Cu) (net 28) (status 10)) (segment (start 196.211 75.692) (end 196.343 75.824) (width 0.5) (layer F.Cu) (net 28) (status 30)) - (segment (start 196.85 118.745) (end 198.755 118.745) (width 0.25) (layer F.Cu) (net 28) (status 10)) - (via (at 200.66 115.57) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 200.66 116.782998) (end 200.66 115.57) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 198.755 118.687998) (end 200.66 116.782998) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 198.755 118.745) (end 198.755 118.687998) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 200.66 115.57) (end 200.66 113.665) (width 0.25) (layer B.Cu) (net 28)) - (via (at 200.66 113.665) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 200.66 112.282686) (end 194.95299 106.575676) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 200.66 113.665) (end 200.66 112.282686) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 179.2875 107.315) (end 182.0275 107.315) (width 0.25) (layer F.Cu) (net 28) (status 30)) (segment (start 179.69001 135.70499) (end 178.435 136.96) (width 0.25) (layer F.Cu) (net 28) (status 20)) (segment (start 186.69 136.7425) (end 185.65249 135.70499) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 193.27249 135.70499) (end 194.31 136.7425) (width 0.25) (layer F.Cu) (net 28) (status 20)) @@ -6237,40 +6293,10 @@ (segment (start 186.69 136.7425) (end 187.72751 135.70499) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 200.89249 135.70499) (end 201.93 136.7425) (width 0.25) (layer F.Cu) (net 28) (status 20)) (segment (start 194.31 136.7425) (end 195.34751 135.70499) (width 0.25) (layer F.Cu) (net 28) (status 10)) - (via (at 190.278 105.41) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 183.9325 105.41) (end 190.278 105.41) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 182.0275 107.315) (end 183.9325 105.41) (width 0.25) (layer F.Cu) (net 28) (status 10)) - (via (at 194.95299 105.41799) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 194.945 105.41) (end 194.95299 105.41799) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 190.278 105.41) (end 194.945 105.41) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 194.95299 106.575676) (end 194.95299 105.41799) (width 0.25) (layer F.Cu) (net 28)) - (via (at 179.705 110.49) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 179.2875 110.0725) (end 179.705 110.49) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 179.2875 107.315) (end 179.2875 110.0725) (width 0.25) (layer F.Cu) (net 28) (status 10)) - (segment (start 179.705 110.49) (end 179.705 119.38) (width 0.25) (layer B.Cu) (net 28)) - (via (at 179.705 119.38) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 179.705 119.38) (end 179.705 123.19) (width 0.25) (layer F.Cu) (net 28)) - (via (at 179.705 123.19) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (via (at 179.89001 135.70499) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 179.705 135.51998) (end 179.89001 135.70499) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 179.705 123.19) (end 179.705 135.51998) (width 0.25) (layer B.Cu) (net 28)) (segment (start 179.89001 135.70499) (end 179.69001 135.70499) (width 0.25) (layer F.Cu) (net 28)) (segment (start 185.65249 135.70499) (end 179.89001 135.70499) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 200.025 118.745) (end 200.025 126.365) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 200.66 115.57) (end 200.66 116.205) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 200.025 117.417998) (end 200.025 118.745) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 200.66 116.205) (end 200.66 116.782998) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 200.66 116.782998) (end 200.025 117.417998) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 200.025 126.365) (end 200.750001 127.090001) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 200.750001 127.090001) (end 201.93 128.27) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 201.93 128.27) (end 201.93 134.62) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 201.93 134.62) (end 201.295 135.255) (width 0.25) (layer B.Cu) (net 28)) - (via (at 199.39 135.255) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) - (segment (start 201.295 135.255) (end 199.39 135.255) (width 0.25) (layer B.Cu) (net 28)) - (segment (start 199.39 135.51998) (end 199.57501 135.70499) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 199.39 135.255) (end 199.39 135.51998) (width 0.25) (layer F.Cu) (net 28)) (segment (start 199.57501 135.70499) (end 200.89249 135.70499) (width 0.25) (layer F.Cu) (net 28)) - (segment (start 195.34751 135.70499) (end 199.57501 135.70499) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 195.34751 135.70499) (end 199.42261 135.70499) (width 0.25) (layer F.Cu) (net 28)) (segment (start 209.55 136.03) (end 209.55 136.7425) (width 0.25) (layer F.Cu) (net 28) (status 30)) (segment (start 208.019998 134.499998) (end 209.55 136.03) (width 0.25) (layer F.Cu) (net 28) (status 20)) (segment (start 207.139998 134.499998) (end 208.019998 134.499998) (width 0.25) (layer F.Cu) (net 28)) @@ -6305,6 +6331,33 @@ (segment (start 210.5152 88.4676) (end 211.5306 88.4676) (width 0.25) (layer F.Cu) (net 28) (status 10)) (segment (start 217.07 85.317) (end 212.725 89.662) (width 0.5) (layer B.Cu) (net 28)) (segment (start 225.6425 85.317) (end 217.07 85.317) (width 0.5) (layer B.Cu) (net 28)) + (segment (start 194.6275 75.692) (end 193.8528 75.692) (width 0.25) (layer B.Cu) (net 28)) + (via (at 187.6044 82.1436) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) + (segment (start 187.6044 81.9404) (end 187.6044 82.1436) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 193.8528 75.692) (end 187.6044 81.9404) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 188.9138 88.3269) (end 189.7888 88.3269) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 187.6044 87.0175) (end 188.9138 88.3269) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 187.6044 82.1436) (end 187.6044 87.0175) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 187.6044 91.8816) (end 187.6044 87.0175) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 189.8396 94.1168) (end 187.6044 91.8816) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 189.8396 94.8293) (end 189.8396 94.1168) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 189.5713 82.1436) (end 187.6044 82.1436) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 189.8396 81.8753) (end 189.5713 82.1436) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 199.42261 135.70499) (end 199.57501 135.70499) (width 0.25) (layer F.Cu) (net 28) (tstamp 5F9EF6C3)) + (via (at 176.6316 135.636) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) + (segment (start 177.8235 135.636) (end 176.6316 135.636) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 178.435 136.2475) (end 177.8235 135.636) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 178.435 136.96) (end 178.435 136.2475) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 175.106001 133.310999) (end 172.911401 133.310999) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 176.6316 134.836598) (end 175.106001 133.310999) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 176.6316 135.636) (end 176.6316 134.836598) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 172.911401 133.310999) (end 172.2628 132.662398) (width 0.25) (layer B.Cu) (net 28)) + (via (at 187.5028 94.6912) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 28)) + (segment (start 187.16801 94.6912) (end 187.5028 94.6912) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 172.2628 109.59641) (end 187.16801 94.6912) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 172.2628 132.662398) (end 172.2628 109.59641) (width 0.25) (layer B.Cu) (net 28)) + (segment (start 189.7015 94.6912) (end 189.8396 94.8293) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 187.5028 94.6912) (end 189.7015 94.6912) (width 0.25) (layer F.Cu) (net 28)) (segment (start 223.3565 42.037) (end 240.691002 42.037) (width 0.25) (layer F.Cu) (net 29) (status 10)) (via (at 260.858 46.609) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 29)) (segment (start 240.691002 42.037) (end 256.286 42.037) (width 0.25) (layer F.Cu) (net 29)) @@ -6327,29 +6380,37 @@ (segment (start 260.858 66.4464) (end 251.639 66.421) (width 0.25) (layer B.Cu) (net 29)) (segment (start 260.858 66.421) (end 260.858 66.4464) (width 0.25) (layer B.Cu) (net 29)) (segment (start 219.71 125.77) (end 219.71 120.245) (width 0.5) (layer F.Cu) (net 30) (status 30)) - (segment (start 220.585 113.8825) (end 219.71 113.8825) (width 0.25) (layer F.Cu) (net 30) (status 20)) - (segment (start 221.385001 114.682501) (end 220.585 113.8825) (width 0.25) (layer F.Cu) (net 30)) - (segment (start 220.36 120.245) (end 221.385001 119.219999) (width 0.25) (layer F.Cu) (net 30)) - (segment (start 219.71 120.245) (end 220.36 120.245) (width 0.25) (layer F.Cu) (net 30) (status 10)) - (segment (start 221.361 106.1945) (end 221.361 115.824) (width 0.25) (layer F.Cu) (net 30)) (segment (start 221.3245 106.158) (end 221.361 106.1945) (width 0.25) (layer F.Cu) (net 30)) (segment (start 221.3245 105.283) (end 221.3245 106.158) (width 0.25) (layer F.Cu) (net 30) (status 10)) - (segment (start 221.361 115.824) (end 221.385001 114.682501) (width 0.25) (layer F.Cu) (net 30)) - (segment (start 221.385001 119.219999) (end 221.361 115.824) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 219.71 113.8825) (end 220.585 113.8825) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.385001 114.682501) (end 221.385001 114.705001) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.385001 114.705001) (end 221.9452 115.2652) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.9452 115.2652) (end 221.9452 119.2784) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 220.9786 120.245) (end 220.1686 120.245) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.9452 119.2784) (end 220.9786 120.245) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 220.1686 120.245) (end 220.36 120.245) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 219.71 120.245) (end 220.1686 120.245) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.3245 114.5651) (end 221.2848 114.6048) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.3245 105.283) (end 221.3245 114.5651) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.2848 114.6048) (end 220.585 113.8825) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 221.385001 114.682501) (end 221.2848 114.6048) (width 0.25) (layer F.Cu) (net 30)) (segment (start 208.5895 91.313) (end 208.933501 91.657001) (width 0.25) (layer F.Cu) (net 31)) (segment (start 208.933501 91.657001) (end 217.143499 91.657001) (width 0.25) (layer F.Cu) (net 31)) (segment (start 208.0895 91.313) (end 208.5895 91.313) (width 0.25) (layer F.Cu) (net 31) (status 10)) (segment (start 219.0115 89.789) (end 217.143499 91.657001) (width 0.25) (layer F.Cu) (net 31)) (segment (start 219.0115 87.0345) (end 219.0115 89.789) (width 0.25) (layer F.Cu) (net 31) (status 10)) - (segment (start 243.13 69.85) (end 243.13 78.688) (width 0.25) (layer B.Cu) (net 32) (status 10)) - (segment (start 243.13 78.688) (end 233.097 78.688) (width 0.25) (layer B.Cu) (net 32)) (via (at 231.775 80.01) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 32)) - (segment (start 233.097 78.688) (end 231.775 80.01) (width 0.25) (layer B.Cu) (net 32)) (segment (start 231.775 80.01) (end 231.775 81.8) (width 0.25) (layer F.Cu) (net 32) (status 20)) (segment (start 227.1665 81.9925) (end 227.1665 82.8675) (width 0.25) (layer F.Cu) (net 32) (status 30)) (segment (start 227.859 81.3) (end 227.1665 81.9925) (width 0.25) (layer F.Cu) (net 32) (status 20)) (segment (start 231.275 81.3) (end 227.859 81.3) (width 0.25) (layer F.Cu) (net 32) (status 10)) (segment (start 231.775 81.8) (end 231.275 81.3) (width 0.25) (layer F.Cu) (net 32) (status 30)) + (segment (start 233.0704 78.5876) (end 231.775 80.01) (width 0.25) (layer B.Cu) (net 32)) + (segment (start 233.097 78.688) (end 233.0704 78.5876) (width 0.25) (layer B.Cu) (net 32)) + (segment (start 243.13 70.953086) (end 243.13 69.85) (width 0.25) (layer B.Cu) (net 32)) + (segment (start 243.13 71.074202) (end 243.13 70.953086) (width 0.25) (layer B.Cu) (net 32)) + (segment (start 235.616602 78.5876) (end 243.13 71.074202) (width 0.25) (layer B.Cu) (net 32)) + (segment (start 233.0704 78.5876) (end 235.616602 78.5876) (width 0.25) (layer B.Cu) (net 32)) (segment (start 214.7205 80.5955) (end 214.7205 81.4705) (width 0.25) (layer F.Cu) (net 33) (status 30)) (segment (start 214.7205 79.2995) (end 214.7205 80.5955) (width 0.25) (layer F.Cu) (net 33) (status 20)) (segment (start 214.0735 78.6525) (end 214.7205 79.2995) (width 0.25) (layer F.Cu) (net 33)) @@ -6363,16 +6424,14 @@ (segment (start 207.7215 78.74) (end 209.577 80.5955) (width 0.25) (layer F.Cu) (net 35) (status 20)) (via (at 207.772 78.74) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 35)) (segment (start 207.7215 78.74) (end 207.772 78.74) (width 0.25) (layer F.Cu) (net 35)) - (via (at 190.3755 72.964) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 35)) - (segment (start 196.1515 78.74) (end 190.3755 72.964) (width 0.25) (layer B.Cu) (net 35)) - (segment (start 207.772 78.74) (end 196.1515 78.74) (width 0.25) (layer B.Cu) (net 35)) - (segment (start 190.3755 70.969) (end 190.3755 72.964) (width 0.25) (layer F.Cu) (net 35) (status 10)) + (segment (start 207.772 78.74) (end 195.6816 78.74) (width 0.25) (layer B.Cu) (net 35)) + (via (at 195.6816 78.74) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 35)) + (segment (start 193.2432 78.74) (end 195.6816 78.74) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 190.3755 75.8723) (end 193.2432 78.74) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 190.3755 70.969) (end 190.3755 75.8723) (width 0.25) (layer F.Cu) (net 35)) (segment (start 175.895 129.46) (end 195.58 129.46) (width 0.5) (layer F.Cu) (net 36) (status 30)) (segment (start 195.58 129.46) (end 195.58 129.794) (width 0.5) (layer F.Cu) (net 36) (status 30)) - (segment (start 189.23 116.76) (end 175.895 116.76) (width 0.5) (layer F.Cu) (net 36) (status 30)) - (segment (start 175.895 116.76) (end 175.086 116.76) (width 0.5) (layer F.Cu) (net 36) (status 30)) - (segment (start 175.086 116.76) (end 172.72 119.126) (width 0.5) (layer F.Cu) (net 36) (status 10)) - (segment (start 172.72 119.126) (end 172.72 127.762) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 176.1998 112.7976) (end 175.3908 112.7976) (width 0.5) (layer F.Cu) (net 36) (status 30)) (segment (start 174.418 129.46) (end 175.895 129.46) (width 0.5) (layer F.Cu) (net 36) (status 20)) (segment (start 172.72 127.762) (end 174.418 129.46) (width 0.5) (layer F.Cu) (net 36)) (segment (start 211.328 128.898) (end 211.335 128.905) (width 0.5) (layer F.Cu) (net 36) (status 30)) @@ -6382,10 +6441,6 @@ (segment (start 209.296 124.69) (end 204.7365 124.69) (width 0.25) (layer F.Cu) (net 36) (status 30)) (segment (start 217.932 42.037) (end 217.678 41.783) (width 0.25) (layer F.Cu) (net 36) (status 30)) (segment (start 220.3815 42.037) (end 217.932 42.037) (width 0.25) (layer F.Cu) (net 36) (status 30)) - (segment (start 217.678 42.783) (end 171.958 88.503) (width 0.25) (layer B.Cu) (net 36)) - (segment (start 174.67 116.76) (end 175.895 116.76) (width 0.25) (layer B.Cu) (net 36) (status 20)) - (segment (start 171.958 114.048) (end 174.67 116.76) (width 0.25) (layer B.Cu) (net 36)) - (segment (start 171.958 88.503) (end 171.958 114.048) (width 0.25) (layer B.Cu) (net 36)) (segment (start 195.58 129.46) (end 197.565 131.445) (width 0.5) (layer F.Cu) (net 36) (status 10)) (segment (start 197.565 131.445) (end 210.185 131.445) (width 0.5) (layer F.Cu) (net 36)) (segment (start 211.335 130.295) (end 211.335 128.905) (width 0.5) (layer F.Cu) (net 36) (status 20)) @@ -6399,22 +6454,53 @@ (segment (start 263.062 67.136) (end 261.532201 65.606201) (width 0.25) (layer B.Cu) (net 36)) (segment (start 261.532201 65.606201) (end 261.532201 54.752199) (width 0.25) (layer B.Cu) (net 36)) (segment (start 264.287 67.136) (end 263.062 67.136) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 172.72 119.4308) (end 172.72 113.7412) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 172.72 119.126) (end 172.72 119.4308) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 172.72 119.4308) (end 172.72 127.762) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 173.6636 112.7976) (end 173.6636 112.7976) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 172.72 113.7412) (end 173.6636 112.7976) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 176.1998 112.7976) (end 183.1848 112.7976) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 183.1848 112.7976) (end 189.5348 112.7976) (width 0.5) (layer F.Cu) (net 36)) + (segment (start 173.6636 112.7976) (end 176.1998 112.7976) (width 0.5) (layer F.Cu) (net 36) (tstamp 5F9F0DE3)) + (via (at 173.6636 112.7976) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 173.263601 87.187999) (end 173.2788 87.1728) (width 0.5) (layer B.Cu) (net 36)) + (segment (start 217.678 42.783) (end 173.2788 87.1728) (width 0.25) (layer B.Cu) (net 36)) + (via (at 173.2788 106.2228) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 173.6636 106.6076) (end 173.2788 106.2228) (width 0.25) (layer F.Cu) (net 36)) + (segment (start 173.6636 112.7976) (end 173.6636 106.6076) (width 0.25) (layer F.Cu) (net 36)) + (segment (start 173.2788 87.203198) (end 173.263601 87.187999) (width 0.25) (layer B.Cu) (net 36)) + (segment (start 173.2788 106.2228) (end 173.2788 87.203198) (width 0.25) (layer B.Cu) (net 36)) (segment (start 210.246 119.1555) (end 210.7835 118.618) (width 0.25) (layer F.Cu) (net 37) (status 30)) (segment (start 210.246 121.69) (end 210.246 119.1555) (width 0.25) (layer F.Cu) (net 37) (status 30)) (segment (start 210.7835 118.618) (end 210.7835 118.037) (width 0.25) (layer F.Cu) (net 37) (status 30)) (segment (start 210.7835 117.797) (end 210.7835 118.618) (width 0.25) (layer F.Cu) (net 37) (status 30)) (segment (start 209.409 116.4225) (end 210.7835 117.797) (width 0.25) (layer F.Cu) (net 37) (status 20)) (segment (start 208.534 116.4225) (end 209.409 116.4225) (width 0.25) (layer F.Cu) (net 37) (status 10)) - (via (at 201.168 117.348) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) - (segment (start 201.422 121.7025) (end 201.422 117.602) (width 0.25) (layer F.Cu) (net 38) (status 10)) - (segment (start 201.422 117.602) (end 201.168 117.348) (width 0.25) (layer F.Cu) (net 38)) - (via (at 204.597 113.792) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) - (segment (start 201.168 117.221) (end 201.168 117.348) (width 0.25) (layer B.Cu) (net 38)) - (segment (start 204.597 113.792) (end 201.168 117.221) (width 0.25) (layer B.Cu) (net 38)) - (segment (start 204.597 103.78581) (end 204.62381 103.78581) (width 0.25) (layer F.Cu) (net 38)) - (segment (start 204.62381 103.78581) (end 205.232 104.394) (width 0.25) (layer F.Cu) (net 38)) - (segment (start 205.232 113.157) (end 204.597 113.792) (width 0.25) (layer F.Cu) (net 38)) - (segment (start 205.232 104.394) (end 205.232 113.157) (width 0.25) (layer F.Cu) (net 38)) + (via (at 201.8792 120.3452) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 201.422 120.8024) (end 201.8792 120.3452) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 201.422 121.7025) (end 201.422 120.8024) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 201.8792 120.3452) (end 201.8792 116.376598) (width 0.25) (layer B.Cu) (net 38)) + (via (at 260.0452 94.6404) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 260.0452 95.4024) (end 260.0452 94.6404) (width 0.25) (layer B.Cu) (net 38)) + (segment (start 260.0452 94.6404) (end 260.0452 84.410698) (width 0.25) (layer F.Cu) (net 38)) + (via (at 238.0488 75.0824) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 238.05 75.0812) (end 238.0488 75.0824) (width 0.25) (layer B.Cu) (net 38)) + (segment (start 238.05 69.85) (end 238.05 75.0812) (width 0.25) (layer B.Cu) (net 38)) + (via (at 240.3856 75.7925) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 238.7589 75.7925) (end 240.3856 75.7925) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 238.0488 75.0824) (end 238.7589 75.7925) (width 0.25) (layer F.Cu) (net 38)) + (via (at 255.6764 80.2132) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 244.8063 80.2132) (end 255.6764 80.2132) (width 0.25) (layer B.Cu) (net 38)) + (segment (start 240.3856 75.7925) (end 244.8063 80.2132) (width 0.25) (layer B.Cu) (net 38)) + (segment (start 256.228799 80.613199) (end 256.4892 80.8736) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 256.076399 80.613199) (end 256.228799 80.613199) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 255.6764 80.2132) (end 256.076399 80.613199) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 256.4892 80.8736) (end 255.847702 80.2132) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 260.0452 84.410698) (end 256.4892 80.8736) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 201.8792 116.376598) (end 216.147798 102.108) (width 0.25) (layer B.Cu) (net 38)) + (segment (start 216.147798 102.108) (end 258.9276 102.108) (width 0.25) (layer B.Cu) (net 38)) + (segment (start 260.0452 100.9904) (end 260.0452 94.6404) (width 0.25) (layer B.Cu) (net 38)) + (segment (start 258.9276 102.108) (end 260.0452 100.9904) (width 0.25) (layer B.Cu) (net 38)) (segment (start 202.1075 124.6775) (end 201.422 124.6775) (width 0.25) (layer F.Cu) (net 39) (status 30)) (segment (start 206.335 128.905) (end 202.1075 124.6775) (width 0.25) (layer F.Cu) (net 39) (status 30)) (via (at 207.01 132.295) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 39)) @@ -6426,32 +6512,29 @@ (segment (start 225.234018 97.905982) (end 225.451 97.689) (width 0.25) (layer B.Cu) (net 40)) (segment (start 210.196018 97.905982) (end 225.234018 97.905982) (width 0.25) (layer B.Cu) (net 40)) (segment (start 225.451 97.689) (end 227.89 95.25) (width 0.25) (layer B.Cu) (net 40) (status 20)) - (segment (start 201.93 110.0725) (end 201.93 109.677) (width 0.25) (layer F.Cu) (net 40) (status 30)) - (via (at 178.4985 109.2835) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 40)) - (segment (start 176.53 107.315) (end 178.4985 109.2835) (width 0.25) (layer F.Cu) (net 40) (status 10)) - (segment (start 176.3125 107.315) (end 176.53 107.315) (width 0.25) (layer F.Cu) (net 40) (status 30)) - (segment (start 178.308 109.474) (end 178.4985 109.2835) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 199.517 107.829685) (end 199.517 108.966) (width 0.25) (layer F.Cu) (net 40)) - (segment (start 200.6235 110.0725) (end 201.549 110.0725) (width 0.25) (layer F.Cu) (net 40) (status 20)) - (segment (start 199.517 108.966) (end 200.6235 110.0725) (width 0.25) (layer F.Cu) (net 40)) - (segment (start 203.708 109.575) (end 203.708 108.9875) (width 0.25) (layer F.Cu) (net 40) (status 20)) - (segment (start 203.2105 110.0725) (end 203.708 109.575) (width 0.25) (layer F.Cu) (net 40)) - (segment (start 201.549 110.0725) (end 203.2105 110.0725) (width 0.25) (layer F.Cu) (net 40) (status 10)) - (via (at 199.517 107.061) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 40)) - (segment (start 199.517 107.829685) (end 199.517 107.061) (width 0.25) (layer F.Cu) (net 40)) - (segment (start 180.594 107.061) (end 180.213 107.442) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 199.517 107.061) (end 180.594 107.061) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 180.213 107.442) (end 180.34 107.442) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 178.4985 109.2835) (end 180.213 107.442) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 201.041 107.061) (end 202.1205 105.9815) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 199.517 107.061) (end 201.041 107.061) (width 0.25) (layer B.Cu) (net 40)) - (segment (start 202.1205 105.9815) (end 210.196018 97.905982) (width 0.25) (layer B.Cu) (net 40)) (segment (start 227.611 94.971) (end 227.89 95.25) (width 0.25) (layer F.Cu) (net 40) (status 30)) (segment (start 227.611 91.2495) (end 227.611 94.971) (width 0.25) (layer F.Cu) (net 40) (status 30)) - (segment (start 199.378 114.554) (end 201.676 114.554) (width 0.25) (layer F.Cu) (net 41) (status 10)) - (segment (start 204.724 117.602) (end 204.724 121.7025) (width 0.25) (layer F.Cu) (net 41) (status 20)) - (segment (start 201.676 114.554) (end 204.724 117.602) (width 0.25) (layer F.Cu) (net 41)) - (segment (start 195.5435 114.554) (end 197.878 114.554) (width 0.25) (layer F.Cu) (net 42) (status 30)) + (segment (start 190.7146 97.8043) (end 189.8396 97.8043) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 192.4304 97.8043) (end 192.4812 97.7535) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 189.8396 97.8043) (end 192.4304 97.8043) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 192.4812 99.8585) (end 192.7495 100.1268) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 192.4812 97.7535) (end 192.4812 99.8585) (width 0.25) (layer F.Cu) (net 40)) + (via (at 193.9036 97.8916) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 40)) + (segment (start 193.917982 97.905982) (end 193.9036 97.8916) (width 0.25) (layer B.Cu) (net 40)) + (segment (start 210.196018 97.905982) (end 193.917982 97.905982) (width 0.25) (layer B.Cu) (net 40)) + (segment (start 193.7655 97.7535) (end 193.9036 97.8916) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 192.4812 97.7535) (end 193.7655 97.7535) (width 0.25) (layer F.Cu) (net 40)) + (via (at 193.9544 103.0224) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 40)) + (segment (start 193.9544 97.9424) (end 193.9036 97.8916) (width 0.25) (layer B.Cu) (net 40)) + (segment (start 193.9544 103.0224) (end 193.9544 97.9424) (width 0.25) (layer B.Cu) (net 40)) + (segment (start 193.4679 103.0224) (end 192.8075 103.6828) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 193.9544 103.0224) (end 193.4679 103.0224) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 204.724 120.99) (end 206.4004 119.3136) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 204.724 121.7025) (end 204.724 120.99) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 206.4004 119.3136) (end 206.4004 111.506) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 205.486 110.5916) (end 199.6828 110.5916) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 206.4004 111.506) (end 205.486 110.5916) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 195.8483 110.5916) (end 198.1828 110.5916) (width 0.25) (layer F.Cu) (net 42) (status 30)) (segment (start 213.7045 114.427) (end 213.8315 114.554) (width 0.25) (layer F.Cu) (net 43) (status 30)) (segment (start 213.7045 112.0775) (end 213.7045 114.427) (width 0.25) (layer F.Cu) (net 43) (status 30)) (segment (start 226.5315 133.35) (end 229.6525 133.35) (width 0.25) (layer F.Cu) (net 44) (status 30)) @@ -6515,10 +6598,6 @@ (segment (start 215.66 110.9075) (end 216.535 110.9075) (width 0.25) (layer F.Cu) (net 47) (status 30)) (segment (start 214.417 109.6645) (end 215.66 110.9075) (width 0.25) (layer F.Cu) (net 47) (status 20)) (segment (start 213.7045 109.6645) (end 214.417 109.6645) (width 0.25) (layer F.Cu) (net 47) (status 10)) - (segment (start 261.56201 101.40399) (end 227.215008 101.40399) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 262.255 100.711) (end 261.56201 101.40399) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 262.255 80.01705) (end 262.255 100.711) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 227.215008 101.40399) (end 223.28099 105.338008) (width 0.25) (layer F.Cu) (net 48)) (segment (start 224.395 110.9075) (end 223.52 110.9075) (width 0.25) (layer F.Cu) (net 48) (status 20)) (segment (start 225.425 111.9375) (end 224.395 110.9075) (width 0.25) (layer F.Cu) (net 48)) (segment (start 228.28 116.045) (end 227.678 115.443) (width 0.25) (layer F.Cu) (net 48)) @@ -6526,13 +6605,17 @@ (segment (start 227.678 115.443) (end 226.187 115.443) (width 0.25) (layer F.Cu) (net 48)) (segment (start 225.425 114.681) (end 225.425 111.9375) (width 0.25) (layer F.Cu) (net 48)) (segment (start 226.187 115.443) (end 225.425 114.681) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 223.28099 105.338008) (end 223.28099 110.66849) (width 0.25) (layer F.Cu) (net 48) (status 20)) - (segment (start 230.264089 75.474999) (end 232.57659 77.7875) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 225.439499 75.474999) (end 230.264089 75.474999) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 224.2455 74.281) (end 225.439499 75.474999) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 224.2455 73.406) (end 224.2455 74.281) (width 0.25) (layer F.Cu) (net 48) (status 10)) - (segment (start 260.02545 77.7875) (end 262.255 80.01705) (width 0.25) (layer F.Cu) (net 48)) - (segment (start 232.57659 77.7875) (end 260.02545 77.7875) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 225.439499 75.474999) (end 224.2455 74.281) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 230.264089 75.474999) (end 225.439499 75.474999) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 232.57659 77.7875) (end 230.264089 75.474999) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 260.02545 77.7875) (end 232.57659 77.7875) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 262.255 80.01705) (end 260.02545 77.7875) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 262.255 100.711) (end 262.255 80.01705) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 261.62 101.346) (end 262.255 100.711) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 227.272998 101.346) (end 261.62 101.346) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 223.28099 105.338008) (end 227.272998 101.346) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 224.2455 74.281) (end 224.2455 73.406) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 223.28099 110.66849) (end 223.28099 105.338008) (width 0.25) (layer F.Cu) (net 48)) (segment (start 263.34001 102.92799) (end 264.16 102.108) (width 0.25) (layer F.Cu) (net 49)) (segment (start 264.16 102.108) (end 264.16 80.01282) (width 0.25) (layer F.Cu) (net 49)) (segment (start 248.551008 102.92799) (end 263.34001 102.92799) (width 0.25) (layer F.Cu) (net 49)) @@ -6552,7 +6635,6 @@ (segment (start 240.1205 74.3445) (end 240.1205 73.4695) (width 0.25) (layer F.Cu) (net 49) (status 20)) (segment (start 241.6585 75.8825) (end 240.1205 74.3445) (width 0.25) (layer F.Cu) (net 49)) (segment (start 260.02968 75.8825) (end 241.6585 75.8825) (width 0.25) (layer F.Cu) (net 49)) - (segment (start 234.384998 101.854) (end 262.636 101.854) (width 0.25) (layer F.Cu) (net 50)) (segment (start 230.90099 105.338008) (end 234.384998 101.854) (width 0.25) (layer F.Cu) (net 50)) (segment (start 262.636 101.854) (end 262.89 101.6) (width 0.25) (layer F.Cu) (net 50)) (segment (start 230.90099 110.03349) (end 230.90099 105.338008) (width 0.25) (layer F.Cu) (net 50)) @@ -6571,6 +6653,7 @@ (segment (start 262.89 81.153) (end 262.89 80.01564) (width 0.25) (layer F.Cu) (net 50)) (segment (start 262.89 101.6) (end 262.89 81.153) (width 0.25) (layer F.Cu) (net 50)) (segment (start 262.89 80.01564) (end 259.96336 77.089) (width 0.25) (layer F.Cu) (net 50)) + (segment (start 234.384998 101.854) (end 262.636 101.854) (width 0.25) (layer F.Cu) (net 50)) (segment (start 255.720998 103.378) (end 264.03159 103.378) (width 0.25) (layer F.Cu) (net 51)) (segment (start 253.76099 105.338008) (end 255.720998 103.378) (width 0.25) (layer F.Cu) (net 51)) (segment (start 253.76099 110.66849) (end 253.76099 105.338008) (width 0.25) (layer F.Cu) (net 51) (status 10)) @@ -6655,49 +6738,91 @@ (segment (start 253.5555 79.47999) (end 253.5555 74.9935) (width 0.25) (layer B.Cu) (net 56)) (segment (start 250.1265 73.3155) (end 250.2805 73.4695) (width 0.25) (layer F.Cu) (net 56) (status 30)) (segment (start 250.1265 71.5645) (end 250.1265 73.3155) (width 0.25) (layer F.Cu) (net 56) (status 20)) - (segment (start 214.21398 105.688) (end 208.214 105.688) (width 0.25) (layer F.Cu) (net 56) (status 20)) - (segment (start 219.51399 100.38799) (end 214.21398 105.688) (width 0.25) (layer F.Cu) (net 56)) - (segment (start 261.1796 100.38799) (end 219.51399 100.38799) (width 0.25) (layer F.Cu) (net 56)) - (segment (start 261.35498 100.21261) (end 261.1796 100.38799) (width 0.25) (layer F.Cu) (net 56)) - (segment (start 261.35498 80.38985) (end 261.35498 100.21261) (width 0.25) (layer F.Cu) (net 56)) (segment (start 260.44512 79.47999) (end 261.35498 80.38985) (width 0.25) (layer F.Cu) (net 56)) (segment (start 253.5555 79.47999) (end 260.44512 79.47999) (width 0.25) (layer F.Cu) (net 56)) - (via (at 204.597 100.1395) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 57)) - (segment (start 212.317499 92.419001) (end 204.597 100.1395) (width 0.25) (layer F.Cu) (net 57)) - (segment (start 224.341499 92.419001) (end 212.317499 92.419001) (width 0.25) (layer F.Cu) (net 57)) - (segment (start 224.636 92.1245) (end 224.341499 92.419001) (width 0.25) (layer F.Cu) (net 57)) - (segment (start 224.636 91.2495) (end 224.636 92.1245) (width 0.25) (layer F.Cu) (net 57) (status 10)) - (segment (start 176.02 114.26) (end 175.895 114.26) (width 0.25) (layer B.Cu) (net 57) (status 30)) - (segment (start 177.19501 113.08499) (end 176.02 114.26) (width 0.25) (layer B.Cu) (net 57) (status 20)) - (segment (start 180.566007 106.142991) (end 177.19501 109.513988) (width 0.25) (layer B.Cu) (net 57)) - (segment (start 198.593509 106.142991) (end 180.566007 106.142991) (width 0.25) (layer B.Cu) (net 57)) - (segment (start 177.19501 109.513988) (end 177.19501 113.08499) (width 0.25) (layer B.Cu) (net 57)) - (segment (start 204.597 100.1395) (end 198.593509 106.142991) (width 0.25) (layer B.Cu) (net 57)) + (via (at 210.2104 101.6508) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 56)) + (segment (start 209.1182 102.743) (end 210.2104 101.6508) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 208.7515 102.743) (end 209.1182 102.743) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 261.35498 94.403622) (end 261.3152 94.443402) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 261.35498 80.38985) (end 261.35498 94.403622) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 261.3152 94.443402) (end 261.3152 99.314) (width 0.25) (layer F.Cu) (net 56)) + (via (at 254.0508 99.822) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 56)) + (segment (start 260.8072 99.822) (end 254.0508 99.822) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 261.3152 99.314) (end 260.8072 99.822) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 253.650801 100.221999) (end 252.222 101.6508) (width 0.25) (layer B.Cu) (net 56)) + (segment (start 254.0508 99.822) (end 253.650801 100.221999) (width 0.25) (layer B.Cu) (net 56)) + (segment (start 210.2104 101.6508) (end 252.222 101.6508) (width 0.25) (layer B.Cu) (net 56)) + (segment (start 176.3248 110.2976) (end 176.1998 110.2976) (width 0.25) (layer B.Cu) (net 57) (status 30)) + (segment (start 174.9748 110.2976) (end 176.1998 110.2976) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 174.5996 106.5784) (end 174.5996 109.9224) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 175.7172 105.4608) (end 174.5996 106.5784) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 174.5996 109.9224) (end 174.9748 110.2976) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 176.39841 105.4608) (end 175.7172 105.4608) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 176.43242 105.42679) (end 176.39841 105.4608) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 185.34951 105.42679) (end 176.43242 105.42679) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 189.7745 101.0018) (end 185.34951 105.42679) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 189.7745 100.1268) (end 189.7745 101.0018) (width 0.25) (layer F.Cu) (net 57)) (segment (start 220.558 73.406) (end 217.891 70.739) (width 0.25) (layer F.Cu) (net 58) (status 10)) (segment (start 221.2705 73.406) (end 220.558 73.406) (width 0.25) (layer F.Cu) (net 58) (status 30)) (segment (start 217.891 70.011) (end 217.73 69.85) (width 0.25) (layer F.Cu) (net 58) (status 30)) (segment (start 217.891 70.739) (end 217.891 70.011) (width 0.25) (layer F.Cu) (net 58) (status 20)) + (segment (start 194.8688 101.0018) (end 194.1182 101.7524) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 194.8688 100.1268) (end 194.8688 101.0018) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 194.1182 101.7524) (end 189.992 101.7524) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 189.992 101.7524) (end 185.7756 105.9688) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 183.0724 110.1852) (end 183.1848 110.2976) (width 0.25) (layer F.Cu) (net 59)) + (via (at 181.4068 106.7816) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 59)) + (segment (start 182.2196 105.9688) (end 181.4068 106.7816) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 185.7756 105.9688) (end 182.2196 105.9688) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 181.9598 110.2976) (end 183.1848 110.2976) (width 0.25) (layer B.Cu) (net 59)) + (segment (start 181.006801 109.344601) (end 181.9598 110.2976) (width 0.25) (layer B.Cu) (net 59)) + (segment (start 181.006801 107.181599) (end 181.006801 109.344601) (width 0.25) (layer B.Cu) (net 59)) + (segment (start 181.4068 106.7816) (end 181.006801 107.181599) (width 0.25) (layer B.Cu) (net 59)) (segment (start 226.795 71.295) (end 226.795 73.4695) (width 0.25) (layer F.Cu) (net 60) (status 20)) (segment (start 225.35 69.85) (end 226.795 71.295) (width 0.25) (layer F.Cu) (net 60) (status 10)) - (segment (start 190.455 114.26) (end 189.23 114.26) (width 0.25) (layer F.Cu) (net 61) (status 20)) - (segment (start 190.7905 114.5955) (end 190.455 114.26) (width 0.25) (layer F.Cu) (net 61)) - (segment (start 190.7905 121.031) (end 190.7905 114.5955) (width 0.25) (layer F.Cu) (net 61) (status 10)) + (segment (start 199.9853 101.0018) (end 198.7267 102.2604) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 199.9853 100.1268) (end 199.9853 101.0018) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 198.7267 102.2604) (end 190.246 102.2604) (width 0.25) (layer F.Cu) (net 61)) + (via (at 187.939253 104.830453) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 61)) + (segment (start 187.939253 104.567147) (end 187.939253 104.830453) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 190.246 102.2604) (end 187.939253 104.567147) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 187.939253 105.396138) (end 187.9092 105.426191) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 187.939253 104.830453) (end 187.939253 105.396138) (width 0.25) (layer F.Cu) (net 61)) + (via (at 187.9092 106.9476) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 61)) + (segment (start 187.9092 105.426191) (end 187.9092 106.9476) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 188.3098 110.2976) (end 189.5348 110.2976) (width 0.25) (layer B.Cu) (net 61)) + (segment (start 187.9092 109.897) (end 188.3098 110.2976) (width 0.25) (layer B.Cu) (net 61)) + (segment (start 187.9092 106.9476) (end 187.9092 109.897) (width 0.25) (layer B.Cu) (net 61)) (segment (start 230.43 71.834) (end 232.0655 73.4695) (width 0.25) (layer F.Cu) (net 62) (status 20)) (segment (start 230.43 69.85) (end 230.43 71.834) (width 0.25) (layer F.Cu) (net 62) (status 10)) + (segment (start 175.9569 119.7864) (end 175.2444 119.7864) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 175.2444 119.7864) (end 174.244 120.7868) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 174.67 126.96) (end 175.895 126.96) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 174.244 126.534) (end 174.67 126.96) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 174.244 120.7868) (end 174.244 126.534) (width 0.25) (layer F.Cu) (net 63)) (segment (start 233.749999 70.629999) (end 232.97 69.85) (width 0.25) (layer F.Cu) (net 64) (status 20)) (segment (start 234.305999 70.629999) (end 233.749999 70.629999) (width 0.25) (layer F.Cu) (net 64)) (segment (start 237.1455 73.4695) (end 234.305999 70.629999) (width 0.25) (layer F.Cu) (net 64) (status 10)) + (segment (start 181.655 126.96) (end 182.88 126.96) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 181.0369 126.3419) (end 181.655 126.96) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 181.0369 119.7356) (end 181.0369 126.3419) (width 0.25) (layer F.Cu) (net 65)) (segment (start 235.930914 71.374) (end 235.51 70.953086) (width 0.25) (layer F.Cu) (net 66)) - (segment (start 241.005 71.374) (end 235.930914 71.374) (width 0.25) (layer F.Cu) (net 66)) - (segment (start 242.2255 72.5945) (end 241.005 71.374) (width 0.25) (layer F.Cu) (net 66) (status 10)) (segment (start 235.51 70.953086) (end 235.51 69.85) (width 0.25) (layer F.Cu) (net 66) (status 20)) - (segment (start 242.2255 73.4695) (end 242.2255 72.5945) (width 0.25) (layer F.Cu) (net 66) (status 30)) + (segment (start 242.2255 72.5945) (end 242.2255 73.4695) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 241.005 71.374) (end 242.2255 72.5945) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 235.930914 71.374) (end 241.005 71.374) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 188.005 126.96) (end 189.23 126.96) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 186.0661 125.0211) (end 188.005 126.96) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 186.0661 119.7356) (end 186.0661 125.0211) (width 0.25) (layer F.Cu) (net 67)) (segment (start 251.529999 70.629999) (end 251.529999 71.888499) (width 0.25) (layer F.Cu) (net 68)) (segment (start 250.75 69.85) (end 251.529999 70.629999) (width 0.25) (layer F.Cu) (net 68) (status 10)) (segment (start 251.529999 71.888499) (end 252.1585 72.517) (width 0.25) (layer F.Cu) (net 68)) (segment (start 252.449 72.5945) (end 252.449 73.4695) (width 0.25) (layer F.Cu) (net 68) (status 30)) (segment (start 252.3715 72.517) (end 252.449 72.5945) (width 0.25) (layer F.Cu) (net 68) (status 20)) (segment (start 252.1585 72.517) (end 252.3715 72.517) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 194.355 126.96) (end 195.58 126.96) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 191.4001 124.0051) (end 194.355 126.96) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 191.4001 119.7864) (end 191.4001 124.0051) (width 0.25) (layer F.Cu) (net 69)) (segment (start 249.655 93.805) (end 248.21 95.25) (width 0.25) (layer F.Cu) (net 70) (status 20)) (segment (start 249.655 91.2495) (end 249.655 93.805) (width 0.25) (layer F.Cu) (net 70) (status 10)) (segment (start 241.369999 70.629999) (end 241.369999 70.745499) (width 0.25) (layer F.Cu) (net 71)) From e0de8dabe8655b2f5822add433ba28ee18e1c3ef Mon Sep 17 00:00:00 2001 From: Ollo Date: Sun, 1 Nov 2020 20:17:21 +0100 Subject: [PATCH 11/31] NTP Server can be set via configuration item --- esp32/include/HomieConfiguration.h | 1 + esp32/src/main.cpp | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/esp32/include/HomieConfiguration.h b/esp32/include/HomieConfiguration.h index 8351c0c..0151c68 100644 --- a/esp32/include/HomieConfiguration.h +++ b/esp32/include/HomieConfiguration.h @@ -45,6 +45,7 @@ HomieSetting waterLevelMax("watermaxlevel", "distance (mm) at maximum wate HomieSetting waterLevelMin("waterminlevel", "distance (mm) at minimum water level (pumps still covered)"); HomieSetting waterLevelWarn("waterlevelwarn", "warn (mm) if below this water level %"); HomieSetting waterLevelVol("waterVolume", "(ml) between minimum and maximum"); +HomieSettingntpServer("ntpServer", "NTP server (pool.ntp.org as default)"); /** Plant specific ones */ diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 44285b7..3d88877 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -49,8 +49,6 @@ RTC_DATA_ATTR long rtcMoistureTrigger6 = 0; /** Date: Sun, 1 Nov 2020 20:29:24 +0100 Subject: [PATCH 12/31] NTP server is used from configuration setting --- esp32/src/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 3d88877..33aefdb 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -399,9 +399,11 @@ void onHomieEvent(const HomieEvent& event) { Homie.getLogger() << "My statistics" << endl; break; case HomieEventType::MQTT_READY: + Serial.printf("NTP Setup with server %s\r\n", ntpServer.get()); + configTime(0, 0, ntpServer.get()); //wait for rtc sync? rtcDeepSleepTime = deepSleepTime.get(); - Serial << "MQTT ready " << endl; + Serial << "Setup plants" << endl; for(int i=0; i < MAX_PLANTS; i++) { mPlants[i].postMQTTconnection(); } @@ -484,7 +486,7 @@ bool aliveHandler(const HomieRange& range, const String& value) { } void homieLoop(){ - + } void systemInit(){ @@ -510,8 +512,6 @@ void systemInit(){ //Homie.disableLogging(); Homie.setup(); - configTime(0, 0, ntpServer.get()); - mConfigured = Homie.isConfigured(); if (mConfigured) { for(int i=0; i < MAX_PLANTS; i++) { From 329a228b2d3548ef9f3f31ef4cdaf2136d3f8fa7 Mon Sep 17 00:00:00 2001 From: Ollo Date: Sun, 1 Nov 2020 20:42:45 +0100 Subject: [PATCH 13/31] Toggle Sensor LED to visualize mode 3 --- esp32/src/main.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 33aefdb..7020163 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -475,7 +475,6 @@ int determineNextPump(){ */ bool aliveHandler(const HomieRange& range, const String& value) { if (range.isRange) return false; // only one controller is present - Serial << value << endl; if (value.equals("ON") || value.equals("On") || value.equals("1")) { mode3Active=true; } else { @@ -674,4 +673,9 @@ void loop() { Serial.flush(); espDeepSleepFor(rtcDeepSleepTime); } + + /* Toggel Senor LED to visualize mode 3 */ + if (mode3Active && (millis() % 100) == 0) { + digitalWrite(OUTPUT_SENSOR, ! digitalRead(OUTPUT_SENSOR)); + } } From fb907f9b12a39553c1b5bf5e256f3a2718df32d4 Mon Sep 17 00:00:00 2001 From: Empire Date: Wed, 4 Nov 2020 21:10:22 +0100 Subject: [PATCH 14/31] fixed wrong indes for pump determination improved pump status output fixed led blinking in mode3 random --- esp32/include/PlantCtrl.h | 21 ++++++++++++++++++--- esp32/src/main.cpp | 29 ++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/esp32/include/PlantCtrl.h b/esp32/include/PlantCtrl.h index f1f8749..1ba01de 100644 --- a/esp32/include/PlantCtrl.h +++ b/esp32/include/PlantCtrl.h @@ -60,9 +60,24 @@ public: * @return false */ bool isPumpRequired() { - return (this->mSetting->pSensorDry != NULL) - && (this->moistureRaw.getMedian() > this->mSetting->pSensorDry->get()) - && (this->mSetting->pSensorDry->get() != DEACTIVATED_PLANT); + bool isDry = getCurrentMoisture() > getSettingsMoisture(); + bool isActive = isPumpTriggerActive(); + return isDry && isActive; + } + + bool isPumpTriggerActive(){ + return this->mSetting->pSensorDry->get() != DEACTIVATED_PLANT; + } + + float getCurrentMoisture(){ + return this->moistureRaw.getMedian(); + } + long getSettingsMoisture(){ + if(this->mSetting->pSensorDry != NULL){ + return this->mSetting->pSensorDry->get(); + } else { + return DEACTIVATED_PLANT; + } } HomieInternals::SendingPromise& setProperty(const String& property) const { diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 7020163..8d4b6b5 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -441,28 +441,36 @@ int determineNextPump(){ bool isLowLight =(solarValue > SOLAR_CHARGE_MIN_VOLTAGE || solarValue < SOLAR_CHARGE_MAX_VOLTAGE); //FIXME instead of for, use sorted by last activation index to ensure equal runtime? + + int pumpToUse = -1; for(int i=0; i < MAX_PLANTS; i++) { + Plant plant = mPlants[i]; long lastActivation = getLastActivationForPump(i); long sinceLastActivation = getCurrentTime()-lastActivation; //this pump is in cooldown skip it and disable low power mode trigger for it - if(mPlants[i].isInCooldown(sinceLastActivation) ){ + if(plant.isInCooldown(sinceLastActivation) ){ Serial.printf("%d Skipping due to cooldown\r\n", i); setMoistureTrigger(i, DEACTIVATED_PLANT); continue; } //skip as it is not low light - if(!isLowLight && mPlants[i].isAllowedOnlyAtLowLight()){ - Serial.println("Skipping due to light"); + if(!isLowLight && plant.isAllowedOnlyAtLowLight()){ + Serial.printf("%d No pump required: due to light\r\n", i); continue; } - if(mPlants->isPumpRequired()){ + if(plant.isPumpRequired()){ Serial.printf("%d Requested pumping\r\n", i); - return i; + pumpToUse = i; } - Serial.printf("%d No pump required\r\n", i); + if(plant.isPumpTriggerActive()){ + Serial.printf("%d No pump required: disabled trigger %f / %ld\r\n", i, plant.getCurrentMoisture(), plant.getSettingsMoisture()); + }else { + Serial.printf("%d No pump required: disabled trigger\r\n", i); + } + } - return -1; + return pumpToUse; } /** @@ -658,7 +666,7 @@ void setup() { * @brief Cyclic call * Executs the Homie base functionallity or triggers sleeping, if requested. */ - +long nextBlink = 0; void loop() { if (!mDeepsleep || mode3Active) { Homie.loop(); @@ -675,7 +683,10 @@ void loop() { } /* Toggel Senor LED to visualize mode 3 */ - if (mode3Active && (millis() % 100) == 0) { + if(mode3Active){ + if (nextBlink < millis()) { + nextBlink = millis() + 500; digitalWrite(OUTPUT_SENSOR, ! digitalRead(OUTPUT_SENSOR)); + } } } From fd28ffcfafefaf514af9c5eca614a96b37a41cf9 Mon Sep 17 00:00:00 2001 From: Empire Date: Wed, 4 Nov 2020 21:55:51 +0100 Subject: [PATCH 15/31] added rtc trigger vars --- esp32/include/ControllerConfiguration.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/esp32/include/ControllerConfiguration.h b/esp32/include/ControllerConfiguration.h index e06c6b9..e124079 100644 --- a/esp32/include/ControllerConfiguration.h +++ b/esp32/include/ControllerConfiguration.h @@ -61,4 +61,9 @@ #define PANIK_MODE_DEEPSLEEP (60*60*5U) /**< 5 hours in usecond */ #define PANIK_MODE_DEEPSLEEP_US (PANIK_MODE_DEEPSLEEP*1000*1000) +#define TEMPERATURE_DELTA_TRIGGER_IN_C 1 +#define MOIST_DELTA_TRIGGER_ADC 1337 +#define SOLAR_DELTA_VOLT_ADC 3 +#define LIPO_DELTA_VOLT_ADC 0.2 + #endif From 503c2b73b93d4b3caf8e595a79ec0f97e89c14e2 Mon Sep 17 00:00:00 2001 From: Empire Date: Wed, 4 Nov 2020 21:57:40 +0100 Subject: [PATCH 16/31] added raw moisture, improved pct calc , formating --- esp32/include/ControllerConfiguration.h | 74 +-- esp32/include/DS18B20.h | 34 +- esp32/include/HomieConfiguration.h | 18 +- esp32/include/HomieTypes.h | 15 +- esp32/include/PlantCtrl.h | 52 +- esp32/include/RunningMedian.h | 13 +- esp32/src/DS18B20.cpp | 51 +- esp32/src/PlantCtrl.cpp | 60 +-- esp32/src/RunningMedian.cpp | 47 +- esp32/src/main.cpp | 600 ++++++++++++++---------- 10 files changed, 555 insertions(+), 409 deletions(-) diff --git a/esp32/include/ControllerConfiguration.h b/esp32/include/ControllerConfiguration.h index e124079..43ef4f0 100644 --- a/esp32/include/ControllerConfiguration.h +++ b/esp32/include/ControllerConfiguration.h @@ -11,55 +11,57 @@ #ifndef CONTROLLER_CONFIG_H #define CONTROLLER_CONFIG_H -#define FIRMWARE_VERSION "1.0.7" +#define FIRMWARE_VERSION "1.0.7" #define ADC_TO_VOLT(adc) ((adc) * 3.3 ) / 4095) -#define ADC_TO_VOLT_WITH_MULTI(adc, multi) (((adc) * 3.3 * (multi)) / 4095) +#define ADC_TO_VOLT_WITH_MULTI(adc, multi) (((adc)*3.3 * (multi)) / 4095) +#define MOIST_SENSOR_MAX_ADC 85 * 4095 / 100 +#define MOIST_SENSOR_MIN_ADC 25 * 4095 / 100 -#define SOLAR_VOLT(adc) ADC_TO_VOLT_WITH_MULTI(adc, 4.0306) /**< 100k and 33k voltage dividor */ -#define ADC_5V_TO_3V3(adc) ADC_TO_VOLT_WITH_MULTI(adc, 1.7) /**< 33k and 47k8 voltage dividor */ -#define MS_TO_S 1000 +#define SOLAR_VOLT(adc) ADC_TO_VOLT_WITH_MULTI(adc, 4.0306) /**< 100k and 33k voltage dividor */ +#define ADC_5V_TO_3V3(adc) ADC_TO_VOLT_WITH_MULTI(adc, 1.7) /**< 33k and 47k8 voltage dividor */ +#define MS_TO_S 1000 -#define SENSOR_LIPO 34 /**< GPIO 34 (ADC1) */ -#define SENSOR_SOLAR 35 /**< GPIO 35 (ADC1) */ -#define SENSOR_PLANT0 32 /**< GPIO 32 (ADC1) */ -#define SENSOR_PLANT1 33 /**< GPIO 33 (ADC1) */ -#define SENSOR_PLANT2 25 /**< GPIO 25 (ADC2) */ -#define SENSOR_PLANT3 26 /**< GPIO 26 (ADC2) */ -#define SENSOR_PLANT4 27 /**< GPIO 27 (ADC2) */ -#define SENSOR_PLANT5 14 /**< GPIO 14 (ADC2) */ -#define SENSOR_PLANT6 12 /**< GPIO 12 (ADC2) */ +#define SENSOR_LIPO 34 /**< GPIO 34 (ADC1) */ +#define SENSOR_SOLAR 35 /**< GPIO 35 (ADC1) */ +#define SENSOR_PLANT0 32 /**< GPIO 32 (ADC1) */ +#define SENSOR_PLANT1 33 /**< GPIO 33 (ADC1) */ +#define SENSOR_PLANT2 25 /**< GPIO 25 (ADC2) */ +#define SENSOR_PLANT3 26 /**< GPIO 26 (ADC2) */ +#define SENSOR_PLANT4 27 /**< GPIO 27 (ADC2) */ +#define SENSOR_PLANT5 14 /**< GPIO 14 (ADC2) */ +#define SENSOR_PLANT6 12 /**< GPIO 12 (ADC2) */ -#define OUTPUT_PUMP0 23 /**< GPIO 23 */ -#define OUTPUT_PUMP1 22 /**< GPIO 22 */ -#define OUTPUT_PUMP2 21 /**< GPIO 21 */ -#define OUTPUT_PUMP3 19 /**< GPIO 19 */ -#define OUTPUT_PUMP4 18 /**< GPIO 18 */ -#define OUTPUT_PUMP5 5 /**< GPIO 5 */ -#define OUTPUT_PUMP6 15 /**< GPIO 15 */ - -#define OUTPUT_SENSOR 16 /**< GPIO 16 - Enable Sensors */ -#define OUTPUT_PUMP 13 /**< GPIO 13 - Enable Pumps */ +#define OUTPUT_PUMP0 23 /**< GPIO 23 */ +#define OUTPUT_PUMP1 22 /**< GPIO 22 */ +#define OUTPUT_PUMP2 21 /**< GPIO 21 */ +#define OUTPUT_PUMP3 19 /**< GPIO 19 */ +#define OUTPUT_PUMP4 18 /**< GPIO 18 */ +#define OUTPUT_PUMP5 5 /**< GPIO 5 */ +#define OUTPUT_PUMP6 15 /**< GPIO 15 */ -#define SENSOR_DS18B20 2 /**< GPIO 2 */ -#define BUTTON 0 /**< GPIO 0 */ +#define OUTPUT_SENSOR 16 /**< GPIO 16 - Enable Sensors */ +#define OUTPUT_PUMP 13 /**< GPIO 13 - Enable Pumps */ -#define MIN_TIME_RUNNING 5UL /**< Amount of seconds the controller must stay awoken */ -#define MAX_PLANTS 7 -#define MINIMUM_LIPO_VOLT 3.6f /**< Minimum voltage of the Lipo, that must be present */ -#define NO_LIPO_VOLT 2.0f /**< No Lipo connected */ -#define MINIMUM_SOLAR_VOLT 4.0f /**< Minimum voltage of the sun, to detect daylight */ +#define SENSOR_DS18B20 2 /**< GPIO 2 */ +#define BUTTON 0 /**< GPIO 0 */ + +#define MIN_TIME_RUNNING 5UL /**< Amount of seconds the controller must stay awoken */ +#define MAX_PLANTS 7 +#define MINIMUM_LIPO_VOLT 3.6f /**< Minimum voltage of the Lipo, that must be present */ +#define NO_LIPO_VOLT 2.0f /**< No Lipo connected */ +#define MINIMUM_SOLAR_VOLT 4.0f /**< Minimum voltage of the sun, to detect daylight */ #define SOLAR_CHARGE_MIN_VOLTAGE 7 #define SOLAR_CHARGE_MAX_VOLTAGE 9 -#define HC_SR04 /**< Ultrasonic distance sensor to measure water level */ -#define SENSOR_SR04_ECHO 17 /**< GPIO 17 - Echo */ -#define SENSOR_SR04_TRIG 23 /**< GPIO 23 - Trigger */ +#define HC_SR04 /**< Ultrasonic distance sensor to measure water level */ +#define SENSOR_SR04_ECHO 17 /**< GPIO 17 - Echo */ +#define SENSOR_SR04_TRIG 23 /**< GPIO 23 - Trigger */ #define MAX_CONFIG_SETTING_ITEMS 50 /**< Parameter, that can be configured in Homie */ -#define PANIK_MODE_DEEPSLEEP (60*60*5U) /**< 5 hours in usecond */ -#define PANIK_MODE_DEEPSLEEP_US (PANIK_MODE_DEEPSLEEP*1000*1000) +#define PANIK_MODE_DEEPSLEEP (60 * 60 * 5U) /**< 5 hours in usecond */ +#define PANIK_MODE_DEEPSLEEP_US (PANIK_MODE_DEEPSLEEP * 1000 * 1000) #define TEMPERATURE_DELTA_TRIGGER_IN_C 1 #define MOIST_DELTA_TRIGGER_ADC 1337 diff --git a/esp32/include/DS18B20.h b/esp32/include/DS18B20.h index 7ab8e66..7910f40 100644 --- a/esp32/include/DS18B20.h +++ b/esp32/include/DS18B20.h @@ -21,32 +21,36 @@ #include -class Ds18B20 { - private: - OneWire* mDs; - int foundDevices; - public: - Ds18B20(int pin) { - this->mDs = new OneWire(pin); - } +class Ds18B20 +{ +private: + OneWire *mDs; + int foundDevices; - ~Ds18B20() { - delete this->mDs; - } - /** +public: + Ds18B20(int pin) + { + this->mDs = new OneWire(pin); + } + + ~Ds18B20() + { + delete this->mDs; + } + /** * @brief read amount sensots * check for available of DS18B20 sensors * @return amount of sensors */ - int readDevices(void); + int readDevices(void); - /** + /** * @brief Read all temperatures in celsius * * @param pTemperatures array of float valuies * @param maxTemperatures size of the given array * @return int amount of read temperature values */ - int readAllTemperatures(float* pTemperatures, int maxTemperatures); + int readAllTemperatures(float *pTemperatures, int maxTemperatures); }; #endif diff --git a/esp32/include/HomieConfiguration.h b/esp32/include/HomieConfiguration.h index 0151c68..f300a76 100644 --- a/esp32/include/HomieConfiguration.h +++ b/esp32/include/HomieConfiguration.h @@ -45,18 +45,18 @@ HomieSetting waterLevelMax("watermaxlevel", "distance (mm) at maximum wate HomieSetting waterLevelMin("waterminlevel", "distance (mm) at minimum water level (pumps still covered)"); HomieSetting waterLevelWarn("waterlevelwarn", "warn (mm) if below this water level %"); HomieSetting waterLevelVol("waterVolume", "(ml) between minimum and maximum"); -HomieSettingntpServer("ntpServer", "NTP server (pool.ntp.org as default)"); +HomieSetting ntpServer("ntpServer", "NTP server (pool.ntp.org as default)"); /** Plant specific ones */ -#define GENERATE_PLANT(plant, strplant) \ - HomieSetting mSensorDry##plant = HomieSetting("moistdry" strplant, "Plant " strplant "- Moist sensor dry threshold"); \ - HomieSetting mPumpAllowedHourRangeStart##plant = HomieSetting("rangehourstart" strplant, "Plant" strplant " - Range pump allowed hour start (0-23)"); \ - HomieSetting mPumpAllowedHourRangeEnd##plant = HomieSetting("rangehourend" strplant, "Plant" strplant " - Range pump allowed hour end (0-23)"); \ +#define GENERATE_PLANT(plant, strplant) \ + HomieSetting mSensorDry##plant = HomieSetting("moistdry" strplant, "Plant " strplant "- Moist sensor dry threshold"); \ + HomieSetting mPumpAllowedHourRangeStart##plant = HomieSetting("rangehourstart" strplant, "Plant" strplant " - Range pump allowed hour start (0-23)"); \ + HomieSetting mPumpAllowedHourRangeEnd##plant = HomieSetting("rangehourend" strplant, "Plant" strplant " - Range pump allowed hour end (0-23)"); \ HomieSetting mPumpOnlyWhenLowLight##plant = HomieSetting("onlyWhenLowLightZ" strplant, "Plant" strplant " - Enable the Pump only, when there is light but not enought to charge battery"); \ - HomieSetting mPumpCooldownInHours##plant = HomieSetting("cooldownpump" strplant, "Plant" strplant " - How long to wait until the pump is activated again (minutes)"); \ - PlantSettings_t mSetting##plant = { &mSensorDry##plant, &mPumpAllowedHourRangeStart##plant, &mPumpAllowedHourRangeEnd##plant, &mPumpOnlyWhenLowLight##plant, &mPumpCooldownInHours##plant }; - + HomieSetting mPumpCooldownInHours##plant = HomieSetting("cooldownpump" strplant, "Plant" strplant " - How long to wait until the pump is activated again (minutes)"); \ + PlantSettings_t mSetting##plant = {&mSensorDry##plant, &mPumpAllowedHourRangeStart##plant, &mPumpAllowedHourRangeEnd##plant, &mPumpOnlyWhenLowLight##plant, &mPumpCooldownInHours##plant}; + GENERATE_PLANT(0, "0"); GENERATE_PLANT(1, "1"); GENERATE_PLANT(2, "2"); @@ -65,6 +65,4 @@ GENERATE_PLANT(4, "4"); GENERATE_PLANT(5, "5"); GENERATE_PLANT(6, "6"); - - #endif /* HOMIE_PLANT_CONFIG_H */ \ No newline at end of file diff --git a/esp32/include/HomieTypes.h b/esp32/include/HomieTypes.h index 28c9d59..2c915c5 100644 --- a/esp32/include/HomieTypes.h +++ b/esp32/include/HomieTypes.h @@ -13,14 +13,15 @@ #include -#define DEACTIVATED_PLANT 5000 +#define DEACTIVATED_PLANT 5000 -typedef struct PlantSettings_t { - HomieSetting* pSensorDry; - HomieSetting* pPumpAllowedHourRangeStart; - HomieSetting* pPumpAllowedHourRangeEnd; - HomieSetting* pPumpOnlyWhenLowLight; - HomieSetting* pPumpCooldownInHours; +typedef struct PlantSettings_t +{ + HomieSetting *pSensorDry; + HomieSetting *pPumpAllowedHourRangeStart; + HomieSetting *pPumpAllowedHourRangeEnd; + HomieSetting *pPumpOnlyWhenLowLight; + HomieSetting *pPumpCooldownInHours; } PlantSettings_t; #endif \ No newline at end of file diff --git a/esp32/include/PlantCtrl.h b/esp32/include/PlantCtrl.h index 1ba01de..6902d38 100644 --- a/esp32/include/PlantCtrl.h +++ b/esp32/include/PlantCtrl.h @@ -15,17 +15,18 @@ #include "HomieTypes.h" #include "RunningMedian.h" -class Plant { +class Plant +{ private: RunningMedian moistureRaw = RunningMedian(5); - HomieNode* mPlant = NULL; - int mPinSensor=0; /**< Pin of the moist sensor */ - int mPinPump=0; /**< Pin of the pump */ + HomieNode *mPlant = NULL; + int mPinSensor = 0; /**< Pin of the moist sensor */ + int mPinPump = 0; /**< Pin of the pump */ bool mConnected = false; public: - PlantSettings_t* mSetting; + PlantSettings_t *mSetting; /** * @brief Construct a new Plant object * @@ -33,9 +34,9 @@ public: * @param pinPump Pin of the Pump to use */ Plant(int pinSensor, int pinPump, - int plantId, - HomieNode* plant, - PlantSettings_t* setting); + int plantId, + HomieNode *plant, + PlantSettings_t *setting); void postMQTTconnection(void); @@ -46,7 +47,7 @@ public: * */ void addSenseValue(void); - + int getSensorValue() { return moistureRaw.getMedian(); } void deactivatePump(void); @@ -59,31 +60,39 @@ public: * @return true * @return false */ - bool isPumpRequired() { + bool isPumpRequired() + { bool isDry = getCurrentMoisture() > getSettingsMoisture(); bool isActive = isPumpTriggerActive(); return isDry && isActive; } - bool isPumpTriggerActive(){ + bool isPumpTriggerActive() + { return this->mSetting->pSensorDry->get() != DEACTIVATED_PLANT; } - float getCurrentMoisture(){ + float getCurrentMoisture() + { return this->moistureRaw.getMedian(); } - long getSettingsMoisture(){ - if(this->mSetting->pSensorDry != NULL){ + long getSettingsMoisture() + { + if (this->mSetting->pSensorDry != NULL) + { return this->mSetting->pSensorDry->get(); - } else { + } + else + { return DEACTIVATED_PLANT; } } - HomieInternals::SendingPromise& setProperty(const String& property) const { + HomieInternals::SendingPromise &setProperty(const String &property) const + { return mPlant->setProperty(property); } - bool switchHandler(const HomieRange& range, const String& value); + bool switchHandler(const HomieRange &range, const String &value); void init(void); @@ -91,16 +100,19 @@ public: * @brief determine, if the plant was recently casted * @param sinceLastActivation timestamp of last time */ - bool isInCooldown(long sinceLastActivation) { + bool isInCooldown(long sinceLastActivation) + { /* if the time difference is greater than one month, we know these are initial values */ - if (sinceLastActivation > (60 * 60 * 24 * 30)) { + if (sinceLastActivation > (60 * 60 * 24 * 30)) + { return false; } return (this->mSetting->pPumpCooldownInHours->get() > sinceLastActivation / 3600); } - bool isAllowedOnlyAtLowLight(void) { + bool isAllowedOnlyAtLowLight(void) + { return this->mSetting->pPumpOnlyWhenLowLight->get(); } }; diff --git a/esp32/include/RunningMedian.h b/esp32/include/RunningMedian.h index 4ba5516..d83b389 100644 --- a/esp32/include/RunningMedian.h +++ b/esp32/include/RunningMedian.h @@ -17,13 +17,11 @@ // not tested ==> use at own risk :) // #define RUNNING_MEDIAN_USE_MALLOC - // should at least be 5 to be practical, // odd sizes results in a 'real' middle element and will be a bit faster. // even sizes takes the average of the two middle elements as median -#define MEDIAN_MIN_SIZE 5 -#define MEDIAN_MAX_SIZE 19 - +#define MEDIAN_MIN_SIZE 5 +#define MEDIAN_MAX_SIZE 19 class RunningMedian { @@ -45,7 +43,7 @@ public: float getAverage(uint8_t nMedian); float getHighest() { return getSortedElement(_cnt - 1); }; - float getLowest() { return getSortedElement(0); }; + float getLowest() { return getSortedElement(0); }; // get n'th element from the values in time order float getElement(const uint8_t n); @@ -58,7 +56,6 @@ public: // returns current used elements, getCount() <= getSize() uint8_t getCount() { return _cnt; }; - protected: boolean _sorted; uint8_t _size; @@ -66,8 +63,8 @@ protected: uint8_t _idx; #ifdef RUNNING_MEDIAN_USE_MALLOC - float * _ar; - uint8_t * _p; + float *_ar; + uint8_t *_p; #else float _ar[MEDIAN_MAX_SIZE]; uint8_t _p[MEDIAN_MAX_SIZE]; diff --git a/esp32/src/DS18B20.cpp b/esp32/src/DS18B20.cpp index 73c52cf..14d359f 100644 --- a/esp32/src/DS18B20.cpp +++ b/esp32/src/DS18B20.cpp @@ -11,40 +11,45 @@ #include "DS18B20.h" -#define STARTCONV 0x44 -#define READSCRATCH 0xBE // Read EEPROM -#define TEMP_LSB 0 -#define TEMP_MSB 1 -#define SCRATCHPADSIZE 9 -#define OFFSET_CRC8 8 /**< 9th byte has the CRC of the complete data */ +#define STARTCONV 0x44 +#define READSCRATCH 0xBE // Read EEPROM +#define TEMP_LSB 0 +#define TEMP_MSB 1 +#define SCRATCHPADSIZE 9 +#define OFFSET_CRC8 8 /**< 9th byte has the CRC of the complete data */ //Printf debugging //#define DS_DEBUG -int Ds18B20::readDevices() { +int Ds18B20::readDevices() +{ byte addr[8]; int amount = -1; - while (this->mDs->search(addr)) { + while (this->mDs->search(addr)) + { amount++; } this->mDs->reset_search(); return amount; } -int Ds18B20::readAllTemperatures(float* pTemperatures, int maxTemperatures) { +int Ds18B20::readAllTemperatures(float *pTemperatures, int maxTemperatures) +{ byte addr[8]; uint8_t scratchPad[SCRATCHPADSIZE]; int currentTemp = 0; - while (this->mDs->search(addr)) { + while (this->mDs->search(addr)) + { this->mDs->reset(); this->mDs->select(addr); this->mDs->write(STARTCONV); } delay(750); - - while (this->mDs->search(addr)) { + + while (this->mDs->search(addr)) + { this->mDs->reset(); this->mDs->select(addr); this->mDs->write(READSCRATCH); @@ -62,28 +67,32 @@ int Ds18B20::readAllTemperatures(float* pTemperatures, int maxTemperatures) { // byte 7: DS18S20: COUNT_PER_C // DS18B20 & DS1822: store for crc // byte 8: SCRATCHPAD_CRC - for (uint8_t i = 0; i < 9; i++) { + for (uint8_t i = 0; i < 9; i++) + { scratchPad[i] = this->mDs->read(); } uint8_t crc8 = this->mDs->crc8(scratchPad, 8); /* Only work an valid data */ - if (crc8 == scratchPad[OFFSET_CRC8]) { - int16_t fpTemperature = (((int16_t) scratchPad[TEMP_MSB]) << 11) - | (((int16_t) scratchPad[TEMP_LSB]) << 3); - float celsius = (float) fpTemperature * 0.0078125; + if (crc8 == scratchPad[OFFSET_CRC8]) + { + int16_t fpTemperature = (((int16_t)scratchPad[TEMP_MSB]) << 11) | (((int16_t)scratchPad[TEMP_LSB]) << 3); + float celsius = (float)fpTemperature * 0.0078125; #ifdef DS_DEBUG - Serial.printf("\r\nTemp%d %f °C (Raw: %d, %x =? %x)\r\n", (currentTemp+1), celsius, fpTemperature, crc8, scratchPad[8]); + Serial.printf("\r\nTemp%d %f °C (Raw: %d, %x =? %x)\r\n", (currentTemp + 1), celsius, fpTemperature, crc8, scratchPad[8]); #endif /* check, if the buffer as some space for our data */ - if (currentTemp < maxTemperatures) { + if (currentTemp < maxTemperatures) + { pTemperatures[currentTemp] = celsius; - } else { + } + else + { return -1; } } currentTemp++; - } + } this->mDs->reset(); #ifdef DS_DEBUG Serial.println(" No more addresses."); diff --git a/esp32/src/PlantCtrl.cpp b/esp32/src/PlantCtrl.cpp index ec19476..0660dff 100644 --- a/esp32/src/PlantCtrl.cpp +++ b/esp32/src/PlantCtrl.cpp @@ -12,76 +12,82 @@ #include "PlantCtrl.h" -Plant::Plant(int pinSensor, int pinPump,int plantId, HomieNode* plant, PlantSettings_t* setting) { +Plant::Plant(int pinSensor, int pinPump, int plantId, HomieNode *plant, PlantSettings_t *setting) +{ this->mPinSensor = pinSensor; this->mPinPump = pinPump; this->mPlant = plant; - this->mSetting = setting; + this->mSetting = setting; } -void Plant::init(void) { +void Plant::init(void) +{ /* Initialize Home Settings validator */ this->mSetting->pSensorDry->setDefaultValue(DEACTIVATED_PLANT); - this->mSetting->pSensorDry->setValidator([] (long candidate) { - return (((candidate >= 0) && (candidate <= 4095) ) || candidate == DEACTIVATED_PLANT); + this->mSetting->pSensorDry->setValidator([](long candidate) { + return (((candidate >= 0) && (candidate <= 4095)) || candidate == DEACTIVATED_PLANT); }); this->mSetting->pPumpAllowedHourRangeStart->setDefaultValue(8); // start at 8:00 - this->mSetting->pPumpAllowedHourRangeStart->setValidator([] (long candidate) { - return ((candidate >= 0) && (candidate <= 23) ); + this->mSetting->pPumpAllowedHourRangeStart->setValidator([](long candidate) { + return ((candidate >= 0) && (candidate <= 23)); }); this->mSetting->pPumpAllowedHourRangeEnd->setDefaultValue(20); // stop pumps at 20:00 - this->mSetting->pPumpAllowedHourRangeEnd->setValidator([] (long candidate) { - return ((candidate >= 0) && (candidate <= 23) ); + this->mSetting->pPumpAllowedHourRangeEnd->setValidator([](long candidate) { + return ((candidate >= 0) && (candidate <= 23)); }); this->mSetting->pPumpOnlyWhenLowLight->setDefaultValue(true); this->mSetting->pPumpCooldownInHours->setDefaultValue(20); // minutes - this->mSetting->pPumpCooldownInHours->setValidator([] (long candidate) { - return ((candidate >= 0) && (candidate <= 1024) ); + this->mSetting->pPumpCooldownInHours->setValidator([](long candidate) { + return ((candidate >= 0) && (candidate <= 1024)); }); /* Initialize Hardware */ pinMode(this->mPinPump, OUTPUT); pinMode(this->mPinSensor, ANALOG); - digitalWrite(this->mPinPump, LOW); + digitalWrite(this->mPinPump, LOW); } -void Plant::addSenseValue(void) { - this->moistureRaw.add( analogRead(this->mPinSensor) ); +void Plant::addSenseValue(void) +{ + this->moistureRaw.add(analogRead(this->mPinSensor)); } -void Plant::postMQTTconnection(void) { +void Plant::postMQTTconnection(void) +{ const String OFF = String("OFF"); - this->mConnected=true; + this->mConnected = true; this->mPlant->setProperty("switch").send(OFF); } -void Plant::deactivatePump(void) { +void Plant::deactivatePump(void) +{ digitalWrite(this->mPinPump, LOW); - if (this->mConnected) { + if (this->mConnected) + { const String OFF = String("OFF"); this->mPlant->setProperty("switch").send(OFF); } } -void Plant::activatePump(void) { +void Plant::activatePump(void) +{ digitalWrite(this->mPinPump, HIGH); - if (this->mConnected) { + if (this->mConnected) + { const String OFF = String("ON"); this->mPlant->setProperty("switch").send(OFF); } } -void Plant::advertise(void) { +void Plant::advertise(void) +{ // Advertise topics - this->mPlant->advertise("switch").setName("Pump 1") - .setDatatype("boolean"); + this->mPlant->advertise("switch").setName("Pump 1").setDatatype("boolean"); //FIXME add .settable(this->switchHandler) - this->mPlant->advertise("moist").setName("Percent") - .setDatatype("number") - .setUnit("%"); + this->mPlant->advertise("moist").setName("Percent").setDatatype("number").setUnit("%"); + this->mPlant->advertise("moistraw").setName("adc").setDatatype("number").setUnit("3.3/4096V"); } - /* FIXME bool Plant::switchHandler(const HomieRange& range, const String& value) { if (range.isRange) return false; // only one switch is present diff --git a/esp32/src/RunningMedian.cpp b/esp32/src/RunningMedian.cpp index e18f0e8..b482d12 100644 --- a/esp32/src/RunningMedian.cpp +++ b/esp32/src/RunningMedian.cpp @@ -31,8 +31,8 @@ RunningMedian::RunningMedian(const uint8_t size) _size = constrain(size, MEDIAN_MIN_SIZE, MEDIAN_MAX_SIZE); #ifdef RUNNING_MEDIAN_USE_MALLOC - _ar = (float *) malloc(_size * sizeof(float)); - _p = (uint8_t *) malloc(_size * sizeof(uint8_t)); + _ar = (float *)malloc(_size * sizeof(float)); + _p = (uint8_t *)malloc(_size * sizeof(uint8_t)); #endif clear(); @@ -63,18 +63,22 @@ void RunningMedian::clear() void RunningMedian::add(float value) { _ar[_idx++] = value; - if (_idx >= _size) _idx = 0; // wrap around - if (_cnt < _size) _cnt++; + if (_idx >= _size) + _idx = 0; // wrap around + if (_cnt < _size) + _cnt++; _sorted = false; } float RunningMedian::getMedian() { - if (_cnt == 0) return NAN; + if (_cnt == 0) + return NAN; - if (_sorted == false) sort(); + if (_sorted == false) + sort(); - if (_cnt & 0x01) // is it odd sized? + if (_cnt & 0x01) // is it odd sized? { return _ar[_p[_cnt / 2]]; } @@ -83,7 +87,8 @@ float RunningMedian::getMedian() float RunningMedian::getAverage() { - if (_cnt == 0) return NAN; + if (_cnt == 0) + return NAN; float sum = 0; for (uint8_t i = 0; i < _cnt; i++) @@ -95,13 +100,16 @@ float RunningMedian::getAverage() float RunningMedian::getAverage(uint8_t nMedians) { - if ((_cnt == 0) || (nMedians == 0)) return NAN; + if ((_cnt == 0) || (nMedians == 0)) + return NAN; - if (_cnt < nMedians) nMedians = _cnt; // when filling the array for first time + if (_cnt < nMedians) + nMedians = _cnt; // when filling the array for first time uint8_t start = ((_cnt - nMedians) / 2); uint8_t stop = start + nMedians; - if (_sorted == false) sort(); + if (_sorted == false) + sort(); float sum = 0; for (uint8_t i = start; i < stop; i++) @@ -113,7 +121,8 @@ float RunningMedian::getAverage(uint8_t nMedians) float RunningMedian::getElement(const uint8_t n) { - if ((_cnt == 0) || (n >= _cnt)) return NAN; + if ((_cnt == 0) || (n >= _cnt)) + return NAN; uint8_t pos = _idx + n; if (pos >= _cnt) // faster than % @@ -125,18 +134,21 @@ float RunningMedian::getElement(const uint8_t n) float RunningMedian::getSortedElement(const uint8_t n) { - if ((_cnt == 0) || (n >= _cnt)) return NAN; + if ((_cnt == 0) || (n >= _cnt)) + return NAN; - if (_sorted == false) sort(); + if (_sorted == false) + sort(); return _ar[_p[n]]; } // n can be max <= half the (filled) size float RunningMedian::predict(const uint8_t n) { - if ((_cnt == 0) || (n >= _cnt / 2)) return NAN; + if ((_cnt == 0) || (n >= _cnt / 2)) + return NAN; - float med = getMedian(); // takes care of sorting ! + float med = getMedian(); // takes care of sorting ! if (_cnt & 0x01) { return max(med - _ar[_p[_cnt / 2 - n]], _ar[_p[_cnt / 2 + n]] - med); @@ -162,7 +174,8 @@ void RunningMedian::sort() flag = false; } } - if (flag) break; + if (flag) + break; } _sorted = true; } diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 8d4b6b5..a066305 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -16,52 +16,48 @@ #include "time.h" #include "esp_sleep.h" #include "RunningMedian.h" -#include #include const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minutes */ -#define AMOUNT_SENOR_QUERYS 8 -#define SENSOR_QUERY_SHIFTS 3 -#define SOLAR4SENSORS 6.0f -#define TEMP_INIT_VALUE -999.0f -#define TEMP_MAX_VALUE 85.0f -#define HalfHour 60 +#define AMOUNT_SENOR_QUERYS 8 +#define SENSOR_QUERY_SHIFTS 3 +#define SOLAR4SENSORS 6.0f +#define TEMP_INIT_VALUE -999.0f +#define TEMP_MAX_VALUE 85.0f +#define HalfHour 60 /********************* non volatile enable after deepsleep *******************************/ RTC_DATA_ATTR long gotoMode2AfterThisTimestamp = 0; -RTC_DATA_ATTR long rtcDeepSleepTime = 0; /**< Time, when the microcontroller shall be up again */ +RTC_DATA_ATTR long rtcDeepSleepTime = 0; /**< Time, when the microcontroller shall be up again */ RTC_DATA_ATTR long rtcLastActive0 = 0; -RTC_DATA_ATTR long rtcMoistureTrigger0 = 0; /** 100) + { + pct = 100; + } + mPlants[i].setProperty("moist").send(String(pct)); + mPlants[i].setProperty("moistraw").send(String(mPlants[i].getSensorValue())); } - sensorWater.setProperty("remaining").send(String(waterLevelMax.get() - mWaterGone )); - Serial << "W : " << mWaterGone << " cm (" << String(waterLevelMax.get() - mWaterGone ) << "%)" << endl; + sensorWater.setProperty("remaining").send(String(waterLevelMax.get() - mWaterGone)); + Serial << "W : " << mWaterGone << " cm (" << String(waterLevelMax.get() - mWaterGone) << "%)" << endl; lastWaterValue = mWaterGone; - sensorLipo.setProperty("percent").send( String(100 * lipoRawSensor.getAverage() / 4095) ); - sensorLipo.setProperty("volt").send( String(getBatteryVoltage()) ); - sensorSolar.setProperty("percent").send(String((100 * solarRawSensor.getAverage() ) / 4095)); - sensorSolar.setProperty("volt").send( String(getSolarVoltage()) ); + sensorLipo.setProperty("percent").send(String(100 * lipoRawSensor.getAverage() / 4095)); + sensorLipo.setProperty("volt").send(String(getBatteryVoltage())); + sensorSolar.setProperty("percent").send(String((100 * solarRawSensor.getAverage()) / 4095)); + sensorSolar.setProperty("volt").send(String(getSolarVoltage())); - float t1 = temp1.getMedian(); - if (t1 != NAN) { - sensorTemp.setProperty("control").send( String(t1)); + if (t1 != NAN) + { + sensorTemp.setProperty("control").send(String(t1)); } float t2 = temp2.getMedian(); - if (t2 != NAN) { - sensorTemp.setProperty("temp").send( String(t2)); + if (t2 != NAN) + { + sensorTemp.setProperty("temp").send(String(t2)); } //give mqtt time, use via publish callback instead? delay(100); - bool lipoTempWarning = t1!=85 && t2!=85 && abs(t1 - t2) > 10; - if(lipoTempWarning){ + bool lipoTempWarning = t1 != 85 && t2 != 85 && abs(t1 - t2) > 10; + if (lipoTempWarning) + { Serial.println("Lipo temp incorrect, panic mode deepsleep TODO"); //espDeepSleepFor(PANIK_MODE_DEEPSLEEP); //return; } - for(int i=0; i < MAX_PLANTS; i++) { + for (int i = 0; i < MAX_PLANTS; i++) + { setMoistureTrigger(i, mPlants[i].mSetting->pSensorDry->get()); } - - bool hasWater = true;//FIXMEmWaterGone > waterLevelMin.get(); + bool hasWater = true; //FIXMEmWaterGone > waterLevelMin.get(); //FIXME no water warning message lastPumpRunning = determineNextPump(); - if(lastPumpRunning != -1 && !hasWater){ + if (lastPumpRunning != -1 && !hasWater) + { Serial.println("Want to pump but no water"); } - if(lastPumpRunning != -1 && hasWater){ + if (lastPumpRunning != -1 && hasWater) + { digitalWrite(OUTPUT_PUMP, HIGH); setLastActivationForPump(lastPumpRunning, getCurrentTime()); mPlants[lastPumpRunning].activatePump(); } - if(lastPumpRunning == -1 || !hasWater){ - if(getSolarVoltage() < SOLAR_CHARGE_MIN_VOLTAGE){ - gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepNightTime.get(); + if (lastPumpRunning == -1 || !hasWater) + { + if (getSolarVoltage() < SOLAR_CHARGE_MIN_VOLTAGE) + { + gotoMode2AfterThisTimestamp = getCurrentTime() + deepSleepNightTime.get(); Serial.println("No pumps to activate and low light, deepSleepNight"); espDeepSleepFor(deepSleepNightTime.get()); rtcDeepSleepTime = deepSleepNightTime.get(); - }else { - gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepTime.get(); + } + else + { + gotoMode2AfterThisTimestamp = getCurrentTime() + deepSleepTime.get(); Serial.println("No pumps to activate, deepSleep"); espDeepSleepFor(deepSleepTime.get()); rtcDeepSleepTime = deepSleepTime.get(); } - - }else { + } + else + { gotoMode2AfterThisTimestamp = 0; Serial.println("Running pump, watering deepsleep"); espDeepSleepFor(wateringDeepSleep.get(), true); } - } -long getMoistureTrigger(int plantId){ - if(plantId == 0){ +long getMoistureTrigger(int plantId) +{ + if (plantId == 0) + { return rtcMoistureTrigger0; } - if(plantId == 1){ + if (plantId == 1) + { return rtcMoistureTrigger1; } - if(plantId == 2){ + if (plantId == 2) + { return rtcMoistureTrigger2; } - if(plantId == 3){ + if (plantId == 3) + { return rtcMoistureTrigger3; } - if(plantId == 4){ + if (plantId == 4) + { return rtcMoistureTrigger4; } - if(plantId == 5){ + if (plantId == 5) + { return rtcMoistureTrigger5; } - if(plantId == 6){ + if (plantId == 6) + { return rtcMoistureTrigger6; - } + } return -1; } - - -void setLastActivationForPump(int plantId, long value){ - if(plantId == 0){ +void setLastActivationForPump(int plantId, long value) +{ + if (plantId == 0) + { rtcLastActive0 = value; } - if(plantId == 1){ + if (plantId == 1) + { rtcLastActive1 = value; } - if(plantId == 2){ + if (plantId == 2) + { rtcLastActive2 = value; } - if(plantId == 3){ + if (plantId == 3) + { rtcLastActive3 = value; } - if(plantId == 4){ + if (plantId == 4) + { rtcLastActive4 = value; } - if(plantId == 5){ + if (plantId == 5) + { rtcLastActive5 = value; } - if(plantId == 6){ + if (plantId == 6) + { rtcLastActive6 = value; - } + } } -long getLastActivationForPump(int plantId){ - if(plantId == 0){ +long getLastActivationForPump(int plantId) +{ + if (plantId == 0) + { return rtcLastActive0; } - if(plantId == 1){ + if (plantId == 1) + { return rtcLastActive1; } - if(plantId == 2){ + if (plantId == 2) + { return rtcLastActive2; } - if(plantId == 3){ + if (plantId == 3) + { return rtcLastActive3; } - if(plantId == 4){ + if (plantId == 4) + { return rtcLastActive4; } - if(plantId == 5){ + if (plantId == 5) + { return rtcLastActive5; } - if(plantId == 6){ + if (plantId == 6) + { return rtcLastActive6; } return -1; @@ -341,7 +397,8 @@ long getLastActivationForPump(int plantId){ * @brief Sensors, that are connected to GPIOs, mandatory for WIFI. * These sensors (ADC2) can only be read when no Wifi is used. */ -void readSensors() { +void readSensors() +{ Serial << "Read Sensors" << endl; readSystemSensors(); @@ -352,8 +409,10 @@ void readSensors() { delay(100); /* wait before reading something */ - for (int readCnt=0;readCnt < AMOUNT_SENOR_QUERYS; readCnt++) { - for(int i=0; i < MAX_PLANTS; i++) { + for (int readCnt = 0; readCnt < AMOUNT_SENOR_QUERYS; readCnt++) + { + for (int i = 0; i < MAX_PLANTS; i++) + { mPlants[i].addSenseValue(); } } @@ -363,112 +422,123 @@ void readSensors() { Serial << "DS18B20" << String(dallas.readDevices()) << endl; delay(200); - /* Required to read the temperature once */ float temp[2] = {TEMP_MAX_VALUE, TEMP_MAX_VALUE}; - float* pFloat = temp; + float *pFloat = temp; int sensors = dallas.readAllTemperatures(pFloat, 2); - if (sensors > 0) { + if (sensors > 0) + { Serial << "t1: " << String(temp[0]) << endl; temp1.add(temp[0]); } - if (sensors > 1) { + if (sensors > 1) + { Serial << "t2: " << String(temp[1]) << endl; temp2.add(temp[1]); } - /* Use the Ultrasonic sensor to measure waterLevel */ - + digitalWrite(SENSOR_SR04_TRIG, LOW); delayMicroseconds(2); digitalWrite(SENSOR_SR04_TRIG, HIGH); delayMicroseconds(10); digitalWrite(SENSOR_SR04_TRIG, LOW); float duration = pulseIn(SENSOR_SR04_ECHO, HIGH); - waterRawSensor.add((duration*.343)/2); + waterRawSensor.add((duration * .343) / 2); /* deactivate the sensors */ digitalWrite(OUTPUT_SENSOR, LOW); } //Homie.getMqttClient().disconnect(); -void onHomieEvent(const HomieEvent& event) { - switch(event.type) { - case HomieEventType::SENDING_STATISTICS: - Homie.getLogger() << "My statistics" << endl; - break; - case HomieEventType::MQTT_READY: - Serial.printf("NTP Setup with server %s\r\n", ntpServer.get()); - configTime(0, 0, ntpServer.get()); - //wait for rtc sync? - rtcDeepSleepTime = deepSleepTime.get(); - Serial << "Setup plants" << endl; - for(int i=0; i < MAX_PLANTS; i++) { - mPlants[i].postMQTTconnection(); - } +void onHomieEvent(const HomieEvent &event) +{ + switch (event.type) + { + case HomieEventType::SENDING_STATISTICS: + Homie.getLogger() << "My statistics" << endl; + break; + case HomieEventType::MQTT_READY: + Serial.printf("NTP Setup with server %s\r\n", ntpServer.get()); + configTime(0, 0, ntpServer.get()); + //wait for rtc sync? + rtcDeepSleepTime = deepSleepTime.get(); + Serial << "Setup plants" << endl; + for (int i = 0; i < MAX_PLANTS; i++) + { + mPlants[i].postMQTTconnection(); + } - mode2MQTT(); - break; - case HomieEventType::READY_TO_SLEEP: - Homie.getLogger() << "rtsleep" << endl; - esp_deep_sleep_start(); - break; - case HomieEventType::OTA_STARTED: - Homie.getLogger() << "OTA started" << endl; - digitalWrite(OUTPUT_SENSOR, HIGH); - digitalWrite(OUTPUT_PUMP, HIGH); - gpio_hold_dis(GPIO_NUM_13); //pump pwr - gpio_deep_sleep_hold_dis(); - for (int i=0; i < MAX_PLANTS; i++) { - mPlants[i].deactivatePump(); - } - mode3Active=true; - break; - case HomieEventType::OTA_SUCCESSFUL: + mode2MQTT(); + break; + case HomieEventType::READY_TO_SLEEP: + Homie.getLogger() << "rtsleep" << endl; + esp_deep_sleep_start(); + break; + case HomieEventType::OTA_STARTED: + Homie.getLogger() << "OTA started" << endl; + digitalWrite(OUTPUT_SENSOR, HIGH); + digitalWrite(OUTPUT_PUMP, HIGH); + gpio_hold_dis(GPIO_NUM_13); //pump pwr + gpio_deep_sleep_hold_dis(); + for (int i = 0; i < MAX_PLANTS; i++) + { + mPlants[i].deactivatePump(); + } + mode3Active = true; + break; + case HomieEventType::OTA_SUCCESSFUL: Homie.getLogger() << "OTA successfull" << endl; - digitalWrite(OUTPUT_SENSOR, LOW); - digitalWrite(OUTPUT_PUMP, LOW); - ESP.restart(); - break; - default: - break; + digitalWrite(OUTPUT_SENSOR, LOW); + digitalWrite(OUTPUT_PUMP, LOW); + ESP.restart(); + break; + default: + break; } } -int determineNextPump(){ +int determineNextPump() +{ float solarValue = getSolarVoltage(); - bool isLowLight =(solarValue > SOLAR_CHARGE_MIN_VOLTAGE || solarValue < SOLAR_CHARGE_MAX_VOLTAGE); + bool isLowLight = (solarValue > SOLAR_CHARGE_MIN_VOLTAGE || solarValue < SOLAR_CHARGE_MAX_VOLTAGE); //FIXME instead of for, use sorted by last activation index to ensure equal runtime? int pumpToUse = -1; - for(int i=0; i < MAX_PLANTS; i++) { + for (int i = 0; i < MAX_PLANTS; i++) + { Plant plant = mPlants[i]; long lastActivation = getLastActivationForPump(i); - long sinceLastActivation = getCurrentTime()-lastActivation; + long sinceLastActivation = getCurrentTime() - lastActivation; //this pump is in cooldown skip it and disable low power mode trigger for it - if(plant.isInCooldown(sinceLastActivation) ){ - Serial.printf("%d Skipping due to cooldown\r\n", i); + if (plant.isInCooldown(sinceLastActivation)) + { + Serial.printf("%d Skipping due to cooldown %ld \r\n", i, sinceLastActivation); setMoistureTrigger(i, DEACTIVATED_PLANT); continue; } //skip as it is not low light - if(!isLowLight && plant.isAllowedOnlyAtLowLight()){ + if (!isLowLight && plant.isAllowedOnlyAtLowLight()) + { Serial.printf("%d No pump required: due to light\r\n", i); continue; } - if(plant.isPumpRequired()){ + if (plant.isPumpRequired()) + { Serial.printf("%d Requested pumping\r\n", i); pumpToUse = i; } - if(plant.isPumpTriggerActive()){ + else if (plant.isPumpTriggerActive()) + { Serial.printf("%d No pump required: disabled trigger %f / %ld\r\n", i, plant.getCurrentMoisture(), plant.getSettingsMoisture()); - }else { + } + else + { Serial.printf("%d No pump required: disabled trigger\r\n", i); } - } return pumpToUse; } @@ -481,38 +551,44 @@ int determineNextPump(){ * @return true when the command was parsed and executed succuessfully * @return false on errors when parsing the request */ -bool aliveHandler(const HomieRange& range, const String& value) { - if (range.isRange) return false; // only one controller is present - if (value.equals("ON") || value.equals("On") || value.equals("1")) { - mode3Active=true; - } else { - mode3Active=false; +bool aliveHandler(const HomieRange &range, const String &value) +{ + if (range.isRange) + return false; // only one controller is present + if (value.equals("ON") || value.equals("On") || value.equals("1")) + { + mode3Active = true; } - + else + { + mode3Active = false; + } + return true; } -void homieLoop(){ - +void homieLoop() +{ } -void systemInit(){ +void systemInit() +{ WiFi.mode(WIFI_STA); Homie_setFirmware("PlantControl", FIRMWARE_VERSION); // Set default values - + //in seconds deepSleepTime.setDefaultValue(60); deepSleepNightTime.setDefaultValue(600); wateringDeepSleep.setDefaultValue(5); ntpServer.setDefaultValue("pool.ntp.org"); - /* waterLevelMax 1000 */ /* 100cm in mm */ - waterLevelMin.setDefaultValue(50); /* 5cm in mm */ - waterLevelWarn.setDefaultValue(500); /* 50cm in mm */ - waterLevelVol.setDefaultValue(5000); /* 5l in ml */ + /* waterLevelMax 1000 */ /* 100cm in mm */ + waterLevelMin.setDefaultValue(50); /* 5cm in mm */ + waterLevelWarn.setDefaultValue(500); /* 50cm in mm */ + waterLevelVol.setDefaultValue(5000); /* 5l in ml */ Homie.setLoopFunction(homieLoop); Homie.onEvent(onHomieEvent); @@ -520,63 +596,70 @@ void systemInit(){ Homie.setup(); mConfigured = Homie.isConfigured(); - if (mConfigured) { - for(int i=0; i < MAX_PLANTS; i++) { + if (mConfigured) + { + for (int i = 0; i < MAX_PLANTS; i++) + { mPlants[i].advertise(); } sensorTemp.advertise("control") - .setName("Temperature") - .setDatatype("number") - .setUnit("°C"); + .setName("Temperature") + .setDatatype("number") + .setUnit("°C"); sensorTemp.advertise("temp") - .setName("Temperature") - .setDatatype("number") - .setUnit("°C"); + .setName("Temperature") + .setDatatype("number") + .setUnit("°C"); sensorLipo.advertise("percent") - .setName("Percent") - .setDatatype("number") - .setUnit("%"); + .setName("Percent") + .setDatatype("number") + .setUnit("%"); sensorLipo.advertise("volt") - .setName("Volt") - .setDatatype("number") - .setUnit("V"); + .setName("Volt") + .setDatatype("number") + .setUnit("V"); sensorSolar.advertise("percent") - .setName("Percent") - .setDatatype("number") - .setUnit("%"); + .setName("Percent") + .setDatatype("number") + .setUnit("%"); sensorSolar.advertise("volt") - .setName("Volt") - .setDatatype("number") - .setUnit("V"); + .setName("Volt") + .setDatatype("number") + .setUnit("V"); sensorWater.advertise("remaining").setDatatype("number").setUnit("%"); } stayAlive.advertise("alive").setName("Alive").setDatatype("number").settable(aliveHandler); } - -bool mode1(){ +bool mode1() +{ Serial.println("==== Mode 1 ===="); Serial << getCurrentTime() << " curtime" << endl; readSensors(); - //queue sensor values for + //queue sensor values for - if (rtcDeepSleepTime == 0){ + if (rtcDeepSleepTime == 0) + { Serial.println("1 missing rtc value, going to mode2"); return true; } - for(int i = 0; i < MAX_PLANTS; i++){ - long trigger =getMoistureTrigger(i); - if (trigger == 0) { + for (int i = 0; i < MAX_PLANTS; i++) + { + long trigger = getMoistureTrigger(i); + if (trigger == 0) + { Serial << "Missing rtc trigger " << i << endl; return true; } - if(trigger == DEACTIVATED_PLANT){ + if (trigger == DEACTIVATED_PLANT) + { continue; } - if(mPlants[i].getSensorValue() <= trigger){ + if (mPlants[i].getSensorValue() <= trigger) + { Serial << "plant dry starting mode 2" << i << endl; return true; } @@ -585,26 +668,32 @@ bool mode1(){ //check how long it was already in mode1 if to long goto mode2 long cTime = getCurrentTime(); - if(cTime < 100000){ + if (cTime < 100000) + { Serial.println("Starting mode 2 due to missing ntp"); //missing ntp time boot to mode3 return true; } - if(gotoMode2AfterThisTimestamp < cTime){ + if (gotoMode2AfterThisTimestamp < cTime) + { Serial.println("Starting mode 2 after specified mode1 time"); return true; - } else { + } + else + { Serial << "Mode2 Timer " << gotoMode2AfterThisTimestamp << " curtime " << cTime << endl; } return false; } -void mode2(){ +void mode2() +{ Serial.println("==== Mode 2 ===="); systemInit(); /* Jump into Mode 3, if not configured */ - if (!mConfigured) { + if (!mConfigured) + { Serial.println("==== Mode 3 ===="); mode3Active = true; } @@ -614,12 +703,15 @@ void mode2(){ * @brief Startup function * Is called once, the controller is started */ -void setup() { +void setup() +{ Serial.begin(115200); Serial.setTimeout(1000); // Set timeout of 1 second - Serial << endl << endl; + Serial << endl + << endl; /* Intialize Plant */ - for(int i=0; i < MAX_PLANTS; i++) { + for (int i = 0; i < MAX_PLANTS; i++) + { mPlants[i].init(); } @@ -631,11 +723,12 @@ void setup() { /* Power pins */ pinMode(OUTPUT_PUMP, OUTPUT); - + /* Disable Wifi and bluetooth */ WiFi.mode(WIFI_OFF); - if (HomieInternals::MAX_CONFIG_SETTING_SIZE < MAX_CONFIG_SETTING_ITEMS) { + if (HomieInternals::MAX_CONFIG_SETTING_SIZE < MAX_CONFIG_SETTING_ITEMS) + { //increase the config settings to 50 and the json to 3000 Serial << "Limits.hpp" << endl; } @@ -643,20 +736,24 @@ void setup() { // Big TODO use here the settings in RTC_Memory //Panik mode, the Lipo is empty, sleep a long long time: - if ((getBatteryVoltage() < MINIMUM_LIPO_VOLT) && - (getBatteryVoltage() > NO_LIPO_VOLT)) { + if ((getBatteryVoltage() < MINIMUM_LIPO_VOLT) && + (getBatteryVoltage() > NO_LIPO_VOLT)) + { Serial << PANIK_MODE_DEEPSLEEP << " s lipo " << getBatteryVoltage() << "V" << endl; esp_sleep_enable_timer_wakeup(PANIK_MODE_DEEPSLEEP_US); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF); - esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL,ESP_PD_OPTION_ON); + esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL, ESP_PD_OPTION_ON); esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF); esp_deep_sleep_start(); } - if(mode1()){ + if (mode1()) + { mode2(); - } else { + } + else + { Serial.println("nop"); espDeepSleepFor(rtcDeepSleepTime); } @@ -667,26 +764,33 @@ void setup() { * Executs the Homie base functionallity or triggers sleeping, if requested. */ long nextBlink = 0; -void loop() { - if (!mDeepsleep || mode3Active) { +void loop() +{ + if (!mDeepsleep || mode3Active) + { Homie.loop(); - } else { - Serial << "Bye" << endl; + } + else + { + Serial << "Bye" << endl; Serial.flush(); esp_deep_sleep_start(); } - if(millis() > 30000 && !mode3Active){ - Serial << (millis()/ 1000) << "not terminated watchdog putting to sleep" << endl; + if (millis() > 30000 && !mode3Active) + { + Serial << (millis() / 1000) << "not terminated watchdog putting to sleep" << endl; Serial.flush(); espDeepSleepFor(rtcDeepSleepTime); } /* Toggel Senor LED to visualize mode 3 */ - if(mode3Active){ - if (nextBlink < millis()) { + if (mode3Active) + { + if (nextBlink < millis()) + { nextBlink = millis() + 500; - digitalWrite(OUTPUT_SENSOR, ! digitalRead(OUTPUT_SENSOR)); + digitalWrite(OUTPUT_SENSOR, !digitalRead(OUTPUT_SENSOR)); } } } From 1dcf4df740f8a97ce0eca9f51e6776cf258da15a Mon Sep 17 00:00:00 2001 From: Empire Date: Wed, 4 Nov 2020 22:12:00 +0100 Subject: [PATCH 17/31] improve mode3 not pumping --- esp32/include/arduino-timer.h | 202 ---------------------------------- esp32/src/main.cpp | 16 ++- 2 files changed, 12 insertions(+), 206 deletions(-) delete mode 100644 esp32/include/arduino-timer.h diff --git a/esp32/include/arduino-timer.h b/esp32/include/arduino-timer.h deleted file mode 100644 index 48a56d0..0000000 --- a/esp32/include/arduino-timer.h +++ /dev/null @@ -1,202 +0,0 @@ -/** - arduino-timer - library for delaying function calls - - Copyright (c) 2018, Michael Contreras - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef _CM_ARDUINO_TIMER_H__ -#define _CM_ARDUINO_TIMER_H__ - -#if defined(ARDUINO) && ARDUINO >= 100 -#include -#else -#include -#endif - -#ifndef TIMER_MAX_TASKS - #define TIMER_MAX_TASKS 0x10 -#endif - -template < - size_t max_tasks = TIMER_MAX_TASKS, /* max allocated tasks */ - unsigned long (*time_func)() = millis, /* time function for timer */ - typename T = void * /* handler argument type */ -> -class Timer { - public: - - typedef uintptr_t Task; /* public task handle */ - typedef bool (*handler_t)(T opaque); /* task handler func signature */ - - /* Calls handler with opaque as argument in delay units of time */ - Task - in(unsigned long delay, handler_t h, T opaque = T()) - { - return task_id(add_task(time_func(), delay, h, opaque)); - } - - /* Calls handler with opaque as argument at time */ - Task - at(unsigned long time, handler_t h, T opaque = T()) - { - const unsigned long now = time_func(); - return task_id(add_task(now, time - now, h, opaque)); - } - - /* Calls handler with opaque as argument every interval units of time */ - Task - every(unsigned long interval, handler_t h, T opaque = T()) - { - return task_id(add_task(time_func(), interval, h, opaque, interval)); - } - - /* Cancel the timer task */ - void - cancel(Task &task) - { - if (!task) return; - - for (size_t i = 0; i < max_tasks; ++i) { - struct task * const t = &tasks[i]; - - if (t->handler && (t->id ^ task) == (uintptr_t)t) { - remove(t); - break; - } - } - - task = (Task)NULL; - } - - /* Ticks the timer forward - call this function in loop() */ - unsigned long - tick() - { - unsigned long ticks = (unsigned long)-1; - - for (size_t i = 0; i < max_tasks; ++i) { - struct task * const task = &tasks[i]; - - if (task->handler) { - const unsigned long t = time_func(); - const unsigned long duration = t - task->start; - - if (duration >= task->expires) { - task->repeat = task->handler(task->opaque) && task->repeat; - - if (task->repeat) task->start = t; - else remove(task); - } else { - const unsigned long remaining = task->expires - duration; - ticks = remaining < ticks ? remaining : ticks; - } - } - } - - return ticks == (unsigned long)-1 ? 0 : ticks; - } - - private: - - size_t ctr; - - struct task { - handler_t handler; /* task handler callback func */ - T opaque; /* argument given to the callback handler */ - unsigned long start, - expires; /* when the task expires */ - size_t repeat, /* repeat task */ - id; - } tasks[max_tasks]; - - inline - void - remove(struct task *task) - { - task->handler = NULL; - task->opaque = T(); - task->start = 0; - task->expires = 0; - task->repeat = 0; - task->id = 0; - } - - inline - Task - task_id(const struct task * const t) - { - const Task id = (Task)t; - - return id ? id ^ t->id : id; - } - - inline - struct task * - next_task_slot() - { - for (size_t i = 0; i < max_tasks; ++i) { - struct task * const slot = &tasks[i]; - if (slot->handler == NULL) return slot; - } - - return NULL; - } - - inline - struct task * - add_task(unsigned long start, unsigned long expires, - handler_t h, T opaque, bool repeat = 0) - { - struct task * const slot = next_task_slot(); - - if (!slot) return NULL; - - if (++ctr == 0) ++ctr; // overflow - - slot->id = ctr; - slot->handler = h; - slot->opaque = opaque; - slot->start = start; - slot->expires = expires; - slot->repeat = repeat; - - return slot; - } -}; - -/* create a timer with the default settings */ -inline Timer<> -timer_create_default() -{ - return Timer<>(); -} - -#endif diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index a066305..aed1cfb 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -266,9 +266,16 @@ void mode2MQTT() } if (lastPumpRunning != -1 && hasWater) { - digitalWrite(OUTPUT_PUMP, HIGH); - setLastActivationForPump(lastPumpRunning, getCurrentTime()); - mPlants[lastPumpRunning].activatePump(); + if (mode3Active) + { + Serial.println("Mode 3 active, ignoring pump request"); + } + else + { + digitalWrite(OUTPUT_PUMP, HIGH); + setLastActivationForPump(lastPumpRunning, getCurrentTime()); + mPlants[lastPumpRunning].activatePump(); + } } if (lastPumpRunning == -1 || !hasWater) { @@ -407,7 +414,7 @@ void readSensors() pinMode(OUTPUT_SENSOR, OUTPUT); digitalWrite(OUTPUT_SENSOR, HIGH); - delay(100); + delay(20); /* wait before reading something */ for (int readCnt = 0; readCnt < AMOUNT_SENOR_QUERYS; readCnt++) { @@ -415,6 +422,7 @@ void readSensors() { mPlants[i].addSenseValue(); } + delay(10); } Serial << "DS18B20" << endl; From a14f599f5a9ed5c8a9af00e59bd92c9d6d6fc21f Mon Sep 17 00:00:00 2001 From: Empire Date: Wed, 4 Nov 2020 23:28:08 +0100 Subject: [PATCH 18/31] missing sensor detection, delta trigger moisture working --- esp32/include/ControllerConfiguration.h | 4 +- esp32/include/HomieConfiguration.h | 1 + esp32/include/HomieTypes.h | 1 + esp32/include/PlantCtrl.h | 13 ++- esp32/src/PlantCtrl.cpp | 8 +- esp32/src/main.cpp | 130 +++++++++++++++++++++--- 6 files changed, 137 insertions(+), 20 deletions(-) diff --git a/esp32/include/ControllerConfiguration.h b/esp32/include/ControllerConfiguration.h index 43ef4f0..86eac83 100644 --- a/esp32/include/ControllerConfiguration.h +++ b/esp32/include/ControllerConfiguration.h @@ -11,7 +11,7 @@ #ifndef CONTROLLER_CONFIG_H #define CONTROLLER_CONFIG_H -#define FIRMWARE_VERSION "1.0.7" +#define FIRMWARE_VERSION "1.0.9" #define ADC_TO_VOLT(adc) ((adc) * 3.3 ) / 4095) #define ADC_TO_VOLT_WITH_MULTI(adc, multi) (((adc)*3.3 * (multi)) / 4095) @@ -64,7 +64,7 @@ #define PANIK_MODE_DEEPSLEEP_US (PANIK_MODE_DEEPSLEEP * 1000 * 1000) #define TEMPERATURE_DELTA_TRIGGER_IN_C 1 -#define MOIST_DELTA_TRIGGER_ADC 1337 +#define MOIST_DELTA_TRIGGER_ADC 10 #define SOLAR_DELTA_VOLT_ADC 3 #define LIPO_DELTA_VOLT_ADC 0.2 diff --git a/esp32/include/HomieConfiguration.h b/esp32/include/HomieConfiguration.h index f300a76..f8671de 100644 --- a/esp32/include/HomieConfiguration.h +++ b/esp32/include/HomieConfiguration.h @@ -37,6 +37,7 @@ HomieNode stayAlive("stay", "alive", "alive"); /** *********************************** Settings ******************************* */ +HomieSetting maxTimeBetweenMQTTUpdates("mqttSleep", "time in seconds to start into mode2"); HomieSetting deepSleepTime("deepsleep", "time in seconds to sleep (0 deactivats it)"); HomieSetting deepSleepNightTime("nightsleep", "time in seconds to sleep (0 uses same setting: deepsleep at night, too)"); HomieSetting wateringDeepSleep("pumpdeepsleep", "time seconds to sleep, while a pump is running"); diff --git a/esp32/include/HomieTypes.h b/esp32/include/HomieTypes.h index 2c915c5..fffc43b 100644 --- a/esp32/include/HomieTypes.h +++ b/esp32/include/HomieTypes.h @@ -14,6 +14,7 @@ #include #define DEACTIVATED_PLANT 5000 +#define MISSING_SENSOR 5001 typedef struct PlantSettings_t { diff --git a/esp32/include/PlantCtrl.h b/esp32/include/PlantCtrl.h index 6902d38..d00c3f5 100644 --- a/esp32/include/PlantCtrl.h +++ b/esp32/include/PlantCtrl.h @@ -48,8 +48,6 @@ public: */ void addSenseValue(void); - int getSensorValue() { return moistureRaw.getMedian(); } - void deactivatePump(void); void activatePump(void); @@ -73,7 +71,10 @@ public: } float getCurrentMoisture() - { + { + if(moistureRaw.getCount()==0){ + return MISSING_SENSOR; + } return this->moistureRaw.getMedian(); } long getSettingsMoisture() @@ -108,7 +109,11 @@ public: return false; } - return (this->mSetting->pPumpCooldownInHours->get() > sinceLastActivation / 3600); + return (getCooldownInSeconds() > sinceLastActivation); + } + + long getCooldownInSeconds(){ + return this->mSetting->pPumpCooldownInHours->get()*60*60; } bool isAllowedOnlyAtLowLight(void) diff --git a/esp32/src/PlantCtrl.cpp b/esp32/src/PlantCtrl.cpp index 0660dff..046db81 100644 --- a/esp32/src/PlantCtrl.cpp +++ b/esp32/src/PlantCtrl.cpp @@ -11,6 +11,7 @@ */ #include "PlantCtrl.h" +#include "ControllerConfiguration.h" Plant::Plant(int pinSensor, int pinPump, int plantId, HomieNode *plant, PlantSettings_t *setting) { @@ -48,8 +49,11 @@ void Plant::init(void) } void Plant::addSenseValue(void) -{ - this->moistureRaw.add(analogRead(this->mPinSensor)); +{ + int raw = analogRead(this->mPinSensor); + if(raw < MOIST_SENSOR_MAX_ADC && raw > MOIST_SENSOR_MIN_ADC){ + this->moistureRaw.add(raw); + } } void Plant::postMQTTconnection(void) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index aed1cfb..ce27091 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -33,18 +33,25 @@ RTC_DATA_ATTR long gotoMode2AfterThisTimestamp = 0; RTC_DATA_ATTR long rtcDeepSleepTime = 0; /**< Time, when the microcontroller shall be up again */ RTC_DATA_ATTR long rtcLastActive0 = 0; RTC_DATA_ATTR long rtcMoistureTrigger0 = 0; /** MOIST_DELTA_TRIGGER_ADC); + setLastMoisture(i, current); + if (tmp) + { + triggerMoistStart = true; + Serial.printf("Mode2 start due to moist delta in plant %d with %ld \r\n", i, delta); + } + } Serial << "DS18B20" << endl; /* Read the temperature sensors once, as first time 85 degree is returned */ @@ -456,6 +548,7 @@ void readSensors() waterRawSensor.add((duration * .343) / 2); /* deactivate the sensors */ digitalWrite(OUTPUT_SENSOR, LOW); + return triggerMoistStart; } //Homie.getMqttClient().disconnect(); @@ -523,7 +616,7 @@ int determineNextPump() //this pump is in cooldown skip it and disable low power mode trigger for it if (plant.isInCooldown(sinceLastActivation)) { - Serial.printf("%d Skipping due to cooldown %ld \r\n", i, sinceLastActivation); + Serial.printf("%d Skipping due to cooldown %ld / %ld \r\n", i, sinceLastActivation, plant.getCooldownInSeconds()); setMoistureTrigger(i, DEACTIVATED_PLANT); continue; } @@ -533,7 +626,10 @@ int determineNextPump() Serial.printf("%d No pump required: due to light\r\n", i); continue; } - + if(plant.getCurrentMoisture() == MISSING_SENSOR && plant.isPumpTriggerActive()){ + Serial.printf("%d No pump possible: missing sensor \r\n", i); + continue; + } if (plant.isPumpRequired()) { Serial.printf("%d Requested pumping\r\n", i); @@ -541,11 +637,11 @@ int determineNextPump() } else if (plant.isPumpTriggerActive()) { - Serial.printf("%d No pump required: disabled trigger %f / %ld\r\n", i, plant.getCurrentMoisture(), plant.getSettingsMoisture()); + Serial.printf("%d No pump required: moisture acceptable %f / %ld\r\n", i, plant.getCurrentMoisture(), plant.getSettingsMoisture()); } else { - Serial.printf("%d No pump required: disabled trigger\r\n", i); + Serial.printf("%d No pump required: disabled pump trigger \r\n", i); } } return pumpToUse; @@ -588,6 +684,7 @@ void systemInit() // Set default values //in seconds + maxTimeBetweenMQTTUpdates.setDefaultValue(120); deepSleepTime.setDefaultValue(60); deepSleepNightTime.setDefaultValue(600); wateringDeepSleep.setDefaultValue(5); @@ -646,9 +743,13 @@ bool mode1() Serial.println("==== Mode 1 ===="); Serial << getCurrentTime() << " curtime" << endl; - readSensors(); + bool deltaTrigger = readSensors(); //queue sensor values for + if(deltaTrigger){ + Serial.println("1 delta triggered, going to mode2"); + return true; + } if (rtcDeepSleepTime == 0) { Serial.println("1 missing rtc value, going to mode2"); @@ -666,9 +767,14 @@ bool mode1() { continue; } - if (mPlants[i].getSensorValue() <= trigger) + long raw = mPlants[i].getCurrentMoisture(); + if (raw == MISSING_SENSOR) { - Serial << "plant dry starting mode 2" << i << endl; + continue; + } + if (raw > trigger) + { + Serial << "plant " << i << " dry " << raw << " / " << trigger << " starting mode 2" << endl; return true; } } From 39041ab091e7618fd3f0eed9ed7dd926d58bb080 Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 17:51:22 +0100 Subject: [PATCH 19/31] Moved ESP32 information into its subdirectory --- README.md | 15 --------------- esp32/Readme.md | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 33fe943..df8365d 100644 --- a/README.md +++ b/README.md @@ -1,16 +1 @@ # PlantCtrl -## Documentation of Power-Modes -https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/#esp32-deep-sleep - - -gpio 17 only out no hold -gpio 16 only out no hold - - -solar charger 2A? -https://www.aliexpress.com/item/4000238259949.html?spm=a2g0o.productlist.0.0.7e50231cCWGu0Z&algo_pvid=9ab7b0d3-5026-438b-972b-1d4a81d4dc56&algo_expid=9ab7b0d3-5026-438b-972b-1d4a81d4dc56-11&btsid=0b0a0ac215999246489888249e72a9&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_ - -MT3608 boost für pumpe -https://www.aliexpress.com/item/32925951391.html?spm=a2g0o.productlist.0.0.39e21087nAzH9q&algo_pvid=7db0a849-62f7-4403-88e3-615ee4d99339&algo_expid=7db0a849-62f7-4403-88e3-615ee4d99339-0&btsid=0b0a0ac215999252934777876e7253&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_ - -DS18B20 one wire temp sensor diff --git a/esp32/Readme.md b/esp32/Readme.md index 81d0013..15704a8 100644 --- a/esp32/Readme.md +++ b/esp32/Readme.md @@ -20,6 +20,23 @@ Uses ESP32MiniKit * Temperature * Custom GPIO +## Documentation of Power-Modes +https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/#esp32-deep-sleep + + +gpio 17 only out no hold +gpio 16 only out no hold + +## Additional hardware +solar charger 2A? +https://www.aliexpress.com/item/4000238259949.html?spm=a2g0o.productlist.0.0.7e50231cCWGu0Z&algo_pvid=9ab7b0d3-5026-438b-972b-1d4a81d4dc56&algo_expid=9ab7b0d3-5026-438b-972b-1d4a81d4dc56-11&btsid=0b0a0ac215999246489888249e72a9&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_ + +MT3608 boost für pumpe +https://www.aliexpress.com/item/32925951391.html?spm=a2g0o.productlist.0.0.39e21087nAzH9q&algo_pvid=7db0a849-62f7-4403-88e3-615ee4d99339&algo_expid=7db0a849-62f7-4403-88e3-615ee4d99339-0&btsid=0b0a0ac215999252934777876e7253&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_ + +DS18B20 one wire temp sensor + + # Features ## Empires Wunschliste * Pflanze From 9523857c0ec0fb4555101199af9d22e165e079a0 Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 17:59:52 +0100 Subject: [PATCH 20/31] Desciption for hardware added --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index df8365d..4bff4ad 100644 --- a/README.md +++ b/README.md @@ -1 +1,25 @@ # PlantCtrl + +The following problems shall be solved with this project: +* Solar Powered +* Low Powered +* Plant monitoring +* Plant watering +* IoT + +# Hardware +Open hardware design (powered by KiCAD). +The complete PCB is stored in the ***board*** sub directory. + +There the following components are connected: +* ESP32 NodeMCU Module (the one of A-Z Delivery was used) +* Lipo +* 7 moist sensors +* 7 pump +* DC-DC convert (generating voltage from Lipo for pumps) +* DS18B20 temperature sensors +* water tank ultrasonic sensor (via HC_SR04) +* general purpose expansion pin + +# Software +The firmware for the controller is stored in ***esp32*** sub directory. From 2958976f0a340eb241e7b59d675a0ffcf3fec44e Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 18:52:38 +0100 Subject: [PATCH 21/31] Some comments --- esp32/include/ControllerConfiguration.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/esp32/include/ControllerConfiguration.h b/esp32/include/ControllerConfiguration.h index 86eac83..2175950 100644 --- a/esp32/include/ControllerConfiguration.h +++ b/esp32/include/ControllerConfiguration.h @@ -54,18 +54,18 @@ #define SOLAR_CHARGE_MIN_VOLTAGE 7 #define SOLAR_CHARGE_MAX_VOLTAGE 9 -#define HC_SR04 /**< Ultrasonic distance sensor to measure water level */ -#define SENSOR_SR04_ECHO 17 /**< GPIO 17 - Echo */ -#define SENSOR_SR04_TRIG 23 /**< GPIO 23 - Trigger */ +#define HC_SR04 /**< Ultrasonic distance sensor to measure water level */ +#define SENSOR_SR04_ECHO 17 /**< GPIO 17 - Echo */ +#define SENSOR_SR04_TRIG 23 /**< GPIO 23 - Trigger */ #define MAX_CONFIG_SETTING_ITEMS 50 /**< Parameter, that can be configured in Homie */ #define PANIK_MODE_DEEPSLEEP (60 * 60 * 5U) /**< 5 hours in usecond */ #define PANIK_MODE_DEEPSLEEP_US (PANIK_MODE_DEEPSLEEP * 1000 * 1000) -#define TEMPERATURE_DELTA_TRIGGER_IN_C 1 -#define MOIST_DELTA_TRIGGER_ADC 10 -#define SOLAR_DELTA_VOLT_ADC 3 -#define LIPO_DELTA_VOLT_ADC 0.2 +#define TEMPERATURE_DELTA_TRIGGER_IN_C 1 +#define MOIST_DELTA_TRIGGER_ADC 10 +#define SOLAR_DELTA_VOLT_ADC 3 +#define LIPO_DELTA_VOLT_ADC 0.2 /**< trigger for lipo voltage */ #endif From 3fbf3bdb84e8fda9f1c2062683299bed5d2d98e7 Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 19:15:43 +0100 Subject: [PATCH 22/31] Struct used for RTC memory --- esp32/src/main.cpp | 220 +++++++-------------------------------------- 1 file changed, 34 insertions(+), 186 deletions(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index ce27091..0446b38 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -27,33 +27,24 @@ const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minut #define TEMP_MAX_VALUE 85.0f #define HalfHour 60 +typedef struct { + long lastActive; + long moistTrigger; + long moisture; + +} rtc_plant_t; + + +RTC_DATA_ATTR rtc_plant_t rtcPlant[7]; + /********************* non volatile enable after deepsleep *******************************/ -RTC_DATA_ATTR long gotoMode2AfterThisTimestamp = 0; -RTC_DATA_ATTR long rtcDeepSleepTime = 0; /**< Time, when the microcontroller shall be up again */ -RTC_DATA_ATTR long rtcLastActive0 = 0; -RTC_DATA_ATTR long rtcMoistureTrigger0 = 0; /**= 0) && (plantId < MAX_PLANTS)) { - rtcMoistureTrigger0 = value; - } - if (plantId == 1) - { - rtcMoistureTrigger1 = value; - } - if (plantId == 2) - { - rtcMoistureTrigger2 = value; - } - if (plantId == 3) - { - rtcMoistureTrigger3 = value; - } - if (plantId == 4) - { - rtcMoistureTrigger4 = value; - } - if (plantId == 5) - { - rtcMoistureTrigger5 = value; - } - if (plantId == 6) - { - rtcMoistureTrigger6 = value; + rtcPlant[plantId].moistTrigger = value; } } void setLastMoisture(int plantId, long value) { - if (plantId == 0) + if ((plantId >= 0) && (plantId < MAX_PLANTS)) { - rtcMoisture0 = value; - } - if (plantId == 1) - { - rtcMoisture1 = value; - } - if (plantId == 2) - { - rtcMoisture2 = value; - } - if (plantId == 3) - { - rtcMoisture3 = value; - } - if (plantId == 4) - { - rtcMoisture4 = value; - } - if (plantId == 5) - { - rtcMoisture5 = value; - } - if (plantId == 6) - { - rtcMoisture6 = value; + rtcPlant[plantId].moisture = value; } } long getLastMoisture(int plantId) { - if (plantId == 0) + if ((plantId >= 0) && (plantId < MAX_PLANTS)) { - return rtcMoisture0; + return rtcPlant[plantId].moisture; + } else { + return -1; } - if (plantId == 1) - { - return rtcMoisture1; - } - if (plantId == 2) - { - return rtcMoisture2; - } - if (plantId == 3) - { - return rtcMoisture3; - } - if (plantId == 4) - { - return rtcMoisture4; - } - if (plantId == 5) - { - return rtcMoisture5; - } - if (plantId == 6) - { - return rtcMoisture6; - } - return -1; } void readSystemSensors() @@ -383,100 +301,30 @@ void mode2MQTT() long getMoistureTrigger(int plantId) { - if (plantId == 0) + if ((plantId >= 0) && (plantId < MAX_PLANTS)) { - return rtcMoistureTrigger0; + return rtcPlant[plantId].moistTrigger; + } else { + return -1; } - if (plantId == 1) - { - return rtcMoistureTrigger1; - } - if (plantId == 2) - { - return rtcMoistureTrigger2; - } - if (plantId == 3) - { - return rtcMoistureTrigger3; - } - if (plantId == 4) - { - return rtcMoistureTrigger4; - } - if (plantId == 5) - { - return rtcMoistureTrigger5; - } - if (plantId == 6) - { - return rtcMoistureTrigger6; - } - return -1; } void setLastActivationForPump(int plantId, long value) { - if (plantId == 0) + if ((plantId >= 0) && (plantId < MAX_PLANTS)) { - rtcLastActive0 = value; - } - if (plantId == 1) - { - rtcLastActive1 = value; - } - if (plantId == 2) - { - rtcLastActive2 = value; - } - if (plantId == 3) - { - rtcLastActive3 = value; - } - if (plantId == 4) - { - rtcLastActive4 = value; - } - if (plantId == 5) - { - rtcLastActive5 = value; - } - if (plantId == 6) - { - rtcLastActive6 = value; + rtcPlant[plantId].lastActive = value; } } long getLastActivationForPump(int plantId) { - if (plantId == 0) + if ((plantId >= 0) && (plantId < MAX_PLANTS)) { - return rtcLastActive0; + return rtcPlant[plantId].lastActive; + } else { + return -1; } - if (plantId == 1) - { - return rtcLastActive1; - } - if (plantId == 2) - { - return rtcLastActive2; - } - if (plantId == 3) - { - return rtcLastActive3; - } - if (plantId == 4) - { - return rtcLastActive4; - } - if (plantId == 5) - { - return rtcLastActive5; - } - if (plantId == 6) - { - return rtcLastActive6; - } - return -1; } /** From 2d739256365985d913e96522b387efdfdc16451a Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 19:18:28 +0100 Subject: [PATCH 23/31] Added comments for the RTC struct --- esp32/src/main.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 0446b38..3c1e85a 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -28,17 +28,15 @@ const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minut #define HalfHour 60 typedef struct { - long lastActive; - long moistTrigger; - long moisture; + long lastActive; /**< Timestamp, a pump was activated */ + long moistTrigger; /**< Trigger value of the moist sensor */ + long moisture; /**< last measured moist value */ } rtc_plant_t; -RTC_DATA_ATTR rtc_plant_t rtcPlant[7]; - /********************* non volatile enable after deepsleep *******************************/ - +RTC_DATA_ATTR rtc_plant_t rtcPlant[7]; RTC_DATA_ATTR long gotoMode2AfterThisTimestamp = 0; RTC_DATA_ATTR long rtcDeepSleepTime = 0; /**< Time, when the microcontroller shall be up again */ RTC_DATA_ATTR int lastPumpRunning = 0; From 4303e248ff33953d3852af5de2d459932cd09342 Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 19:48:39 +0100 Subject: [PATCH 24/31] Upload script --- esp32/host/Readme.md | 7 ++++++- esp32/host/upload-via-mqtt.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100755 esp32/host/upload-via-mqtt.sh diff --git a/esp32/host/Readme.md b/esp32/host/Readme.md index 7da8132..d48a30f 100644 --- a/esp32/host/Readme.md +++ b/esp32/host/Readme.md @@ -12,7 +12,6 @@ For further details have a look at the Readme.md one level above. # Remote Upload - This script will allow you to send an OTA update to your device. ## Installation @@ -22,6 +21,12 @@ Requirements are: ## Usage +See ***upload-via-mqtt.sh*** + +# Remote Upload - Backend + +## Usage + ```text usage: ota_updater.py [-h] -l BROKER_HOST -p BROKER_PORT [-u BROKER_USERNAME] [-d BROKER_PASSWORD] [-t BASE_TOPIC] -i DEVICE_ID diff --git a/esp32/host/upload-via-mqtt.sh b/esp32/host/upload-via-mqtt.sh new file mode 100755 index 0000000..500ce40 --- /dev/null +++ b/esp32/host/upload-via-mqtt.sh @@ -0,0 +1,27 @@ +#!//bin/bash + +if [ $# -ne 3 ]; then + echo "Homie prefex and device index must be specified:" + echo "$0 " + echo "e.g." + echo "$0 192.168.0.2 test/ MyDeviceId" + exit 1 +fi + +mqttHost=$1 +mqttPrefix=$2 +homieId=$3 +firmwareFile=../.pio/build/esp32doit-devkit-v1/firmware.bin + +if [ ! -f $firmwareFile ]; then + echo "the script $0 must be started in host/ sub directory" + exit 2 +fi + +mosquitto_pub -h $mqttHost -t "${mqttPrefix}${homieId}/stay/alive/set" -m "1" -r +echo "Waiting ..." +mosquitto_sub -h $mqttHost -t "${mqttPrefix}${homieId}/#" -R -C 1 +python ota_updater.py -l $mqttHost -t "$mqttPrefix" -i "$homieId" $firmwareFile + +mosquitto_pub -h $mqttHost -t "${mqttPrefix}${homieId}/stay/alive/set" -m "0" -r +exit 0 From 9c83897fd9226922d0dad2db7e14a7854c0e7d9b Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 21:00:11 +0100 Subject: [PATCH 25/31] Wakeup due to change temperature --- esp32/include/ControllerConfiguration.h | 2 +- esp32/src/main.cpp | 87 ++++++++++++++++--------- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/esp32/include/ControllerConfiguration.h b/esp32/include/ControllerConfiguration.h index 2175950..9a861d4 100644 --- a/esp32/include/ControllerConfiguration.h +++ b/esp32/include/ControllerConfiguration.h @@ -63,7 +63,7 @@ #define PANIK_MODE_DEEPSLEEP (60 * 60 * 5U) /**< 5 hours in usecond */ #define PANIK_MODE_DEEPSLEEP_US (PANIK_MODE_DEEPSLEEP * 1000 * 1000) -#define TEMPERATURE_DELTA_TRIGGER_IN_C 1 +#define TEMPERATURE_DELTA_TRIGGER_IN_C 1.0f #define MOIST_DELTA_TRIGGER_ADC 10 #define SOLAR_DELTA_VOLT_ADC 3 #define LIPO_DELTA_VOLT_ADC 0.2 /**< trigger for lipo voltage */ diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 3c1e85a..d3d2f79 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -17,6 +17,7 @@ #include "esp_sleep.h" #include "RunningMedian.h" #include +#include const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minutes */ @@ -27,22 +28,24 @@ const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minut #define TEMP_MAX_VALUE 85.0f #define HalfHour 60 -typedef struct { - long lastActive; /**< Timestamp, a pump was activated */ - long moistTrigger; /**< Trigger value of the moist sensor */ - long moisture; /**< last measured moist value */ +typedef struct +{ + long lastActive; /**< Timestamp, a pump was activated */ + long moistTrigger; /**< Trigger value of the moist sensor */ + long moisture; /**< last measured moist value */ } rtc_plant_t; - /********************* non volatile enable after deepsleep *******************************/ RTC_DATA_ATTR rtc_plant_t rtcPlant[7]; -RTC_DATA_ATTR long gotoMode2AfterThisTimestamp = 0; -RTC_DATA_ATTR long rtcDeepSleepTime = 0; /**< Time, when the microcontroller shall be up again */ -RTC_DATA_ATTR int lastPumpRunning = 0; -RTC_DATA_ATTR long lastWaterValue = 0; -RTC_DATA_ATTR int gBootCount = 0; -RTC_DATA_ATTR int gCurrentPlant = 0; /**< Value Range: 1 ... 7 (0: no plant needs water) */ +RTC_DATA_ATTR long gotoMode2AfterThisTimestamp = 0; +RTC_DATA_ATTR long rtcDeepSleepTime = 0; /**< Time, when the microcontroller shall be up again */ +RTC_DATA_ATTR int lastPumpRunning = 0; +RTC_DATA_ATTR long lastWaterValue = 0; +RTC_DATA_ATTR float rtcLastTemp1 = 0.0f; +RTC_DATA_ATTR float rtcLastTemp2 = 0.0f; +RTC_DATA_ATTR int gBootCount = 0; +RTC_DATA_ATTR int gCurrentPlant = 0; /**< Value Range: 1 ... 7 (0: no plant needs water) */ bool warmBoot = true; bool volatile mode3Active = false; /**< Controller must not sleep */ @@ -54,7 +57,6 @@ int mWaterGone = -1; /**< Amount of centimeter, where no water is seen */ int readCounter = 0; bool mConfigured = false; - RunningMedian lipoRawSensor = RunningMedian(5); RunningMedian solarRawSensor = RunningMedian(5); RunningMedian waterRawSensor = RunningMedian(5); @@ -103,7 +105,9 @@ long getLastMoisture(int plantId) if ((plantId >= 0) && (plantId < MAX_PLANTS)) { return rtcPlant[plantId].moisture; - } else { + } + else + { return -1; } } @@ -302,7 +306,9 @@ long getMoistureTrigger(int plantId) if ((plantId >= 0) && (plantId < MAX_PLANTS)) { return rtcPlant[plantId].moistTrigger; - } else { + } + else + { return -1; } } @@ -320,7 +326,9 @@ long getLastActivationForPump(int plantId) if ((plantId >= 0) && (plantId < MAX_PLANTS)) { return rtcPlant[plantId].lastActive; - } else { + } + else + { return -1; } } @@ -331,6 +339,9 @@ long getLastActivationForPump(int plantId) */ bool readSensors() { + float temp[2] = {TEMP_MAX_VALUE, TEMP_MAX_VALUE}; + float *pFloat = temp; + bool leaveMode1 = false; Serial << "Read Sensors" << endl; readSystemSensors(); @@ -349,7 +360,6 @@ bool readSensors() } delay(10); } - bool triggerMoistStart = false; for (int i = 0; i < MAX_PLANTS; i++) { long current = mPlants[i].getCurrentMoisture(); @@ -358,7 +368,7 @@ bool readSensors() setLastMoisture(i, current); if (tmp) { - triggerMoistStart = true; + leaveMode1 = true; Serial.printf("Mode2 start due to moist delta in plant %d with %ld \r\n", i, delta); } } @@ -369,22 +379,35 @@ bool readSensors() delay(200); /* Required to read the temperature once */ - float temp[2] = {TEMP_MAX_VALUE, TEMP_MAX_VALUE}; - float *pFloat = temp; - int sensors = dallas.readAllTemperatures(pFloat, 2); - if (sensors > 0) + for (int i = 0; i < 5; i++) { - Serial << "t1: " << String(temp[0]) << endl; - temp1.add(temp[0]); + int sensors = dallas.readAllTemperatures(pFloat, 2); + if (sensors > 0) + { + Serial << "t1: " << String(temp[0]) << endl; + temp1.add(temp[0]); + } + if (sensors > 1) + { + Serial << "t2: " << String(temp[1]) << endl; + temp2.add(temp[1]); + } + delay(50); } - if (sensors > 1) - { - Serial << "t2: " << String(temp[1]) << endl; - temp2.add(temp[1]); + + if ((temp1.getAverage() - rtcLastTemp1 > TEMPERATURE_DELTA_TRIGGER_IN_C) || + (rtcLastTemp1 - temp1.getAverage() > TEMPERATURE_DELTA_TRIGGER_IN_C)) { + leaveMode1 = true; } + if ((temp2.getAverage() - rtcLastTemp2 > TEMPERATURE_DELTA_TRIGGER_IN_C) || + (rtcLastTemp2 - temp2.getAverage() > TEMPERATURE_DELTA_TRIGGER_IN_C)) { + leaveMode1 = true; + } + + rtcLastTemp1 = temp1.getAverage(); + rtcLastTemp2 = temp2.getAverage(); /* Use the Ultrasonic sensor to measure waterLevel */ - digitalWrite(SENSOR_SR04_TRIG, LOW); delayMicroseconds(2); digitalWrite(SENSOR_SR04_TRIG, HIGH); @@ -394,7 +417,7 @@ bool readSensors() waterRawSensor.add((duration * .343) / 2); /* deactivate the sensors */ digitalWrite(OUTPUT_SENSOR, LOW); - return triggerMoistStart; + return leaveMode1; } //Homie.getMqttClient().disconnect(); @@ -472,7 +495,8 @@ int determineNextPump() Serial.printf("%d No pump required: due to light\r\n", i); continue; } - if(plant.getCurrentMoisture() == MISSING_SENSOR && plant.isPumpTriggerActive()){ + if (plant.getCurrentMoisture() == MISSING_SENSOR && plant.isPumpTriggerActive()) + { Serial.printf("%d No pump possible: missing sensor \r\n", i); continue; } @@ -592,7 +616,8 @@ bool mode1() bool deltaTrigger = readSensors(); //queue sensor values for - if(deltaTrigger){ + if (deltaTrigger) + { Serial.println("1 delta triggered, going to mode2"); return true; } From 7080fe306b255369c54a9dc9427812a9bc1544a4 Mon Sep 17 00:00:00 2001 From: Ollo Date: Fri, 6 Nov 2020 22:19:16 +0100 Subject: [PATCH 26/31] Doxygen added --- esp32/Doxyfile | 2522 +++++++++++++++++++++++ esp32/include/ControllerConfiguration.h | 20 +- esp32/include/HomieConfiguration.h | 62 +- esp32/src/main.cpp | 7 +- 4 files changed, 2585 insertions(+), 26 deletions(-) create mode 100644 esp32/Doxyfile diff --git a/esp32/Doxyfile b/esp32/Doxyfile new file mode 100644 index 0000000..c7774a7 --- /dev/null +++ b/esp32/Doxyfile @@ -0,0 +1,2522 @@ +# Doxyfile 1.8.17 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "PlantCtrl" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 1.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = NO + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = NO + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is +# Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# (including Cygwin) ands Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = src/ \ + include/ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: https://www.gnu.org/software/libiconv/) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen +# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.h \ + *.cpp + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files +# were built. This is equivalent to specifying the "-p" option to a clang tool, +# such as clang-check. These options will then be passed to the parser. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: https://developer.apple.com/xcode/), introduced with OSX +# 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 1 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /