From a75f8b6dfdb22e32e4687742ca5fe41b4c74421c Mon Sep 17 00:00:00 2001 From: opendous Date: Mon, 31 Oct 2011 07:47:15 +0000 Subject: [PATCH] Arduino1 Diskloader bootloader now works with the AT90USB1287 USB AVR. Begin porting other Arduino1 files to the AT90USB1287. --- .../Micropendous_Bootloader_Programming.jpg | Bin 0 -> 77481 bytes ...ropendous_Bootloader_Programming_Linux.jpg | Bin 0 -> 108885 bytes ...pendous_Bootloader_Programming_Windows.jpg | Bin 0 -> 141170 bytes Micropendous/Firmware/Arduino1/boards.txt | 453 ++++++++++++ .../Firmware/Arduino1/cores/arduino/Arduino.h | 214 ++++++ .../Firmware/Arduino1/cores/arduino/CDC.cpp | 175 +++++ .../Firmware/Arduino1/cores/arduino/Client.h | 26 + .../Firmware/Arduino1/cores/arduino/HID.cpp | 446 ++++++++++++ .../Arduino1/cores/arduino/HardwareSerial.cpp | 424 +++++++++++ .../Arduino1/cores/arduino/HardwareSerial.h | 80 +++ .../Arduino1/cores/arduino/IPAddress.cpp | 56 ++ .../Arduino1/cores/arduino/IPAddress.h | 76 ++ .../Arduino1/cores/arduino/Platform.h | 23 + .../Firmware/Arduino1/cores/arduino/Print.cpp | 263 +++++++ .../Firmware/Arduino1/cores/arduino/Print.h | 78 +++ .../Arduino1/cores/arduino/Printable.h | 40 ++ .../Firmware/Arduino1/cores/arduino/Server.h | 9 + .../Arduino1/cores/arduino/Stream.cpp | 243 +++++++ .../Firmware/Arduino1/cores/arduino/Stream.h | 94 +++ .../Firmware/Arduino1/cores/arduino/Tone.cpp | 601 ++++++++++++++++ .../Firmware/Arduino1/cores/arduino/USBAPI.h | 166 +++++ .../Arduino1/cores/arduino/USBCore.cpp | 660 ++++++++++++++++++ .../Firmware/Arduino1/cores/arduino/USBCore.h | 303 ++++++++ .../Firmware/Arduino1/cores/arduino/USBDesc.h | 67 ++ .../Firmware/Arduino1/cores/arduino/Udp.h | 88 +++ .../Arduino1/cores/arduino/WCharacter.h | 168 +++++ .../Arduino1/cores/arduino/WInterrupts.c | 248 +++++++ .../Firmware/Arduino1/cores/arduino/WMath.cpp | 60 ++ .../Arduino1/cores/arduino/WString.cpp | 645 +++++++++++++++++ .../Firmware/Arduino1/cores/arduino/WString.h | 205 ++++++ .../Firmware/Arduino1/cores/arduino/binary.h | 515 ++++++++++++++ .../Firmware/Arduino1/cores/arduino/main.cpp | 20 + .../Firmware/Arduino1/cores/arduino/new.cpp | 18 + .../Firmware/Arduino1/cores/arduino/new.h | 22 + .../Firmware/Arduino1/cores/arduino/wiring.c | 297 ++++++++ .../Arduino1/cores/arduino/wiring_analog.c | 270 +++++++ .../Arduino1/cores/arduino/wiring_digital.c | 166 +++++ .../Arduino1/cores/arduino/wiring_private.h | 67 ++ .../Arduino1/cores/arduino/wiring_pulse.c | 69 ++ .../Arduino1/cores/arduino/wiring_shift.c | 55 ++ .../variants/micropendous/pins_arduino.h | 276 ++++++++ .../DiskLoader_Micropendous_Rev2_Working.hex | 143 ++++ .../Arduino1_Bootloader/src/DiskLoader.cpp | 13 + .../Arduino1_Bootloader/src/USBCore.cpp | 28 +- Micropendous/libs/Arduino1/boards.txt | 453 ++++++++++++ 45 files changed, 8320 insertions(+), 3 deletions(-) create mode 100644 Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming.jpg create mode 100644 Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming_Linux.jpg create mode 100644 Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming_Windows.jpg create mode 100644 Micropendous/Firmware/Arduino1/boards.txt create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Arduino.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/CDC.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Client.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/HID.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Platform.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Print.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Print.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Printable.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Server.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Stream.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Stream.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Tone.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/USBAPI.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/USBCore.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/USBCore.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/USBDesc.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/Udp.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/WCharacter.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/WInterrupts.c create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/WMath.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/WString.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/WString.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/binary.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/main.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/new.cpp create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/new.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/wiring.c create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/wiring_analog.c create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/wiring_digital.c create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/wiring_private.h create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/wiring_pulse.c create mode 100644 Micropendous/Firmware/Arduino1/cores/arduino/wiring_shift.c create mode 100644 Micropendous/Firmware/Arduino1/variants/micropendous/pins_arduino.h create mode 100644 Micropendous/Firmware/Arduino1_Bootloader/DiskLoader_Micropendous_Rev2_Working.hex create mode 100644 Micropendous/libs/Arduino1/boards.txt diff --git a/Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming.jpg b/Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0b5b32e43156394edb2cec0acfc42d6e55f1293 GIT binary patch literal 77481 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 SQ$8XE3AO*nxET81!v6wW%?g(Q literal 0 HcmV?d00001 diff --git a/Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming_Linux.jpg b/Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming_Linux.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a7422784269377a8e86bd54630925d67beee685 GIT binary patch literal 108885 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�!}cHNgMMM0!V7X+lEAiYU1p@*IT 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 literal 0 HcmV?d00001 diff --git a/Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming_Windows.jpg b/Micropendous/Design/Micropendous/Micropendous_Bootloader_Programming_Windows.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8a0f595a6db2830e90301c5033fc75d0ef7c4c9 GIT binary patch literal 141170 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 z

N{#A>$a)y^l}**J<{)7>e*)@U z@grW|9`qumRJaUiBQyR=e7q?K*Wrude^(sXz1mQ0`b2?&8p%>*pR2`e9dq8`ynaMD zfHAw^6&I@pw#;VS1)4`DSA$(|l?p}dZ+f+9N-a?T9Q2%{jP>@GmSfT904F~VciE7r z!N#fu+e$vxhV+%geB;uI;VirqNht0zc)}fVTw# z%^l{|a}gK!+?Q!g$Un#CB%oH9?R$O_rQZ)eXJJsVKZoO>GuL*HXaRfED(e=t{1nu=@0$#5=$beLSJ z7eSx&vp;O|Y%V)VJO6aC;wOBB{Pgqhqk&eBixx4?g8p%Tu*FdD)XhIZ@E} zhGTu0v6w_+OPkM>a)3Qfaa`muApL03OEX%&!sD&jsW)cNh*W*~MWiN7L-z-XJr~!^ z%9@4x2|QiDosJjIr>Z+i?;!pj;BiQb-m@_3w%Sb+!|Y875C=d5V>~-gFCw+M#=Std9=}K3srBX=OjL)%ou1zK^}xDb}q*_`GgLS zJ4qBso7J;CE3_FjGLb?gl2BfXIK-s{RY!l;G63tb24@u{`pn*f*bRuECVBE|m}5Y8 zN*R<*)yab438KLnx(NY2rt!)JO6H`N$!bNdghZ>Wucx(pz;sJ#rzKv`BWHp>#}b2f zw0|1OMb;ACH+c74ws36wQ$tzJ&oCy#pt1r)o0XM_{Tu%P^@nph_aHQFr>rR8PK=TQoVJCyH6f)_|vA6&&`qH>Jv` z5p=i^0{ApSqFi=IPS--IktS-qONNuVDLfg|HKk--A(YD}pJFCp9J*4%xTd&ezR^N4 zn`gMY3@JBUx?A^vaN=o0k1+^;Us~4Sn3ldDnU?GfY9OIY#{gbZzvkCg) zXccbWE;d2u8@LMX??q}64u;%@8HJxL)}V5Xqkc1(5YL@94^O)Cm%)$KN|O4Va<>6yPAOcSOuT(y;q+VojJ{pv^Y*O^DT ztAC#nHyP)aDAW$P*Z$dAkV7YY5e(MorK{4vc8ca5h~=zx8^7Zu<1J2yjr)r1@KLhV zTbkA9;Rky)*bpjqN{+xyHiy>bI0eSeeTpNo(uV;#S#--)bf|K!`sPV~J%;6hH3xZT zC^6`s7Utn&O?aqu`S5)FbW9R`4)a9Htbt5eN&+<5uai{nh-N1=V8p)fdcF{bt`WxY z@(z=+;|7rzd8dZV8~KG7%a*=IGwG|@uG4u5I0Hq;&h&)Tv07t_&Tz%he@@`+0$;vGN;J&;)itN?xQPZ@5YSriYEHuof8Mjo6t5DrD z`nezOIYDx+P2it)Quh~PeOjjO^~K%%c;r|E&ZH{PEdHkAYv!nRvu>o{eS#v6hKf$H zlPp$AyK%#Pj(W?n_E{x;44;yna(=^mt@^TdEo51j{AU2ASkJ=}Hb&EiLXA335Krf_ zsFQ(85diWUCCu^V-WIz}VtryPDGE5UnP2hEoC^}ofx#5WGZ(*RHb?UE#S!A)U!sxY zXFL36b^cFI4cMm`q z{iLlC5Ajo4pm%X83B#-1upF&@K9G<@MHZ$ZcH6Y($QH%29eB4z;4g= zUA&g&*fE-C3kF>w%Y;RU>ZiGXCO^%7vL-(@f;m!p*)Xc{Jn`ncBtGhOk?FZAYc<<1W!wVt zwYI$6=ZC<^>eC2O3*GQDLngY`H+Ej0Ydm!(Gal_)DLFALb8)bKb(EqGX67&*tt1$Q zf(i~-yh+cFdScp3pw^KP_~=HQS7*lDWut^irPLq%=Y359R z#PR4=r${WQCvOaN7*)0kOl84p)3kHH+tf0Psn_Itgl~kBx|ylFvc#C6tDF~!TCQ6` zJaB#H;HFnp4NQi`k`zq34+&*|15clSYW}XIsxhMBy1x4j6r}9%l>sKUYKY$YA!{Ve3;b+>vmn&vf4G-MGe72}GKqt5PGTQ6CGhi2a` zl5LXryNRwEy9JoxGnF2>0;TH2H?L}_7ZB(Co`HcRlFA5F+@&Bp-Z?%a4$hd3QCO~1 zs8o1%ajh=wJn+vsa;IAyN#)oxJQmL@{d+x|BWp~TV!y=rC&TusHn_F7JEV;%^x_9a z4r4QL55U95VY1;jJi|}DjTL+Lk4M&$P(5Q+bM0I_t`eD}m8Sa(ks1mF41@XK z-_SU2LQ;lFv$xvKi}8~0rX$91-tHdQkB*pNV}x@OF^88=E~4Dr5mIhk$|PUa?nAv> z6;gV}{-=>z=#^;TToqN&r}*C``Klk3zAh&$H2ZE(Y&S&>ira%`;GbAC-7csDq-AxSdpKs|E)nN@(dhL5z8KkhUIN? z;HutXMxX-5h0_wSW)gQNvR6fk`$Ad5x}A(cfqTcUw$z0&HR@4!!HCbH(RIfPq&2rq z?h=5rWreMtD~v7bQ5BNr6dWzN3@@_n-m=blGmldmC|vWvnLfUHPPP0MXXX7rb9+LS z%pfhD|I$O(y+BMg728;uFI1)SS8Nf4nZ4CETr&{aBn7g7D)J%?&mx6=7 z`lgZC)(ig7Xx>)6)Hnbl+9pOUNmkY zLu+p^+z#TPShT}u@FCSNa=PmJUaqn?vVrg0u|10Jc@?FA3OrD#Q!|Q`au<5rP!A3f zYDa~OCZG9|qrJ-H30B?4;s#7VWOJ0ukW)3#$~-P=s?J+b%k`|QU!)#1_6B>omO5pl zY)j5@UT$~{tN6L80{Lru#&aQ24l|4}rnOdLI8F-r-%gR#7P1tyongKMgzsvF24o&| zAs?Tf+{#IC=mtamEclO>Yg=G{e1N(lLc!itU^OY$$D?#2B6S^t?}>lr*m>LF!YK0G zBPR>5Ko zayKJ|%kkDFM<(qKDOF8q6zS!w(Fx58cy0W{_>rDPVur(s0Aih{sQzniZEo;@2n@L8 z23=}$Dafzn^cGW_e1i7RIFBfyr03z2$#c{BZ6>bV%G}^VkyH*5t#jd@%UzmW{Cfoq z=V%TxB16(Sb!)2KH7Id_V3e5A*<%4X507kTDs5i zj5dz7nJfyM^^MSu&oT&tjW7B9XFcCa9U7RDap9M5H8}~yJB9`zU2iy4`V7yNc~=n@ zF^<7Hd&Uh*Pz0&(s@fY;krJC23ST+MhQP5KUf9>VXsNlY2`_qrnE*%ge4~C7{RH=5R^I3z$H~jy$ z700$r-98J$2yy*f!2Y^De6Ilv{=jFG$p>Xe_n(<=*t=nrfD8)^KgOz0{FM%PW0RK= zI;OF7_G`7OO)%g0B(ccK#51$6gO5xc{RSFJ8tOh4zp+n`sa{sI#>%xUQa&UEBj7h( zC4V%z8$q=*J>8!;Nv3SwQRh;~sDYXn4lfNOP^Mx9$q4JAa@ZVX$cbWY`?7ka6?Dvi zv_ap{{cRqAV>(h!^OWhhVf%Mqn2A=@mMyI`e~0aTEp@2&kq)UVwez>NnzV{wen&E| z%VO2zo~O@0&#a6#GVAF7)}uhCwI3JTEL3?Tzy{V1a#_je%kMeP$GOx4ieUNf6jbqD z?oZwkVe&7LHfDDXsp{&2@9DENzh>FUyIRjoIsA-VMyP ztp(IxSGve_54{@{`2_km&c-9ToMqh3K9n6dQ;k(aIhT{46n*aRLs}Gh@y8_Tzv7XK zD7SI!ZbOi7W-bs-V*>P%;~KESXW#k*Yo zcEWwZB?0SQKTjTGzWgjhCUgJ+LjXm|1&Zr@YUj*Rkb_KCW^gv>m*R+N*=_ygnHQ-- zf=%O5I|VDdb4~HjkPP>Zmps((cmuhy59^tMI=nz4rDE>yripTp;fiqG2g;F7z5{uL z$eJpPG=e>ary>X-Zh;1KHlT{-8a^3OkUya}X>lZ3_V>aa=WSh4?0kLnk@4sbGClI@ zdf}9HtQ=RFki9G%`+Ph%LY0bA)kt@vPH((~VJ5%4&$x*>YZCEcB*-6BJ7O(eKf+l+ zTI~K!_SB+rYsd6lcde1THaOC#(rA37W>;^#2{W!^lopCU+gp( zF{93(VB^t}admfZdv*Ushbi;+BkUCe zPw{zWrwzpR;b)a9v$zu9%N7~Eo5{tI9kFgoaW0hA3EoL__34+3EuPe3th`ACk?9q9 z17C=zXXMpAoS1IZ%|FveH50z^G-I39^Zjf zMt%8xD514+QE|qjPU|;*$DvS=KJwSv!6Zr?>c%5??;XSp?6yM5|9i~y;q6RFbj~u1kX`p=tn1||b zf7J(39eR8#Tbu>i!Arlo)mhmZc9vWa)KC1YBIlgc&V$!>B!*ye6+Q|7s7-HV3lbAW zW8Mw3ahv~uqhWO#R0&VVP5HZ!W!HaCO#D?!(s`7RBdO$KI1+STA_>lSf&o;T=WtHf z_i-lsU!~rs#hJv zu!g+WkTEe~FQ-e{E)P z&;O6mFZ2Hh1JO!Ox9$s{YQSdx`SJQMWIdkWNsC+_5nY0@=`8QL!yu8Qw-f==yIl{y zJc-*a;a0Cmo1^SmM|uuazo}}KY5%46wmwJir}CHi>$CAteya8z5H?QqVnOHteOj@3 z*rSzm0tjr*A8jX6-K@VE3Sg)1;#z)h|2qbK+3kq4CMMF!hI=<+ z7DXxwJ+3H}VqEIM={lm0WIw7pV}^W1H4;%q7w5U>s3;Z3Ret|{uS)Gag>n1@+cjN+ zr@n(6T92q?zCjU0Abg`T(dVj!bF9kE<{Kb(m*-N|5W!cOpC+d~LWa_0G8b*4t8~^L zE+w;V{^O!_{{ClRd^)lXtfe$i?WE$k9ja{~s-$V>GH4m0mNM+V%*U-5vldC(A0E_d zjq{BD1iJBXE-r$`8Ol9c$k>Z-IJgg4`8zjcAo(qSWHdv;j1nWNF`If>GqPTYmRFqe zH@$#Y946#(mQ7E~D+HA~;qadxPTV#NK2;e^poOo4r{ zJ9b}~ERQMkr(a*EtVBYRq1UGg54&C`ZY5VDhoxO`AYWGXf`cjRlpvD8ef-GMQlB9jNfNc^lM#bg^l#s#8Nm zcWy>}((%7oZf1=TsqG(SmlIC5JfmIeT^%?RI+lI8Eu;g0u@h1pMR6N?oZfyiJNt^`Hi10e*R3s{Jp72X?RL?_qT1RX-C%h!^GkY`a7mHIywJ6TIP44{g; zpj1C>RI}rU$)#~(0(v5aMRwUI6JNIn;RrJ39jpR}IOWHC@}8;r*>Aor82(6d0rr)m zoZxM+D%c(T*g$BEltpsOEGG*H#0T)&yq*TkF)n7Hh^GYo7 ze#-vWJ;?6N+`SfN@R){-N1%0lS$ioIkp#2>_an-1_V24Yc8X%{D2NyrrSTwvWigQ+HP9K)jx$&hWBdYH;9kMU|b=Ci3eD(DZf_) zqbp1rfIKKiFfKg%Mmk(4nQvrL-)q)gbUb{TVrm3IJam`K7nsNWjCA|%vA-z!63Y}BPc)2WQ^ubwTfr>!-Zm$8aXryq}7 z-R{`^a0b<;vT~kXUpY@(^}ajP%Fi1m;#g}&oE*^dD5xFe-eMl)5q$dI)-b5Siv_qc zviPhY^8`|a8F-?R_piIH3-P7Q)zK`$#oiir1WEwWaLS=15%c#2q5;wF$w39?1mwy) zDOiHWqH0*>eGdIg@9H`FyXadV=-_Jmj?Y*N1an;0I;~cQ%FPr7y`uju?4K5x$vTOf z{l`4pzQ~{rNuiZr3NqRlx+C_cm)cOQzb}IASy@MUZuC^afE8k}-Chc|4 zEt@x~xR?zwf$Ll0a|A!4R*6L1C;{H8M&8Lru5`eYW$s^8s55n5_dkAo)|!>8=g9MF z5S`1CS`?mds4%G|go+blKIu<^P>PW`Lt$#Gpw|kJ3lbWeS`&T<^Jh8iFm18Ty z7MRS+FYif6Ik_wTYsTJTU+Qvi2ve;)pwEUptX8KSRcxxBxA80qIRlg`c9Wa#*!#k^OWV!Ne7aW=t`2co^&PV zs?iKY3p{iEE@~&!XDnXS(WtX3EdC~3Lj97NA6O1_k1NYx2FgMK?7-QxFm2yT?cexz zMG>`~1k8lb9oU6aJBDv_gP>@#hE@9`=U1g6j@zPu0LzXLr8IJRj7Fco=f%#69fK?)rqed`rl2-2i2vG_`Cn3$ z9C=2WTau+YRFLaPh$7A$k4HK?t$UFuAR9hGKt4%ol8q1UGO`ZnH= zYi}vBZTErmah&m7xvXN|16ec1%j)9vvmvyEz+mBobWR}b8(_ZRG;+T_r*?dC|Jq7u z5xb^qs}IwKmyyKK>teef@BffMI7hNA7+g6M(f_aSTF#dJ&b&+vt7fL!)8PfjBH1G4 z!>6SnYn$oUrLjOc5_Dq|=Jty1u8FcU{jhvQ#6-;jeSxZb7EXWDQghhtjyp4(l)}FX z1$aF8FyN->{W5jV?8leEeaZ66b>os=jzSJhM4_&+?m)DX90v;}Boec6;mC<5P{O>s z)$(@4QVH9@Bgyak4BM>ET%Bq2aCKaC0;t_Zj%SGewD?n6-}ApP_WLy|>A5 zbP|}zdgCZ$XQ>tIJVt7!=TI5Ru*ZB*xu}f;c%#9c0^9tA_cH-gpy6_-C!XkP=~pJE z3t5Ewnw#03u$Ib3w&m7KhSR-{^)s{!=-;_a&bms=8c(rKZ+D9WiM4w-t~)3 zhVw3z789UQu>t+DZH=EDl6fC_=e7Ff03f@`Tq!sBv@aWxQejn}?KC?t*ZY4RZ{}69 z_9^R2JFlL(-YK7k3{1fuieX?_$h+r`#_ZsCO;Ur%Uv0pGnAOU zNP4t8^8_PuGL^PDGi7JqpC&e1_(hBE27-OxsGnK!Ga2vJo))D1JfvOWdq)3!&MJTA z`0ddS0*kQPmaPnCw z8okm*-+kb3jMEiJKlDd$yWdIaw8`0j%2MjA#>M35y_!jC@p-pv*S(v+9l001grH>2 z6!5I}*yNP=o&9z10;7me-=OtiGU`EVV`B&X$%8hbyjp<*N4jag%i~RpLCH{6oX2Bn zC=7wGw$o}mC(1br{XY1@&!fG~IbE#F4qd!NT-10sBkZSB$ZWqO-!{6(mEw0dToE(@ zu&RibCf9noI9Ic7m@)S$7v!hiw9vLgcdTf0{_74)Hl!i?dq|YDp6scAIM4b+TnQiIz^_ zl357$y+d6Wd%IM`Nc~kHzoIGtA%T$^VIjX5=3!lz3mZoF(gPeYqvrNm1Z0C^XPRKD zT5YFF|&M5%#WhN@hUwQ~P(`mxxav6(RFB4kI?J#XrcCY}UT zms!^bE8W}TlKwpj{ygvQ{3XGAWkx~6E_Ni4$aBgTxk2mKgDO`A<;5_SwHzv|aW%1>*xU#Jz%SXkh zu&?|ggZmjrGR<5V^R^A>RL4Al?(6Dv_wyFyS`JjVpFFrmCki#}WVGd_hsGn}@~Wnv zS_nWh`I~fouG7X?7({#SsQaQ#y>>!(hAcBQ$9GxlHzC7D1;cB)0ph-L+Ph6o#VGwg zUicG)eq{Ru@-oD}!9#0UTR!n$UZ#n?nRPyVaToSf@%uxrl&^!9aY`#mpOz)J7bEj+ z9{g>sgVi7%bttO&r}{Igg^j>%$E@#nL)k~~xpKz5y?@XeIE)Ud&wc|)3@H9--W6gS znZ*2OmDgc385WLWo!U_@wVFgEezhMVP5m1_{|B;-|JSE6{v<6>+aTt3=k3|`zlKGh z%!><0M)-}S)wup5B8Ip6fk+H#8qo3HptDO5xV}p)R7vbN89_?$dY+ z$=Z9KU$xaYI&0sOW;RiB27LV;$$7Z7$t;Qp;Xu#W-WYo-OOJIWNku+A9Q{%hb;FiG9PYY!UZw0R=xwR^cL63Pq&$zNwcON;3S>_{5M< z;B{tH@G7W%#wGE=IsG|SeOQ}x%8N1$vZy3Xm;Gg+!`2@&#R5`A*}~k>7#dYCD%l1< zn~!$9t)wX$_R_le7`y-oXYn zfDSF50#>qBuiNM&%vd!d>P^@8t+06XB%YoD`0G9BagBd@=kW9Qc=^jZ ziPxL!qn;R%RQ9;e(kL+_&nO_3;I^&!w7XgC@BH9GEqu(uEwRPr`K4 zX1Bp=6tU;j?9!&t7fRlb2EToJx=2fuX+0I#$r83pD4_bQ9;jC zL|hcr7H}x<>w=Bzr1|FZ->N*~D}Fgz5<8`$PdI*{&=%V$3b@uT8?=)w<6-F#(cBO> znt!mox52OE7)&TpSoS)-ftHaGLTfcI>PBCEFDKrWdjlKw)jAUxs& zBQ6Qt+%qIK1wzABWbG-HvMj{InUlfbSsn4}7t$n%WJOV#nWaX?tB=pKIPUTEO$M0} zy|CR0Ht9AE%-jzY%`3JQ(5BAmac$8 zlmr9LWdUIZLJcxB9*A4*`;LvLGeObEPS7sFOEwyA>M=c`4XY|gf`Hi^wh`m^^KIUH z;fHJ5sS5d*wTeZRNj<<3n-5;zLJUyNH8z&s0k87XXIZwr z;G#hgMKNcVqV!>N8jLcGVs3}S{=zSUaY)r3_sZ?TT;cahe|T*uQu)< z?P5PzH@d~lwrBd~TksW0+We1AoNTa){!oLkcyXwI^H; z#8nZj)00@!W$_LO5s|D4xQY1SqthBfHq*^fZc%g3^>E?q>@qTZyCJ#gE}nE2%7Gw5?I{ zjx`#`p<9j7p;(x;M+V=O{6WN-MDIAJbOKB5^0yk#nB~p^eHN-IbK#IQtReleXAaKB z<|C(c{;ASu!x|448QI@=o=C!K$D`?t9)VyVn?PLZs>y8*%hl#Qctj5Nx?_#^so%OY zXl`RH^%rPsg*aUN>or7T7{mV@_LFR=q!{u2;kpA-9U}ZIC4S7gIhzkB=F_1c0PhrW z>J6pH!g7=HuCa;#s0;enC0D043ie?B4FB67LbMA=BNJ0Ic#%-ud@IOaNhI(7A4z_Q zj8uKta5=azm~I_v3c?kACl%R@lP8C$CNKxL^Wn-}`25i8P3B+~g<5}akqL-p?@lbs}gbzUB#Beq2~ zWml=smoCV_R3Z*~M=?s56k}iLah=GVdD4#g@UQ%C>W+Dvg-WDZPG^-g!lAcOzqx!< z-iq7xl`;JJr}we8s`p$r9sS$v_88mu)+ZNJ(&mU;k%$^SM>g5(8$sLG)dLf+;4_Sj zJ&VVO^7?6KOUQ!#k6w2lxR0nrC{NemgtJ1SOzj!wpAPQE5>)Y3UF8*D6OZAFmD?TC z*~Dwt%6IxBQ7FA(w$EDi?f+wQl%Lwp4_0F?lH26ZnFnm&u2G#(0)arwzX^g-JACVq z_d9JJ3DfFgR2L`D*;{5AK4fVMX;O?qg2|Es6v1rNo19r&l5;yU--W&rz?8ktH?X%` zlYif5;M-F1Rmy0oRTZdW#Kig+UdcZ@qPs!|4ce|np;j6C^Fn*jpZ-nJHA473YeTIv zuD;D-C;`)?{%Xm7z=n?40N zfgGyd<{-Jxzk>w;+g(IqP*Y}a-`NlfnMdg^9CdaLJ03gZ$NFg!@2jHj;KYlHmAKXe zPAD4JZ1Ikj94+_!;I?evWVM zj!UpivC*60O@o7oy{f5JuL% z)N3XDp%4IACsF&fHcw2Kt&w6>^pPI@u{gLtvQdw@=TU#2NyWOpn=CP>F~l9~tV5v^ zk>b`lJHokejzs7P;6xh?sSfud2y^5IzA12|qN<1S@5hEqJRE>zK}((PKLWCre5`9) zfEmmO;#dzzeasGK7h2cL*oKuAi5)Di0MCahM&1)&&L4Ukl*VLqKlOaM*B*@AJscQ2 zPXj`S#M-nL4Nj`LWCak&tQ?ePA9JIp?h6IAclS~=8D?u!Xj@{VTINjl2STq7DJkRS zeYnDPh!=4B^VvP99WL+IHiXUqoGkwXOokKnoxs80w?Pqub4IG-!-xN4Q@XoT&XI^( z#&})T40`wcGEFHlQ=oY_vWE1!3!{fGc=&v4!yZz!JuX|T&>%Oj9$c91QSOvgeE3r; z8ioxGeLJxKYT;p7*%mXgCAvw0`5YN}pUWNf(|RF0zH(tg zThqJ~82!fyVl;-f&UdUROlWa33VH66-`SE%RQ(Q5K1HFdSEK{wcCfn@i;Ye}g6iA* zI&XjB*1uoAq6_k|0Dd@MAEQ}NwmX-(g_t+Rlw9wgg?R*H7z1Am0V43j?B^JzvWIa3gpIydQOZlI9bvoee-P1BST`QjyolJ4=j=zUvOS=46I?pL zs1KQl9jD;rRWnhM&cD`tKIr5HvmOpVe`@g9*O?#a!-|}<>#{tO zm5oOM*n6`P;H6CeIV5+~(p7@|&>CA|p`axPAeLLMplnM~k{i453nEQQ2lesK`twd* z`r7X1kuDB(b%eo11o(I)^P1d?ywVfuo=QfFQ!>tG%i8J>n;_DJ8ciQsM&&v$+j#Z5 z=6lz5@j5z6a5QGVx$RG=(OkhG1k0<=SaSydQ~FLBa`2QnJaHuPWVY0_Y^e=$@*{73 zEOyQ7o**f?Q3^ES$cVQ$rk_cvi?8I^1*?1B=|0rz`jB&y^L)cEn|9X3pmdm1Ze3CG zxb5@5Cb@lw6n6e2rf(fbk(C&BlqsOft8ZD5Dgn0SCN+3%5 zWXm26aRoywsGyh(A3#cf1_(hO){I~%6HMNkK_^Lm`P5@bPC-9wA#;cW~q#GLneME3>IQs z`nGkvdp*sw@RPpg`mjSHgRUYkb)CUoMmGFA_z1mD!aDuFw(epVXo>Qi{B(35pM zebySGE6WuyiUC&=DEwIZh@%Sxst;~z;gN-OMM5i{V* zkrjO04a8Lbo_ntPljh4!w-}iOW2ZhxngT+wtuK#CdX?WvN^B#U-<3;ci~2Fwt3$f) z9DGT}?&&QG>gnCPF_2~K9BV>nQ(s=+*f6T8^wav2h>^4}?wY7o860c=gL*H}!op(6 zDM_R;qP(i?bVzZyVtfJs`)o-n-Ns+Z%AKuhi;oEXFq@FvgKR)GvVtc;HK;a?8QN2j z)O3nYQjP8yFWAd&kW&>MRD38X97SR?WJ58R|0L^q5}x z3A82hk|XivgPKir_nC&a|vAAaAC8fUa*U^A3ZC z$I63;01j-scLK`qEe3h{dTDryAU}pcPC}LFsjB#^(~%r6wf{k#2-9f;+h@o@x+Y?~ z7e4a&yv+6_%UmHfoA3iYtHBd60KV*i4HC9fi3mh&Pj8F0TvVgc!KG(v)i$UkUpY2l z`*43GqM%1P=bAvWE@f(G@H}(P6fFYFC?>>Fr|3Xn*#4TwjUTK z5Hv3lVG|pf|56EL;ej&Q>SJn0(j_e%BUPe5R;|TMv;10tp|U(+1T&H(JhE~=PqLyV z{-OE@5^5V)RYMnxYA|XsBgQO+uor6%v(R?_{H0wTFx*IeiCCv+RwJ=SW8u=RS&_wAY6HjqYx}YGLLZgt@TZ`98S)8V-f{z)ZbVXsvuJTD?9| z6i#~eR|fNwim^) za9YrQ%dv+lDq5vp-b1th{%;A$x9%|4d93$Sh?kCQM1Q4cn_KC_h(ltC1;@M*Mq!<%~!g6sTvtSeAq$sXQEf2oh&RY(r~1h2oq}58dR+YRZBq54oyw*{`(iY~+K%t&$Ow#@28knk z0%T$!g5upeb#!614eGb+n6jrzlL3@chlBssHL(nVj9>tg>aD>_W8S{K&Z9pO{e0em zb*kNb-YqrlRv=USIRLARXUO-yAkY&YQJt4Ss!$$7u62{SOW`~9X*17DyQE7tol0hG zhkp-HLy4p^E?i@{QSS@)&;F;8qW?)|C`}S$FnE6+#55mo0?zpYUq54<(pm-?&OF(- zYJM;d&ad*{`0q{^<^gG4Vb0e|`*mTc$CFuTVHK`_(lQ>}@; z;%SA`>sQ}D-!QuWV>7<-x>36tRXgK_jSQRwKMZ1BxZ0H>{YOfyBC%_tr(l1g>P94z ziu$=2-Mo|zw8e5OKKuU>u4$C1DdIW~-j&=st+Qt2W)5C0qs;w9Z|c{%e%N3bt|435 z{#ZLYf|jmn4s}>mz{ZSj&{(Y??IO`Lvo-Ux3K#qSRTwQx|2Benp_mT%*J`RPJ~OIA zl3u@))4j3z=C_{=Ld^Yo9z(k$V(?7^fouJhi(K4nsWS2K@h{O`Xyi5m8Dj41PW-E< z5&_stM}#+!g4AydL|W=8!;XUQOs9KR@>Nvb%)d~S^aLn)%OSBQuc}5!U^Xhb()WD1 z*BL1tyJsgQhHtj$&Oj11^|byi1qp+L1G&q4e$&BRc>y9Npny3ynU?$Ae7o5Gwgf@mKno2n0P2` zWEMF?FgFw1=y59X%f1;Zbw?xBglu-(+I=oRulyvlC)G_VW;^n0(+ubk`#vU;NxSLp z|dOWdhg&K zfzD3Bxw42^-4Tojq1IcH5sWYvYKM-_Ob|PIvDpDBGS6IVSqy^+r^~uZclN#@^ZrP> z#>ReeMFqco_(y9oQ`Bqqdb1ymvl^(sLD4Ix$-YVK#_njhnwQU?)TEIWJ(!ts(e1@~ z-%@}Ke#+sBVuap@7B=OADxXrU$4vb!#8;KsB`6v?O+E0j0ffpxhgaF()ZOeaQIVsb zU9Eoe3PHwRAQ27~_Fpgv^m(erh;FROyc__6sB|gcqrb@xICoZJx~!;P*qvy)%*3ffg;z@tCB? zdlIhw&6_ftk>Of1;C1H1-i)e{k^p~W_bQcm{}ly}?lydU_y*$CCbewtuToAyrX-v@ zS9aIruG4ONfNEVK%YtK}@wA=hZ%T{F#rz&qU3&cjpF2pzjJ8CL+L!Hqt&ci>a70`e zdk$tZ@wBfk3knuSaNfxIko1rtde>+`r69Q+S-}dj=m{G}UNL*V(gWOVXGwYLF2Xle z1e~kenlC=gti~1$Ujpi%F-J3442pU#9 zvk-Y_GZe(e^{-db9@||=z;>!^x;pk902pZ$Nml=uN3pr`e43Sb7UR+9z=f|;Gtc#} zM-*MP4ow|(UoUa$6`Zddf(f@Hzcw+*u;C@LAfkHT(l8M0F5?S?Xl7e?1Yxz+ z5+326^x&>%*ZNLh|GMrH3y0L74xkP3i4Z!R`0Vmad2D9}#>Uoq6k9{!ppRNFE^P>f z!;88Df;CNcXJLJGi#lgNjmypdV>^9-6La&Kt+rm$mD}L#`#A)8_<76`EYicOG%n@v zbKHB{y5KQ|BfBNCv#XkZ@6sDt*PC?HD(#*o4%WJqcY@vlEZlpv!`&QF8T_L%?GE_8 zL8pyUOgV3zF%{ibvLT%?~-i#zh(K0^=JL_@V?A~gymX!*Uxv^XExPW zJN##gx_V$L%I#S;c=oN zhql|%<#%<95o@C))F-B*k^Cp2ljakQ!J=Fk=62rwm1+-XoWAsFt~D87u9H6Nt`^yP zoe~b3P`BB?s)Q#24v7M&8f&(M?d3l@T#Iq6=y^<2Kehd2Br@1GZSAtlK)Pflt$0#6nykh4ZpkK!&VV};&-_JF!Ch|>4N^43r|~0zbMA> zE7aq&zp{YH|JbgmDsEqrd10*l7vp2I4Ya9TmP0w_VX?%J-1z?r?{`Y zj=zc)vZ2{*-&?)iz?J9bk{p#!2M<{X9m@TfeUf(fwGk3s&h0?m+yazkJ>~OwymX#D z2ny4c-ntYBk8WwY3ZaXHR zvyk2edK!f)R>0WFrOcE#oA_k?kL|mNanFlad-gc2YH&1(_EyRrwhO-&{EYUMs-Tl_ z831MTPmW#xGPFoh4P~_}FZxzHbmj|%%3Riut4h>g>?ib8e)^p6Wd+d0FucA;3mPSMwyJUh49C(cWrfnM|il)5u~-}I~uQH zTt;5eROQ2{O8Z~oAh3@j8ve}n);lq_z5EzxzOGXn7;^iax~J1v#BbCu=X8Wy&RPoz z2y=CV8v)T0dK2X0_AAFt4v<7{R5$9qwwYr^oomK7dZWZCq$SYtFj?eLSq?IbAYhA` zzrA>Laz^R*)qzlwZH7yHqN%jyBy(Othcy;xbI&RS6d?ar=;k}QY@U?eI#&Fw6aJKG zkfs(6rx1qR3GkHTJ76n}x^$C(vQ&l=cbTkV@S;#iF-;JyYXt6c%=#B3U|Zj|>dcsFvOiuAsMN98!5yz4t!Ngr3*LO+EHA( z9O_=U2`IPN$yV=@cz@1u-3qBOZ_8UMV`(Y~b6Dl(O2vS{L!HI~k9GZv|{# zz5Yl^j-G(*K%W`_QbT2E8N2ePg)s zUFWxUa?!IR+V#dla+kU0B<|@hmpT_)I{dH-{j`|Frs`mDJui~vXX34Ep1fInbZ-g8 zv-{oMm z<$h2a9laRz`A1``bu#$e`zf$ZItvz{v-6R2{Y~zFifAZE?d}Xd3k|4uuI=%0R)_Ug zn$*6czZRqyU$2pSUbLuk9wx8{SOB2-lnGba!r{q9lh|i)w84+3cRU%deS+DCn5kEE zjPKbiAEAd%2|t#RQ=5YBsanEzoTe>is~oh?1tNW`NqBVW+lFkkX!;E`$!!Dl!!Vnk zFMkf`I~o^Vb3N}woAF)N4^=?9<`urwcC!cD0~QiTTj5yaYG~B@%*P7-`7B8OvxRJp~U?V(0g{?;ytr7Q|v0S}lEyC*#!2Ij2<4X7@^QDPJQiKdY~bYB0=oz7jt zv^o67c75ypWb#2XWu-n=Pxk%RO~ORBN33Wo#wL9_hKlb9`m)3gEivmGTDp8UuzXWa zh;2RV{O|2HF&RkpoJZoBN=rge-73M%TrZ#5kK2ge-+OKiz?x%#{(11Pr=1ytAGKcg zVQxC(-as|WrxsKf1?zf?eBe38TOc%44$D{-H)RFEtd|; zyN)ZT*@=PO8|0U_W^mXZJBuacxtRZstgkm2`4OW3Czy&ZEH5}TvfMh|Ar61n<-&@o z1quw9g!}S&wR4o1lZi8v95)XdjgFpqwtk_R%}UN_p%aZORP+9mKW`PZU{+L*&mxm`>R}O9!TcD5!Bb--sl@E6I&kB$c92+8~kP0V%DYe?td1I8_dQA_>t$Zeg6!T zN2|^1o^kAIeICCVVkPAF7hH)D-iFa#C@&!E8P;FZ6 zEQIB3M-prBjI}4{A0Ac z0gkq0cdlhZC4bW&0{Hf)yNbsbL!NC3ElxK903mgUla+vc1StcY!y z15@U8i)d1>>=wD7I_w6!AbK{hZd6hDb&&Hk{2x3|^K>sqwgt_ZK3Zqv<_ii?}8aNJwdX4#DZavW)+ar1NlR>wn`u zYPVFa+O>j2X{o)6S_y)PC_$^Wi5*I-U$gd3sJ#+NY)Y(Z(b_FaLMv8{B1%i?(D8fn zJkNEVzu;Ww`kZs_`~7~s)McI&3@>G1g|F~D4(OWLKAc>s2S#`=L)26z=N+#0 zIzGj$T)H4_1!3&$Va$%+=DLI9qY>5pFMc3xb?5t^_Dn%9IfsbP3Nd_>R}9e{ugn>u zVXL)c$KRUMH$yeW@TTp-oY>owS--#Cdt)kS@en%3jk4UvtgnBY?z3}oDxGEgaPj3- zI`J>@C4V*mNMF1nQ|Cfo+xkxWd+wj4*ksdO?Y~1h=FEJ+ia7V_CNJ{FG3`wg9z1zH zMrv%k#b-~iu^Uan8%8@z+ttqF?Gj{Vty>lEs_HBmf~AQBMIH~; zxeE`NwyVDcl@hTcvn*!PbZ~x;Mu+JT6VRxdS^84ePfCdG7lcY+M$K*FAlBJ!oL}bd zn*$<8o;_YjkXXPEHCnNX{7n?>cl|(gz|nFjZ~BsBh5{;2VtSq>FZ@X#lfVSzl&qls_^ ziSeXCUgJ@dAI zA+u{d4z}1xrJ=frd9_Q4rsTq*qv`gr*)Kj{CRHqQ!{MK(`|y{Uj>n7dv6u4TDd`@y zeDRn9NDjBv!oUpmfzy`0a9rQXxT7))Nw-(vD_*eE6;+Q}xkkff_ijO3bbsoeFs7ll$=c)%PZ z7h(`mO$`RjBMF^i>CVL0{)>XEqvdF>FfXC}c#93=ncl(aie0VkfQom0cvttg&UNzv z;qF-t5o+#^*BAoT){i1`ejo&;oKKK9j0m!ArC^MoHn^+5Nc-v$)(gx*rVGt9> z6e}!iJ@BwDjw?<%)tmEK!AZ>F+wcGa7O=6-Y^8E=_9D;HDEdkq2Oc))Q#`MS`rtsC z@NshJddYu1u}j0g_~Apumrp8g&AQ?c#(IIbQSTr@^WVXMit7B7wzeMd90iFfj;0+3?{(yv_BQnzp2av}Oov0_`)MPwQ&zSs8POL5H(osUy9PHo3ZQ-uh^5>H`# zI70Y>z40KAB9rfEadqVC7i<))89V2esYk4pEv8_|)m-Nhf7X-NcSPkxMk8luTyP@| z+*x|(d7hU|?AHL@Qh>T)%z#8D(J`Z!20tl+NIIL;*J?N6ZLaZ8xhk;V5k91UXH#Wg zjkzF9Qu$rdM}>vei}kc(H2Y7Vd>&X0ypmT7JA&3;)mIFTwVpH8HpBJzvOm^O8{R|Hps2-#v;=V zDFy3%7Z1tMP}2-cqrq&o#-=$hhLf(u#B=QJ7In5Qof{IKd~o4HQo`oqPOg}n>$TF( zPYswf^l0s3LkK5lRyVg~ob_`3tYbV}`@;X2#!N&G2vHE+c+Ya}wA)SOjFrl7wgcDk zZ=Fi(jUpUt9_k1BIRNIqlTrgRsSzT41!gFtEH7gg!{xxi8h?@8B;j@`)4g_-Lh~DOIvCg zw_3)dpwU2MKC5%@W%naj@$F`{uNrH~E1KQ3;L`a+C9SCjrW!fLqky4t1{qmr6ItO> zgXZT6%W&V+JE@>_U$I)Glk<7>Q=sic=}~!C z7e?z+7df7ZCC&x0aU&kRNhzByj&*iGMy+1=9S>85uLRt~cnrg`n{kYbb<0a>>)1+U zHfEVD39Sm7N1a8wVkWct9>SJA-^bx)0>H{#r+oGENk8AjTN(t?bA!~`y3NlqUcd3nC0elq{b z5N~`$rR5c8du%Z2@`e*Bz52=KP1I=jy_5++kj5+0?J(b9;SN|hlhw}WS&J?X(rKz9 zQeU~ih*M3VA$f+Vs0O19+k`4j z3##ne&t>a7o+b9TlF(eXF7qIma=m~pY||FRTf~R?zL1z$3>zrfmI2>{=SF(X1}?h0 zwrgdZ6s&uXU3shza;(=2$MZqbT@#IU6%`q5jfLga>M?vrW?VGOT?Nb6H@;@~AbE4R z3yeqOatwa&yJu=05Y2<@SNH?7CV2abAxzv5b;PqOE)iV^27YY%1zs3Xp-a7;g*7ImTY0Y7ll6&&DTJ4q z>r}q5>Yk?j|CpS7SA;lf9Iq0O=|ZI#?N8V7mkV!_tMMH;l!VT|%R6(tL!${EHMaD~ zsnuf8?Z)w*`n=M}obNmCD%mwEO%nWhYMoL#B9sG?B|ZB;qVSe$Hlz#k7$Ps?SOFoE zC$)bth$I+H{-7cgJr=d?R^iws5j)&uKsDOV2Nk_5q{pq}itooF&vCjsWHG_Yld9x4 z)_T5-SNPg29`t9_SCi068k$fYtGtRvSGYim+?9zdrAC&$UQdtkUJ{&HY#a&Pv|B@RPT3sG*!H7B$&>lr^qq;0}qpV#Eb+;g~28lRG=vBP6 z;W{Ti}EXo!KQQhRXR+YCik33LgR)4_0UFl zv`;Nu9GOR|y0B3fggU6{>a8+O2f3PvTQRU2E(`84?vk-D-78=j8Oon)*|e{PINJ+F;s>P(S-pS81x&&Drdpl;^!8uP0WUw=gJ?r51sS!A-{>9Ekf1 z_ZI#s&@4xs1(+uq;05)WUk9zdm1vbqg?TuBs2#V+tfH>B+rfB!N1ruGQ#Dd?wegnEIA;@FE@P%lqDD`zC;B+igL2gf+avd9lFu8&h)uFsyqb558*(*oR ze-saBTe&B8A-=v&PoT>N&t)1u&9qe2q&t~|ZndY|%38uc3^@3hf9d&l47%`A>G_qI z^>CcGKJq=(VNXX|px>lUAsS9v%-9Cm4wfZ^&j0*0xp0&fmfZmT@ABrD*io0ib2aI0 z0HCR)pu*JS5!^q`W6(LisqcElq|R?Uv6Gj2DGFN}zV~X;Moyqhgme~9<;OZMuG$BX zxW{!pITs}^1bVz3Fv`GcPSOM#IWd!B(lf9);B6PvxoVuwQhOp+F;_aNx)7IxpJ;v) zzJ{~HPpAIjMn>-XrPG(;;;t|z*l~ICah$<}1-xNS{URzO%P+n8El%}Tu8l7MjNUq1 zb^vb&icE}J{h*BWQmbl9NUv?B%pSlRt(vYcb7w4tVR3>_G8-WjheTZw`!NnzwXYhul5+$4A`YxunR_rA#O6~#^0H=|E;1TIJL%9zB!D!5OS1ivP#TiB7w zbsl-e^HI&*_!rCDw;ta*`6UY}<54-O23lK5byUO?@^l$7C)gK|hSAgMXIQh+&1Zma z-3ZpL_~IqVT>K^4*;AKs#hbDk;@awZt)Md7Y>%_B_Z?mu%LvP%a=OKb$D<5TD?J9T6Ce>KkeP^o}-Yuh(Z~a z-u$T&Y1yP(xBQeKy^3KDqLj!(Qaae5y9UT*P6d55?A=FMzTnq4v0?@TX~RQ*J(f7j zS_l+ZLqvt_OQU9CMw4;!Ty#uj1e^@sB*Lh+7QiK7f$id;9}ZY-~!VIj8kyz9-H-nSCNQ#Jy!fVRa!a3%jm_(8ai*_wKe@T?*-Ja8F%$e~HjPIu3Ig;>vjt=a?(H z@^^_R5H(GVV^giW72ALEA9}|FjjwbY+eD~G3nbBje`9~*onz~yG9^pB`t$ql+Yl`; zXzlp(4eGhxN#I>_ID zFUk6!{c@koOvj-Zdf&a_ZIh{6#={Qm(qlDbqrVmF)vQJiMT4a20Z(N2zNBgOk{0!G z+go!%Op()dkt$XiN!1`ZHV4VtNU3Vw;*IQ&_0Tx~BohTItAXFsHogCm@0mS>@{Mgo zr|F*(({p0HCDTJm>o@c!jWzQ2M@YAOu0lEwQ6}|MDl+ED2NlI(e%Ju6{P;$W2H!it zsa}#=pSzJ$SaHqBLCw=f)hGsb^ZS`P3*^}9hu(3vGD*327CGnAqUMZD!H9wFb1#Ze$hBBRdAMkjZeznw4w$ZwA z*eP7&$Nd+q>8!%be);8jkdCEgi;L$%?YDSXE3hUn?oIdZ9{V`&5`)j@I=SWy#f%9p zsmffF3k7g<0Nj$33R@pzkj1FcDWQw?`x!zQR zDqv|V|6>YW)r1J9hX=e{O{Vd@<*7CB75jWJ6NCk-95B0iW#vV*_Hj6E%#kn|vCTic zw86PXtlpvtAh>Q>f5PM3O~;;t+ry9j_1LyY=mJp!8TL&I@AJ$E;;RoqY`1v@ed*W) z`skeTkA=Aa=PV!lV-%-aK{6qzYUtCf!#d#Mq>k>;N|nL><7TQQUD#1W=vL{}=XbQa zlp6-MdQTborsnE$l9#8v(7~pDWX5T5+c)l<1J{RHBz^c2t_hc$&$=nbVN^|9u^?|x zC3%zpH{GN33!|nE)9r}Se8swx3k7vESvwqSE@3&X19yBPo@|6SLJGFkiixMp9;I(s<6=$aMdEZ8|25tI}e$hV=<8$B$=%ch?x(4s%I#^S;7JP;r ze4Hb{z`b&BuayJ1#)w|`4Sp>)>Bf16e=K7$C_N5PyN@SXtvw@8VljBLk22h_gmXF$ zMrW1z3!IpemN})!ohvmpLJE)NHXvU5N5O0)3V)U~;ofyDz~k5SgFBY6`~8vdhKN11 zsDt;&J&*26p*0@?8HP)2P6T z#VCs@r$H94T1(EN*54tlaKrbJeaCzJ(p?JAi!X`tHos=bW4O3oKspj$6_G_9jhfXY z>dT1($1{#UdK&1E`{WpxZ@@^$M*?#WRY zWq*;6k-cLT zw~u4Zr3_z1zpL!qBscmf3rNN}w9%Tcb-(;}jFszQUyZ($!!=q&|Bhwn34X->olNLlT@_9` zOzDJI$=sh<*r)1?<nQiTEd?SyxJI8Fguc#T_;Q1iHqbNGDXPTUgXIE?nhS8Q^xKC4fmYIN5e# z*}KgsQc4dDLwa4<^#JTJ8I>#EDX?SCX>%$@7C&<+n(cq9ml{6XWno;sp#1JNPNp9;bzuRS8g9i9*AH76o zy>Z?$vjKc3j|b^!8E}bO!6Kf^>2B)G1qr+6YZgfrEF%`$umlgT%Z?B3{*+J>P2~ojmU%rL~f5@%2R?bzJRv zP1SbRY~DmVq-KWG`qBs@3?y#`A@3`axfaL%2k}KZ>*1~I>#y_+Q&@NVaw1ePj{UxCxGLUKZBb_>2D4aDzj zrW3FZp*_fBvN1qTDhz-2(n=J6tHiY={J+mim=hc1c=BUuEJQ6TDr4|$Pf`ER{k3dM zSnRzOm>%wRPhQWbPpKx}J_2c~T+C*MT@UOBC91Qks$L{6#O{!H5G|nEYp%Y2tC44A zA>)s2o6p(!49a(Y|2>?|_x9&cK!2^TIt-HAs1G6S~BY zRmv+UXXRU4;GUB|FO?UFopgfk=5j^$CFRX^ea~OzWDvd1<=}D~H>-@$0Mk8#j4tjP z2XhBCI3?zpG#96_+3wMc{xliy+dB5k{EqoqzjqA-5iU)!44!B;?pI%s2-`5^M`nle`38&SLV65xg65&;2*L&G)ulXHy*OP14>P#RXT` z)sg3|gZ-Gf1nkdV-o(nMT*&%qw8Z_LQoVH2*z%?f?MxC91At!}I@}YVLgvxNC$BI| z2c21}3?OSaToIarL(|5;LL1#sR^i#;M9A zC5_HMp!-*=3viXD{~j?PGRW4$3`PT@nc?U4(?#YXvth%(UD9>ufwP4@Zfp(P;P zh()@B;}lkM^bYtZx(|Ed8l~D^P!LN3N&S!Mn*K#XCws_}oDlUUGTpsq;5I?U>_&F8 zLG6_g3YgpPD|RynJi!E7l7tqr-^iw@^k6Lo2PV)Tu4&n;orW&O-!zJ$9?Tn&%*m)s z;R+j~!(KannV$!7qa<`Nhv2%@hTpb2DQ4dQk4C1yv+!#*i*d>fIQLZ!>VMYd8m0`9 zSx*uwI{Nc4!>FLJUuTo4!XR>V_F2P1=VfP8U$lic(o45m6e}zmqEdgO_Z3tF5`8Xv zxqLlb9G+SK9ye0AD8H;hxDTUKe}#K$%Bz|cc@fBy{A)WQ26;_P`GqZkBCP!CH#T<~ z%Lq3Px{0B5YCkAz}nS4A6{TYQ-84)%|unt2M7I z{HURc^Hdxn&w0LRyjZ3r9I+v~TKUmRS-PTs;ANT3fS<5mU7O#U2{&Q>hW<^nJmi`7 z{MWy4pGV*5pJ|jrbD->-(-sXy_kN)GBV`=2j~u38{KD_h`a_@~d7j>Bt4+PAm(8wD z&3-G-wqU?Fwttj^VEmo@4icB)WF~{V@}2O?2Qb|o6@3ZQmwtCsLzBGN*A3@BP;nGl@#~YZ(_%@+{>To0vc?*Uc`y%pqW@eeugY2XEBeyAg}oCf z!D-vB#lH4+K$T{)K|`W`pyOwqqG6%J9&clQqt+Li=Yvi@lx~5_ccbNF!anK?>)GhE zs949EX4rEh_)Pg7=^ni5Osq%EOR3iWlvZ42qdO><7Z4NmJERMW#D|v!KFm;pbh8i1 zNE5yJX5|&F1>jZQmnOy*)MlrSe%_UN$>I9v zauV{g5MRHlOP2rN(?^a>zDF&J!RH>uO#DOLq!oL&`?`Ps%aW=D$`)=GHjnC}>C@S| zS<;M;pY9F;?XZ`6eltr(om3-FJiZm1>n`=9hS5u*A`bk+%>VVGyE+Bh3b+{8uUWcJm%aZ7J`_^1~xwYdM#GMSLCa(ezCbiiOaK%*ZssJ1PZ!<*`F$^mVkUJZt_6i(X<^=!H>R9Gz6qn}I_mDS4$HlQ_6U-F#gKGpInA%D_(SI;AfayfeGiR1tGYl za*TL~oz)+{E4ZswrrCS())O4It%$#)<%7%A@<4N5xWJQQp_ZJc8ilk^{P3ivUp;fP%xP5L1_2U_DX^Ll^F> z7$owBEd#gp%=71nZOA4#NLw}^LYR|wT0%cH4}S5w3!svnau;wbbcUE?u)p~O=mYrZ zMs8S?LrvCO``l1U=dshh)~7C*T#y%qOSI>@Q+_UMS3W4;N0+xPRs7lJ^?-2reAi_O z^lJ;AM)G?|BElYeojenȆ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

  • pzObNd*xv&1hK7E#`7d;P8m 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 PYmNR2xNF4lZzKN&^&j^% literal 0 HcmV?d00001 diff --git a/Micropendous/Firmware/Arduino1/boards.txt b/Micropendous/Firmware/Arduino1/boards.txt new file mode 100644 index 00000000..feb8158c --- /dev/null +++ b/Micropendous/Firmware/Arduino1/boards.txt @@ -0,0 +1,453 @@ +############################################################## + +uno.name=Arduino Uno +uno.upload.protocol=arduino +uno.upload.maximum_size=32256 +uno.upload.speed=115200 +uno.bootloader.low_fuses=0xff +uno.bootloader.high_fuses=0xde +uno.bootloader.extended_fuses=0x05 +uno.bootloader.path=optiboot +uno.bootloader.file=optiboot_atmega328.hex +uno.bootloader.unlock_bits=0x3F +uno.bootloader.lock_bits=0x0F +uno.build.mcu=atmega328p +uno.build.f_cpu=16000000L +uno.build.core=arduino +uno.build.variant=standard + +############################################################## + +atmega328.name=Arduino Duemilanove w/ ATmega328 + +atmega328.upload.protocol=arduino +atmega328.upload.maximum_size=30720 +atmega328.upload.speed=57600 + +atmega328.bootloader.low_fuses=0xFF +atmega328.bootloader.high_fuses=0xDA +atmega328.bootloader.extended_fuses=0x05 +atmega328.bootloader.path=atmega +atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex +atmega328.bootloader.unlock_bits=0x3F +atmega328.bootloader.lock_bits=0x0F + +atmega328.build.mcu=atmega328p +atmega328.build.f_cpu=16000000L +atmega328.build.core=arduino +atmega328.build.variant=standard + +############################################################## + +diecimila.name=Arduino Diecimila or Duemilanove w/ ATmega168 + +diecimila.upload.protocol=arduino +diecimila.upload.maximum_size=14336 +diecimila.upload.speed=19200 + +diecimila.bootloader.low_fuses=0xff +diecimila.bootloader.high_fuses=0xdd +diecimila.bootloader.extended_fuses=0x00 +diecimila.bootloader.path=atmega +diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex +diecimila.bootloader.unlock_bits=0x3F +diecimila.bootloader.lock_bits=0x0F + +diecimila.build.mcu=atmega168 +diecimila.build.f_cpu=16000000L +diecimila.build.core=arduino +diecimila.build.variant=standard + +############################################################## + +nano328.name=Arduino Nano w/ ATmega328 + +nano328.upload.protocol=arduino +nano328.upload.maximum_size=30720 +nano328.upload.speed=57600 + +nano328.bootloader.low_fuses=0xFF +nano328.bootloader.high_fuses=0xDA +nano328.bootloader.extended_fuses=0x05 +nano328.bootloader.path=atmega +nano328.bootloader.file=ATmegaBOOT_168_atmega328.hex +nano328.bootloader.unlock_bits=0x3F +nano328.bootloader.lock_bits=0x0F + +nano328.build.mcu=atmega328p +nano328.build.f_cpu=16000000L +nano328.build.core=arduino +nano328.build.variant=eightanaloginputs + +############################################################## + +nano.name=Arduino Nano w/ ATmega168 + +nano.upload.protocol=arduino +nano.upload.maximum_size=14336 +nano.upload.speed=19200 + +nano.bootloader.low_fuses=0xff +nano.bootloader.high_fuses=0xdd +nano.bootloader.extended_fuses=0x00 +nano.bootloader.path=atmega +nano.bootloader.file=ATmegaBOOT_168_diecimila.hex +nano.bootloader.unlock_bits=0x3F +nano.bootloader.lock_bits=0x0F + +nano.build.mcu=atmega168 +nano.build.f_cpu=16000000L +nano.build.core=arduino +nano.build.variant=eightanaloginputs + +############################################################## + +mega2560.name=Arduino Mega 2560 or Mega ADK + +mega2560.upload.protocol=stk500v2 +mega2560.upload.maximum_size=258048 +mega2560.upload.speed=115200 + +mega2560.bootloader.low_fuses=0xFF +mega2560.bootloader.high_fuses=0xD8 +mega2560.bootloader.extended_fuses=0xFD +mega2560.bootloader.path=stk500v2 +mega2560.bootloader.file=stk500boot_v2_mega2560.hex +mega2560.bootloader.unlock_bits=0x3F +mega2560.bootloader.lock_bits=0x0F + +mega2560.build.mcu=atmega2560 +mega2560.build.f_cpu=16000000L +mega2560.build.core=arduino +mega2560.build.variant=mega + +############################################################## + +mega.name=Arduino Mega (ATmega1280) + +mega.upload.protocol=arduino +mega.upload.maximum_size=126976 +mega.upload.speed=57600 + +mega.bootloader.low_fuses=0xFF +mega.bootloader.high_fuses=0xDA +mega.bootloader.extended_fuses=0xF5 +mega.bootloader.path=atmega +mega.bootloader.file=ATmegaBOOT_168_atmega1280.hex +mega.bootloader.unlock_bits=0x3F +mega.bootloader.lock_bits=0x0F + +mega.build.mcu=atmega1280 +mega.build.f_cpu=16000000L +mega.build.core=arduino +mega.build.variant=mega + +############################################################## + +leonardo.name=Arduino Leonardo +leonardo.upload.protocol=arduino +leonardo.upload.maximum_size=30720 +leonardo.upload.speed=1200 +leonardo.bootloader.low_fuses=0xde +leonardo.bootloader.high_fuses=0xda +leonardo.bootloader.extended_fuses=0xcb +leonardo.bootloader.path=diskloader +leonardo.bootloader.file=DiskLoader-Leonardo.hex +leonardo.bootloader.unlock_bits=0x3F +leonardo.bootloader.lock_bits=0x2F +leonardo.build.mcu=atmega32u4 +leonardo.build.f_cpu=16000000L +leonardo.build.core=arduino +leonardo.build.variant=leonardo + +############################################################## + +#micro.name=Arduino Micro +#micro.upload.protocol=arduino +#micro.upload.maximum_size=30720 +#micro.upload.speed=1200 +#micro.bootloader.low_fuses=0xde +#micro.bootloader.high_fuses=0xda +#micro.bootloader.extended_fuses=0xcb +#micro.bootloader.path=diskloader +#micro.bootloader.file=DiskLoader-Micro.hex +#micro.bootloader.unlock_bits=0x3F +#micro.bootloader.lock_bits=0x2F +#micro.build.mcu=atmega32u4 +#micro.build.f_cpu=16000000L +#micro.build.core=arduino +#micro.build.variant=micro + +############################################################## + +mini.name=Arduino Mini + +mini.upload.protocol=arduino +mini.upload.maximum_size=14336 +mini.upload.speed=19200 + +mini.bootloader.low_fuses=0xff +mini.bootloader.high_fuses=0xdd +mini.bootloader.extended_fuses=0x00 +mini.bootloader.path=atmega +mini.bootloader.file=ATmegaBOOT_168_ng.hex +mini.bootloader.unlock_bits=0x3F +mini.bootloader.lock_bits=0x0F + +mini.build.mcu=atmega168 +mini.build.f_cpu=16000000L +mini.build.core=arduino +mini.build.variant=eightanaloginputs + +############################################################## + +ethernet.name=Arduino Ethernet + +ethernet.upload.protocol=arduino +ethernet.upload.maximum_size=32256 +ethernet.upload.speed=115200 + +ethernet.bootloader.low_fuses=0xff +ethernet.bootloader.high_fuses=0xde +ethernet.bootloader.extended_fuses=0x05 +ethernet.bootloader.path=optiboot +ethernet.bootloader.file=optiboot_atmega328.hex +ethernet.bootloader.unlock_bits=0x3F +ethernet.bootloader.lock_bits=0x0F + +ethernet.build.variant=standard +ethernet.build.mcu=atmega328p +ethernet.build.f_cpu=16000000L +ethernet.build.core=arduino + +############################################################## + +fio.name=Arduino Fio + +fio.upload.protocol=arduino +fio.upload.maximum_size=30720 +fio.upload.speed=57600 + +fio.bootloader.low_fuses=0xFF +fio.bootloader.high_fuses=0xDA +fio.bootloader.extended_fuses=0x05 +fio.bootloader.path=arduino:atmega +fio.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex +fio.bootloader.unlock_bits=0x3F +fio.bootloader.lock_bits=0x0F + +fio.build.mcu=atmega328p +fio.build.f_cpu=8000000L +fio.build.core=arduino +fio.build.variant=eightanaloginputs + +############################################################## + +bt328.name=Arduino BT w/ ATmega328 + +bt328.upload.protocol=arduino +bt328.upload.maximum_size=28672 +bt328.upload.speed=19200 +bt328.upload.disable_flushing=true + +bt328.bootloader.low_fuses=0xff +bt328.bootloader.high_fuses=0xd8 +bt328.bootloader.extended_fuses=0x05 +bt328.bootloader.path=bt +bt328.bootloader.file=ATmegaBOOT_168_atmega328_bt.hex +bt328.bootloader.unlock_bits=0x3F +bt328.bootloader.lock_bits=0x0F + +bt328.build.mcu=atmega328p +bt328.build.f_cpu=16000000L +bt328.build.core=arduino +bt328.build.variant=eightanaloginputs + +############################################################## + +bt.name=Arduino BT w/ ATmega168 + +bt.upload.protocol=arduino +bt.upload.maximum_size=14336 +bt.upload.speed=19200 +bt.upload.disable_flushing=true + +bt.bootloader.low_fuses=0xff +bt.bootloader.high_fuses=0xdd +bt.bootloader.extended_fuses=0x00 +bt.bootloader.path=bt +bt.bootloader.file=ATmegaBOOT_168.hex +bt.bootloader.unlock_bits=0x3F +bt.bootloader.lock_bits=0x0F + +bt.build.mcu=atmega168 +bt.build.f_cpu=16000000L +bt.build.core=arduino +bt.build.variant=eightanaloginputs + +############################################################## + +lilypad328.name=LilyPad Arduino w/ ATmega328 + +lilypad328.upload.protocol=arduino +lilypad328.upload.maximum_size=30720 +lilypad328.upload.speed=57600 + +lilypad328.bootloader.low_fuses=0xFF +lilypad328.bootloader.high_fuses=0xDA +lilypad328.bootloader.extended_fuses=0x05 +lilypad328.bootloader.path=atmega +lilypad328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex +lilypad328.bootloader.unlock_bits=0x3F +lilypad328.bootloader.lock_bits=0x0F + +lilypad328.build.mcu=atmega328p +lilypad328.build.f_cpu=8000000L +lilypad328.build.core=arduino +lilypad328.build.variant=standard + +############################################################## + +lilypad.name=LilyPad Arduino w/ ATmega168 + +lilypad.upload.protocol=arduino +lilypad.upload.maximum_size=14336 +lilypad.upload.speed=19200 + +lilypad.bootloader.low_fuses=0xe2 +lilypad.bootloader.high_fuses=0xdd +lilypad.bootloader.extended_fuses=0x00 +lilypad.bootloader.path=lilypad +lilypad.bootloader.file=LilyPadBOOT_168.hex +lilypad.bootloader.unlock_bits=0x3F +lilypad.bootloader.lock_bits=0x0F + +lilypad.build.mcu=atmega168 +lilypad.build.f_cpu=8000000L +lilypad.build.core=arduino +lilypad.build.variant=standard + +############################################################## + +pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 + +pro5v328.upload.protocol=arduino +pro5v328.upload.maximum_size=30720 +pro5v328.upload.speed=57600 + +pro5v328.bootloader.low_fuses=0xFF +pro5v328.bootloader.high_fuses=0xDA +pro5v328.bootloader.extended_fuses=0x05 +pro5v328.bootloader.path=atmega +pro5v328.bootloader.file=ATmegaBOOT_168_atmega328.hex +pro5v328.bootloader.unlock_bits=0x3F +pro5v328.bootloader.lock_bits=0x0F + +pro5v328.build.mcu=atmega328p +pro5v328.build.f_cpu=16000000L +pro5v328.build.core=arduino +pro5v328.build.variant=standard + +############################################################## + +pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 + +pro5v.upload.protocol=arduino +pro5v.upload.maximum_size=14336 +pro5v.upload.speed=19200 + +pro5v.bootloader.low_fuses=0xff +pro5v.bootloader.high_fuses=0xdd +pro5v.bootloader.extended_fuses=0x00 +pro5v.bootloader.path=atmega +pro5v.bootloader.file=ATmegaBOOT_168_diecimila.hex +pro5v.bootloader.unlock_bits=0x3F +pro5v.bootloader.lock_bits=0x0F + +pro5v.build.mcu=atmega168 +pro5v.build.f_cpu=16000000L +pro5v.build.core=arduino +pro5v.build.variant=standard + +############################################################## + +pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 + +pro328.upload.protocol=arduino +pro328.upload.maximum_size=30720 +pro328.upload.speed=57600 + +pro328.bootloader.low_fuses=0xFF +pro328.bootloader.high_fuses=0xDA +pro328.bootloader.extended_fuses=0x05 +pro328.bootloader.path=atmega +pro328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex +pro328.bootloader.unlock_bits=0x3F +pro328.bootloader.lock_bits=0x0F + +pro328.build.mcu=atmega328p +pro328.build.f_cpu=8000000L +pro328.build.core=arduino +pro328.build.variant=standard + +############################################################## + +pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 + +pro.upload.protocol=arduino +pro.upload.maximum_size=14336 +pro.upload.speed=19200 + +pro.bootloader.low_fuses=0xc6 +pro.bootloader.high_fuses=0xdd +pro.bootloader.extended_fuses=0x00 +pro.bootloader.path=atmega +pro.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex +pro.bootloader.unlock_bits=0x3F +pro.bootloader.lock_bits=0x0F + +pro.build.mcu=atmega168 +pro.build.f_cpu=8000000L +pro.build.core=arduino +pro.build.variant=standard + +############################################################## + +atmega168.name=Arduino NG or older w/ ATmega168 + +atmega168.upload.protocol=arduino +atmega168.upload.maximum_size=14336 +atmega168.upload.speed=19200 + +atmega168.bootloader.low_fuses=0xff +atmega168.bootloader.high_fuses=0xdd +atmega168.bootloader.extended_fuses=0x00 +atmega168.bootloader.path=atmega +atmega168.bootloader.file=ATmegaBOOT_168_ng.hex +atmega168.bootloader.unlock_bits=0x3F +atmega168.bootloader.lock_bits=0x0F + +atmega168.build.mcu=atmega168 +atmega168.build.f_cpu=16000000L +atmega168.build.core=arduino +atmega168.build.variant=standard + +############################################################## + +atmega8.name=Arduino NG or older w/ ATmega8 + +atmega8.upload.protocol=arduino +atmega8.upload.maximum_size=7168 +atmega8.upload.speed=19200 + +atmega8.bootloader.low_fuses=0xdf +atmega8.bootloader.high_fuses=0xca +atmega8.bootloader.path=atmega8 +atmega8.bootloader.file=ATmegaBOOT.hex +atmega8.bootloader.unlock_bits=0x3F +atmega8.bootloader.lock_bits=0x0F + +atmega8.build.mcu=atmega8 +atmega8.build.f_cpu=16000000L +atmega8.build.core=arduino +atmega8.build.variant=standard diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Arduino.h b/Micropendous/Firmware/Arduino1/cores/arduino/Arduino.h new file mode 100644 index 00000000..cec5f0b9 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Arduino.h @@ -0,0 +1,214 @@ +#ifndef Arduino_h +#define Arduino_h + +#include +#include +#include + +#include +#include +#include + +#include "binary.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#define HIGH 0x1 +#define LOW 0x0 + +#define INPUT 0x0 +#define OUTPUT 0x1 + +#define true 0x1 +#define false 0x0 + +#define PI 3.1415926535897932384626433832795 +#define HALF_PI 1.5707963267948966192313216916398 +#define TWO_PI 6.283185307179586476925286766559 +#define DEG_TO_RAD 0.017453292519943295769236907684886 +#define RAD_TO_DEG 57.295779513082320876798154814105 + +#define SERIAL 0x0 +#define DISPLAY 0x1 + +#define LSBFIRST 0 +#define MSBFIRST 1 + +#define CHANGE 1 +#define FALLING 2 +#define RISING 3 + +#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) +#define DEFAULT 0 +#define EXTERNAL 1 +#define INTERNAL 2 +#else +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define INTERNAL1V1 2 +#define INTERNAL2V56 3 +#else +#define INTERNAL 3 +#endif +#define DEFAULT 1 +#define EXTERNAL 0 +#endif + +// undefine stdlib's abs if encountered +#ifdef abs +#undef abs +#endif + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) +#define abs(x) ((x)>0?(x):-(x)) +#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) +#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) +#define radians(deg) ((deg)*DEG_TO_RAD) +#define degrees(rad) ((rad)*RAD_TO_DEG) +#define sq(x) ((x)*(x)) + +#define interrupts() sei() +#define noInterrupts() cli() + +#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) +#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) ) +#define microsecondsToClockCycles(a) ( ((a) * (F_CPU / 1000L)) / 1000L ) + +#define lowByte(w) ((uint8_t) ((w) & 0xff)) +#define highByte(w) ((uint8_t) ((w) >> 8)) + +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) +#define bitSet(value, bit) ((value) |= (1UL << (bit))) +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + + +typedef unsigned int word; + +#define bit(b) (1UL << (b)) + +typedef uint8_t boolean; +typedef uint8_t byte; + +void init(void); + +void pinMode(uint8_t, uint8_t); +void digitalWrite(uint8_t, uint8_t); +int digitalRead(uint8_t); +int analogRead(uint8_t); +void analogReference(uint8_t mode); +void analogWrite(uint8_t, int); + +unsigned long millis(void); +unsigned long micros(void); +void delay(unsigned long); +void delayMicroseconds(unsigned int us); +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); + +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); + +void attachInterrupt(uint8_t, void (*)(void), int mode); +void detachInterrupt(uint8_t); + +void setup(void); +void loop(void); + +// Get the bit location within the hardware port of the given virtual pin. +// This comes from the pins_*.c file for the active board configuration. + +#define analogInPinToBit(P) (P) + +// On the ATmega1280, the addresses of some of the port registers are +// greater than 255, so we can't store them in uint8_t's. +extern const uint16_t PROGMEM port_to_mode_PGM[]; +extern const uint16_t PROGMEM port_to_input_PGM[]; +extern const uint16_t PROGMEM port_to_output_PGM[]; + +extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; +// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; +extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; +extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; + +// Get the bit location within the hardware port of the given virtual pin. +// This comes from the pins_*.c file for the active board configuration. +// +// These perform slightly better as macros compared to inline functions +// +#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) +#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) +#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) +#define analogInPinToBit(P) (P) +#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) +#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) +#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) ) + +#define NOT_A_PIN 0 +#define NOT_A_PORT 0 + +#ifdef ARDUINO_MAIN +#define PA 1 +#define PB 2 +#define PC 3 +#define PD 4 +#define PE 5 +#define PF 6 +#define PG 7 +#define PH 8 +#define PJ 10 +#define PK 11 +#define PL 12 +#endif + +#define NOT_ON_TIMER 0 +#define TIMER0A 1 +#define TIMER0B 2 +#define TIMER1A 3 +#define TIMER1B 4 +#define TIMER2 5 +#define TIMER2A 6 +#define TIMER2B 7 + +#define TIMER3A 8 +#define TIMER3B 9 +#define TIMER3C 10 +#define TIMER4A 11 +#define TIMER4B 12 +#define TIMER4C 13 +#define TIMER4D 14 +#define TIMER5A 15 +#define TIMER5B 16 +#define TIMER5C 17 + +#ifdef __cplusplus +} // extern "C" +#endif + +#ifdef __cplusplus +#include "WCharacter.h" +#include "WString.h" +#include "HardwareSerial.h" + +uint16_t makeWord(uint16_t w); +uint16_t makeWord(byte h, byte l); + +#define word(...) makeWord(__VA_ARGS__) + +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); + +void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); +void noTone(uint8_t _pin); + +// WMath prototypes +long random(long); +long random(long, long); +void randomSeed(unsigned int); +long map(long, long, long, long, long); + +#endif + +#include "pins_arduino.h" + +#endif \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/CDC.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/CDC.cpp new file mode 100644 index 00000000..5cd68736 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/CDC.cpp @@ -0,0 +1,175 @@ + + +/* Copyright (c) 2011, Peter Barrett +** +** Permission to use, copy, modify, and/or distribute this software for +** any purpose with or without fee is hereby granted, provided that the +** above copyright notice and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR +** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +*/ + +#include "Platform.h" +#include "USBAPI.h" +#include + +#if defined(USBCON) +#ifdef CDC_ENABLED + +void Reboot() +{ + USB.detach(); + cli(); + asm volatile("jmp 0x7800"); // jump to bootloader - DiskLoader takes up last 2 kB +} + +typedef struct +{ + u32 dwDTERate; + u8 bCharFormat; + u8 bParityType; + u8 bDataBits; + u8 lineState; +} LineInfo; + +static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; + +#define WEAK __attribute__ ((weak)) + +extern const CDCDescriptor _cdcInterface PROGMEM; +const CDCDescriptor _cdcInterface = +{ + D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), + + // CDC communication interface + D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), + D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) + D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not) + D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported + D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 + D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), + + // CDC data interface + D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), + D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0), + D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0) +}; + +int WEAK CDC_GetInterface(u8* interfaceNum) +{ + interfaceNum[0] += 2; // uses 2 + return USB_SendControl(TRANSFER_PGM,&_cdcInterface,sizeof(_cdcInterface)); +} + +bool WEAK CDC_Setup(Setup& setup) +{ + u8 r = setup.bRequest; + u8 requestType = setup.bmRequestType; + + if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType) + { + if (CDC_GET_LINE_CODING == r) + { + USB_SendControl(0,(void*)&_usbLineInfo,7); + return true; + } + } + + if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType) + { + if (CDC_SET_LINE_CODING == r) + { + USB_RecvControl((void*)&_usbLineInfo,7); + return true; + } + + if (CDC_SET_CONTROL_LINE_STATE == r) + { + if (0 != _usbLineInfo.lineState && 1200 == _usbLineInfo.dwDTERate) // auto-reset is triggered when the port, already open at 1200 bps, is closed + Reboot(); + _usbLineInfo.lineState = setup.wValueL; + return true; + } + } + return false; +} + + +int _serialPeek = -1; +void Serial_::begin(uint16_t baud_count) +{ +} + +void Serial_::end(void) +{ +} + +int Serial_::available(void) +{ + u8 avail = USB_Available(CDC_RX); + if (_serialPeek != -1) + avail++; + return avail; +} + +// peek is nasty +int Serial_::peek(void) +{ + if (_serialPeek == -1) + _serialPeek = read(); + return _serialPeek; +} + +int Serial_::read(void) +{ + int c; + if (_serialPeek != -1) + { + c = _serialPeek; + _serialPeek = -1; + } else { + c = USB_Recv(CDC_RX); + } + return c; +} + +void Serial_::flush(void) +{ + USB_Flush(CDC_TX); +} + +size_t Serial_::write(uint8_t c) +{ + /* only try to send bytes if the high-level CDC connection itself + is open (not just the pipe) - the OS should set lineState when the port + is opened and clear lineState when the port is closed. + bytes sent before the user opens the connection or after + the connection is closed are lost - just like with a UART. */ + + // TODO - ZE - check behavior on different OSes and test what happens if an + // open connection isn't broken cleanly (cable is yanked out, host dies + // or locks up, or host virtual serial port hangs) + if (_usbLineInfo.lineState > 0) { + int r = USB_Send(CDC_TX,&c,1); + if (r > 0) { + return r; + } else { + setWriteError(); + return 0; + } + } + setWriteError(); + return 0; +} + +Serial_ Serial; + +#endif +#endif /* if defined(USBCON) */ \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Client.h b/Micropendous/Firmware/Arduino1/cores/arduino/Client.h new file mode 100644 index 00000000..71558ebe --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Client.h @@ -0,0 +1,26 @@ +#ifndef client_h +#define client_h +#include "Print.h" +#include "Stream.h" +#include "IPAddress.h" + +class Client : public Stream { + +public: + virtual int connect(IPAddress ip, uint16_t port) =0; + virtual int connect(const char *host, uint16_t port) =0; + virtual size_t write(uint8_t) =0; + virtual size_t write(const uint8_t *buf, size_t size) =0; + virtual int available() = 0; + virtual int read() = 0; + virtual int read(uint8_t *buf, size_t size) = 0; + virtual int peek() = 0; + virtual void flush() = 0; + virtual void stop() = 0; + virtual uint8_t connected() = 0; + virtual operator bool() = 0; +protected: + uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; +}; + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/HID.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/HID.cpp new file mode 100644 index 00000000..0e68a3c3 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/HID.cpp @@ -0,0 +1,446 @@ + + +/* Copyright (c) 2011, Peter Barrett +** +** Permission to use, copy, modify, and/or distribute this software for +** any purpose with or without fee is hereby granted, provided that the +** above copyright notice and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR +** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +*/ + +#include "Platform.h" +#include "USBAPI.h" +#include "USBDesc.h" + +#if defined(USBCON) +#ifdef HID_ENABLED + +//#define RAWHID_ENABLED + +// Singletons for mouse and keyboard + +Mouse_ Mouse; +Keyboard_ Keyboard; + +//================================================================================ +//================================================================================ + +// HID report descriptor + +#define LSB(_x) ((_x) & 0xFF) +#define MSB(_x) ((_x) >> 8) + +#define RAWHID_USAGE_PAGE 0xFFC0 +#define RAWHID_USAGE 0x0C00 +#define RAWHID_TX_SIZE 64 +#define RAWHID_RX_SIZE 64 + +extern const u8 _hidReportDescriptor[] PROGMEM; +const u8 _hidReportDescriptor[] = { + + // Mouse + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 54 + 0x09, 0x02, // USAGE (Mouse) + 0xa1, 0x01, // COLLECTION (Application) + 0x09, 0x01, // USAGE (Pointer) + 0xa1, 0x00, // COLLECTION (Physical) + 0x85, 0x01, // REPORT_ID (1) + 0x05, 0x09, // USAGE_PAGE (Button) + 0x19, 0x01, // USAGE_MINIMUM (Button 1) + 0x29, 0x03, // USAGE_MAXIMUM (Button 3) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x03, // REPORT_COUNT (3) + 0x75, 0x01, // REPORT_SIZE (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x05, // REPORT_SIZE (5) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x30, // USAGE (X) + 0x09, 0x31, // USAGE (Y) + 0x09, 0x38, // USAGE (Wheel) + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7f, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x03, // REPORT_COUNT (3) + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0xc0, // END_COLLECTION + 0xc0, // END_COLLECTION + + // Keyboard + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 47 + 0x09, 0x06, // USAGE (Keyboard) + 0xa1, 0x01, // COLLECTION (Application) + 0x85, 0x02, // REPORT_ID (2) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x75, 0x01, // REPORT_SIZE (1) + + 0x95, 0x08, // REPORT_COUNT (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + + 0x95, 0x06, // REPORT_COUNT (6) + 0x75, 0x08, // REPORT_SIZE (8) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x65, // LOGICAL_MAXIMUM (101) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) + 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0xc0, // END_COLLECTION + +#if RAWHID_ENABLED + // RAW HID + 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 + 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), + + 0xA1, 0x01, // Collection 0x01 + 0x85, 0x03, // REPORT_ID (3) + 0x75, 0x08, // report size = 8 bits + 0x15, 0x00, // logical minimum = 0 + 0x26, 0xFF, 0x00, // logical maximum = 255 + + 0x95, 64, // report count TX + 0x09, 0x01, // usage + 0x81, 0x02, // Input (array) + + 0x95, 64, // report count RX + 0x09, 0x02, // usage + 0x91, 0x02, // Output (array) + 0xC0 // end collection +#endif +}; + +extern const HIDDescriptor _hidInterface PROGMEM; +const HIDDescriptor _hidInterface = +{ + D_INTERFACE(HID_INTERFACE,1,3,0,0), + D_HIDREPORT(sizeof(_hidReportDescriptor)), + D_ENDPOINT(USB_ENDPOINT_IN (HID_ENDPOINT_INT),USB_ENDPOINT_TYPE_INTERRUPT,0x40,0x01) +}; + +//================================================================================ +//================================================================================ +// Driver + +u8 _hid_protocol = 1; +u8 _hid_idle = 1; + +#define WEAK __attribute__ ((weak)) +#define WEAK + +int WEAK HID_GetInterface(u8* interfaceNum) +{ + interfaceNum[0] += 1; // uses 1 + return USB_SendControl(TRANSFER_PGM,&_hidInterface,sizeof(_hidInterface)); +} + +int WEAK HID_GetDescriptor(int i) +{ + return USB_SendControl(TRANSFER_PGM,_hidReportDescriptor,sizeof(_hidReportDescriptor)); +} + +void WEAK HID_SendReport(u8 id, const void* data, int len) +{ + USB_Send(HID_TX, &id, 1); + USB_Send(HID_TX | TRANSFER_RELEASE,data,len); +} + +bool WEAK HID_Setup(Setup& setup) +{ + u8 r = setup.bRequest; + u8 requestType = setup.bmRequestType; + if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType) + { + if (HID_GET_REPORT == r) + { + //HID_GetReport(); + return true; + } + if (HID_GET_PROTOCOL == r) + { + //Send8(_hid_protocol); // TODO + return true; + } + } + + if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType) + { + if (HID_SET_PROTOCOL == r) + { + _hid_protocol = setup.wValueL; + return true; + } + + if (HID_SET_IDLE == r) + { + _hid_idle = setup.wValueL; + return true; + } + } + return false; +} + +//================================================================================ +//================================================================================ +// Mouse + +Mouse_::Mouse_() : _buttons(0) +{ +} + +void Mouse_::click(uint8_t b) +{ + _buttons = b; + move(0,0,0); + _buttons = 0; + move(0,0,0); +} + +void Mouse_::move(signed char x, signed char y, signed char wheel) +{ + u8 m[4]; + m[0] = _buttons; + m[1] = x; + m[2] = y; + m[3] = wheel; + HID_SendReport(1,m,4); +} + +void Mouse_::buttons(uint8_t b) +{ + if (b != _buttons) + { + _buttons = b; + move(0,0,0); + } +} + +void Mouse_::press(uint8_t b) +{ + buttons(_buttons | b); +} + +void Mouse_::release(uint8_t b) +{ + buttons(_buttons & ~b); +} + +bool Mouse_::isPressed(uint8_t b) +{ + if (b & _buttons > 0) + return true; + return false; +} + +//================================================================================ +//================================================================================ +// Keyboard + +Keyboard_::Keyboard_() : _keyMap(0) +{ +} + +void Keyboard_::sendReport(KeyReport* keys) +{ + HID_SendReport(2,keys,sizeof(KeyReport)); +} + +void Keyboard_::setKeyMap(KeyMap* keyMap) +{ + _keyMap = keyMap; +} + +extern +const uint8_t _asciimap[128] PROGMEM; + +#define SHIFT 0x80 +const uint8_t _asciimap[128] = +{ + 0x00, // NUL + 0x00, // SOH + 0x00, // STX + 0x00, // ETX + 0x00, // EOT + 0x00, // ENQ + 0x00, // ACK + 0x00, // BEL + 0x2a, // BS Backspace + 0x2b, // TAB Tab + 0x28, // LF Enter + 0x00, // VT + 0x00, // FF + 0x00, // CR + 0x00, // SO + 0x00, // SI + 0x00, // DEL + 0x00, // DC1 + 0x00, // DC2 + 0x00, // DC3 + 0x00, // DC4 + 0x00, // NAK + 0x00, // SYN + 0x00, // ETB + 0x00, // CAN + 0x00, // EM + 0x00, // SUB + 0x00, // ESC + 0x00, // FS + 0x00, // GS + 0x00, // RS + 0x00, // US + + 0x2c, // ' ' + 0x1e|SHIFT, // ! + 0x34|SHIFT, // " + 0x20|SHIFT, // # + 0x21|SHIFT, // $ + 0x22|SHIFT, // % + 0x24|SHIFT, // & + 0x34, // ' + 0x26|SHIFT, // ( + 0x27|SHIFT, // ) + 0x25|SHIFT, // * + 0x2e|SHIFT, // + + 0x36, // , + 0x2d, // - + 0x37, // . + 0x38, // / + 0x27, // 0 + 0x1e, // 1 + 0x1f, // 2 + 0x20, // 3 + 0x21, // 4 + 0x22, // 5 + 0x23, // 6 + 0x24, // 7 + 0x25, // 8 + 0x26, // 9 + 0x33|SHIFT, // : + 0x33, // ; + 0x36|SHIFT, // < + 0x2e, // = + 0x37|SHIFT, // > + 0x38|SHIFT, // ? + 0x1f|SHIFT, // @ + 0x04|SHIFT, // A + 0x05|SHIFT, // B + 0x06|SHIFT, // C + 0x07|SHIFT, // D + 0x08|SHIFT, // E + 0x09|SHIFT, // F + 0x0a|SHIFT, // G + 0x0b|SHIFT, // H + 0x0c|SHIFT, // I + 0x0d|SHIFT, // J + 0x0e|SHIFT, // K + 0x0f|SHIFT, // L + 0x10|SHIFT, // M + 0x11|SHIFT, // N + 0x12|SHIFT, // O + 0x13|SHIFT, // P + 0x14|SHIFT, // Q + 0x15|SHIFT, // R + 0x16|SHIFT, // S + 0x17|SHIFT, // T + 0x18|SHIFT, // U + 0x19|SHIFT, // V + 0x1a|SHIFT, // W + 0x1b|SHIFT, // X + 0x1c|SHIFT, // Y + 0x1d|SHIFT, // Z + 0x2f, // [ + 0x31, // bslash + 0x30, // ] + 0x23|SHIFT, // ^ + 0x2d|SHIFT, // _ + 0x35, // ` + 0x04, // a + 0x05, // b + 0x06, // c + 0x07, // d + 0x08, // e + 0x09, // f + 0x0a, // g + 0x0b, // h + 0x0c, // i + 0x0d, // j + 0x0e, // k + 0x0f, // l + 0x10, // m + 0x11, // n + 0x12, // o + 0x13, // p + 0x14, // q + 0x15, // r + 0x16, // s + 0x17, // t + 0x18, // u + 0x19, // v + 0x1a, // w + 0x1b, // x + 0x1c, // y + 0x1d, // z + 0x2f|SHIFT, // + 0x31|SHIFT, // | + 0x30|SHIFT, // } + 0x35|SHIFT, // ~ + 0 // DEL +}; + +uint8_t USBPutChar(uint8_t c); +size_t Keyboard_::write(uint8_t c) +{ + // Keydown + { + KeyReport keys = {0}; + if (_keyMap) + _keyMap->charToKey(c,&keys); + else + { + if (c >= 128) { + setWriteError(); + return 0; + } + c = pgm_read_byte(_asciimap + c); + if (!c) { + setWriteError(); + return 0; + } + if (c & 0x80) + { + keys.modifiers |= KEY_MODIFIER_LEFT_SHIFT; + c &= 0x7F; + } + keys.keys[0] = c; + } + sendReport(&keys); + } + // Keyup + { + KeyReport keys = {0}; + sendReport(&keys); + } + return 1; +} + +#endif + +#endif /* if defined(USBCON) */ \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.cpp new file mode 100644 index 00000000..ebf8b71b --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.cpp @@ -0,0 +1,424 @@ +/* + HardwareSerial.cpp - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + Modified 28 September 2010 by Mark Sproul +*/ + +#include +#include +#include +#include +#include "Arduino.h" +#include "wiring_private.h" + +// this next line disables the entire HardwareSerial.cpp, +// this is so I can support Attiny series and any other chip without a uart +#if defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H) + +#include "HardwareSerial.h" + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +#if (RAMEND < 1000) + #define SERIAL_BUFFER_SIZE 16 +#else + #define SERIAL_BUFFER_SIZE 64 +#endif + +struct ring_buffer +{ + unsigned char buffer[SERIAL_BUFFER_SIZE]; + volatile int head; + volatile int tail; +}; + +#if defined(USBCON) + ring_buffer rx_buffer = { { 0 }, 0, 0}; + ring_buffer tx_buffer = { { 0 }, 0, 0}; +#endif +#if defined(UBRRH) || defined(UBRR0H) + ring_buffer rx_buffer = { { 0 }, 0, 0 }; + ring_buffer tx_buffer = { { 0 }, 0, 0 }; +#endif +#if defined(UBRR1H) + ring_buffer rx_buffer1 = { { 0 }, 0, 0 }; + ring_buffer tx_buffer1 = { { 0 }, 0, 0 }; +#endif +#if defined(UBRR2H) + ring_buffer rx_buffer2 = { { 0 }, 0, 0 }; + ring_buffer tx_buffer2 = { { 0 }, 0, 0 }; +#endif +#if defined(UBRR3H) + ring_buffer rx_buffer3 = { { 0 }, 0, 0 }; + ring_buffer tx_buffer3 = { { 0 }, 0, 0 }; +#endif + +inline void store_char(unsigned char c, ring_buffer *buffer) +{ + int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != buffer->tail) { + buffer->buffer[buffer->head] = c; + buffer->head = i; + } +} + +#if !defined(USART0_RX_vect) && defined(USART1_RX_vect) +// do nothing - on the 32u4 the first USART is USART1 +#else +#if !defined(USART_RX_vect) && !defined(SIG_USART0_RECV) && \ + !defined(SIG_UART0_RECV) && !defined(USART0_RX_vect) && \ + !defined(SIG_UART_RECV) + #error "Don't know what the Data Received vector is called for the first UART" +#else + void serialEvent() __attribute__((weak)); + void serialEvent() {} + #define serialEvent_implemented +#if defined(USART_RX_vect) + SIGNAL(USART_RX_vect) +#elif defined(SIG_USART0_RECV) + SIGNAL(SIG_USART0_RECV) +#elif defined(SIG_UART0_RECV) + SIGNAL(SIG_UART0_RECV) +#elif defined(USART0_RX_vect) + SIGNAL(USART0_RX_vect) +#elif defined(SIG_UART_RECV) + SIGNAL(SIG_UART_RECV) +#endif + { + #if defined(UDR0) + unsigned char c = UDR0; + #elif defined(UDR) + unsigned char c = UDR; + #else + #error UDR not defined + #endif + store_char(c, &rx_buffer); + } +#endif +#endif + +#if defined(USART1_RX_vect) + void serialEvent1() __attribute__((weak)); + void serialEvent1() {} + #define serialEvent1_implemented + SIGNAL(USART1_RX_vect) + { + unsigned char c = UDR1; + store_char(c, &rx_buffer1); + } +#elif defined(SIG_USART1_RECV) + #error SIG_USART1_RECV +#endif + +#if defined(USART2_RX_vect) && defined(UDR2) + void serialEvent2() __attribute__((weak)); + void serialEvent2() {} + #define serialEvent2_implemented + SIGNAL(USART2_RX_vect) + { + unsigned char c = UDR2; + store_char(c, &rx_buffer2); + } +#elif defined(SIG_USART2_RECV) + #error SIG_USART2_RECV +#endif + +#if defined(USART3_RX_vect) && defined(UDR3) + void serialEvent3() __attribute__((weak)); + void serialEvent3() {} + #define serialEvent3_implemented + SIGNAL(USART3_RX_vect) + { + unsigned char c = UDR3; + store_char(c, &rx_buffer3); + } +#elif defined(SIG_USART3_RECV) + #error SIG_USART3_RECV +#endif + +void serialEventRun(void) +{ +#ifdef serialEvent_implemented + if (Serial.available()) serialEvent(); +#endif +#ifdef serialEvent1_implemented + if (Serial1.available()) serialEvent1(); +#endif +#ifdef serialEvent2_implemented + if (Serial2.available()) serialEvent2(); +#endif +#ifdef serialEvent3_implemented + if (Serial3.available()) serialEvent3(); +#endif +} + + +#if !defined(USART0_UDRE_vect) && defined(USART1_UDRE_vect) +// do nothing - on the 32u4 the first USART is USART1 +#else +#if !defined(UART0_UDRE_vect) && !defined(UART_UDRE_vect) && !defined(USART0_UDRE_vect) && !defined(USART_UDRE_vect) + #error "Don't know what the Data Register Empty vector is called for the first UART" +#else +#if defined(UART0_UDRE_vect) +ISR(UART0_UDRE_vect) +#elif defined(UART_UDRE_vect) +ISR(UART_UDRE_vect) +#elif defined(USART0_UDRE_vect) +ISR(USART0_UDRE_vect) +#elif defined(USART_UDRE_vect) +ISR(USART_UDRE_vect) +#endif +{ + if (tx_buffer.head == tx_buffer.tail) { + // Buffer empty, so disable interrupts +#if defined(UCSR0B) + cbi(UCSR0B, UDRIE0); +#else + cbi(UCSRB, UDRIE); +#endif + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer.buffer[tx_buffer.tail]; + tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; + + #if defined(UDR0) + UDR0 = c; + #elif defined(UDR) + UDR = c; + #else + #error UDR not defined + #endif + } +} +#endif +#endif + +#ifdef USART1_UDRE_vect +ISR(USART1_UDRE_vect) +{ + if (tx_buffer1.head == tx_buffer1.tail) { + // Buffer empty, so disable interrupts + cbi(UCSR1B, UDRIE1); + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer1.buffer[tx_buffer1.tail]; + tx_buffer1.tail = (tx_buffer1.tail + 1) % SERIAL_BUFFER_SIZE; + + UDR1 = c; + } +} +#endif + +#ifdef USART2_UDRE_vect +ISR(USART2_UDRE_vect) +{ + if (tx_buffer2.head == tx_buffer2.tail) { + // Buffer empty, so disable interrupts + cbi(UCSR2B, UDRIE2); + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer2.buffer[tx_buffer2.tail]; + tx_buffer2.tail = (tx_buffer2.tail + 1) % SERIAL_BUFFER_SIZE; + + UDR2 = c; + } +} +#endif + +#ifdef USART3_UDRE_vect +ISR(USART3_UDRE_vect) +{ + if (tx_buffer3.head == tx_buffer3.tail) { + // Buffer empty, so disable interrupts + cbi(UCSR3B, UDRIE3); + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer3.buffer[tx_buffer3.tail]; + tx_buffer3.tail = (tx_buffer3.tail + 1) % SERIAL_BUFFER_SIZE; + + UDR3 = c; + } +} +#endif + + +// Constructors //////////////////////////////////////////////////////////////// + +HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer, + volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, + volatile uint8_t *ucsra, volatile uint8_t *ucsrb, + volatile uint8_t *udr, + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x) +{ + _rx_buffer = rx_buffer; + _tx_buffer = tx_buffer; + _ubrrh = ubrrh; + _ubrrl = ubrrl; + _ucsra = ucsra; + _ucsrb = ucsrb; + _udr = udr; + _rxen = rxen; + _txen = txen; + _rxcie = rxcie; + _udrie = udrie; + _u2x = u2x; +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void HardwareSerial::begin(unsigned long baud) +{ + uint16_t baud_setting; + bool use_u2x = true; + +#if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) { + use_u2x = false; + } +#endif + +try_again: + + if (use_u2x) { + *_ucsra = 1 << _u2x; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } else { + *_ucsra = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + + if ((baud_setting > 4095) && use_u2x) + { + use_u2x = false; + goto try_again; + } + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + *_ubrrh = baud_setting >> 8; + *_ubrrl = baud_setting; + + sbi(*_ucsrb, _rxen); + sbi(*_ucsrb, _txen); + sbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); +} + +void HardwareSerial::end() +{ + // wait for transmission of outgoing data + while (_tx_buffer->head != _tx_buffer->tail) + ; + + cbi(*_ucsrb, _rxen); + cbi(*_ucsrb, _txen); + cbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); + + // clear any received data + _rx_buffer->head = _rx_buffer->tail; +} + +int HardwareSerial::available(void) +{ + return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE; +} + +int HardwareSerial::peek(void) +{ + if (_rx_buffer->head == _rx_buffer->tail) { + return -1; + } else { + return _rx_buffer->buffer[_rx_buffer->tail]; + } +} + +int HardwareSerial::read(void) +{ + // if the head isn't ahead of the tail, we don't have any characters + if (_rx_buffer->head == _rx_buffer->tail) { + return -1; + } else { + unsigned char c = _rx_buffer->buffer[_rx_buffer->tail]; + _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE; + return c; + } +} + +void HardwareSerial::flush() +{ + while (_tx_buffer->head != _tx_buffer->tail) + ; +} + +size_t HardwareSerial::write(uint8_t c) +{ + int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE; + + // If the output buffer is full, there's nothing for it other than to + // wait for the interrupt handler to empty it a bit + // ???: return 0 here instead? + while (i == _tx_buffer->tail) + ; + + _tx_buffer->buffer[_tx_buffer->head] = c; + _tx_buffer->head = i; + + sbi(*_ucsrb, _udrie); + + return 1; +} + +// Preinstantiate Objects ////////////////////////////////////////////////////// + +#if defined(UBRRH) && defined(UBRRL) + HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X); +#elif defined(UBRR0H) && defined(UBRR0L) + HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRIE0, U2X0); +#elif defined(USBCON) + // do nothing - Serial object and buffers are initialized in CDC code +#else + #error no serial port defined (port 0) +#endif + +#if defined(UBRR1H) + HardwareSerial Serial1(&rx_buffer1, &tx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRIE1, U2X1); +#endif +#if defined(UBRR2H) + HardwareSerial Serial2(&rx_buffer2, &tx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRIE2, U2X2); +#endif +#if defined(UBRR3H) + HardwareSerial Serial3(&rx_buffer3, &tx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); +#endif + +#endif // whole file + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.h b/Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.h new file mode 100644 index 00000000..f25636d2 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/HardwareSerial.h @@ -0,0 +1,80 @@ +/* + HardwareSerial.h - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 28 September 2010 by Mark Sproul +*/ + +#ifndef HardwareSerial_h +#define HardwareSerial_h + +#include + +#include "Stream.h" + +struct ring_buffer; + +class HardwareSerial : public Stream +{ + private: + ring_buffer *_rx_buffer; + ring_buffer *_tx_buffer; + volatile uint8_t *_ubrrh; + volatile uint8_t *_ubrrl; + volatile uint8_t *_ucsra; + volatile uint8_t *_ucsrb; + volatile uint8_t *_udr; + uint8_t _rxen; + uint8_t _txen; + uint8_t _rxcie; + uint8_t _udrie; + uint8_t _u2x; + public: + HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer, + volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, + volatile uint8_t *ucsra, volatile uint8_t *ucsrb, + volatile uint8_t *udr, + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x); + void begin(unsigned long); + void end(); + virtual int available(void); + virtual int peek(void); + virtual int read(void); + virtual void flush(void); + virtual size_t write(uint8_t); + using Print::write; // pull in write(str) and write(buf, size) from Print +}; + +#if defined(UBRRH) || defined(UBRR0H) + extern HardwareSerial Serial; +#elif defined(USBCON) + #include "USBAPI.h" +// extern HardwareSerial Serial_; +#endif +#if defined(UBRR1H) + extern HardwareSerial Serial1; +#endif +#if defined(UBRR2H) + extern HardwareSerial Serial2; +#endif +#if defined(UBRR3H) + extern HardwareSerial Serial3; +#endif + +extern void serialEventRun(void) __attribute__((weak)); + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.cpp new file mode 100644 index 00000000..210d89ab --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.cpp @@ -0,0 +1,56 @@ + +#include +#include + +IPAddress::IPAddress() +{ + memset(_address, 0, sizeof(_address)); +} + +IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) +{ + _address[0] = first_octet; + _address[1] = second_octet; + _address[2] = third_octet; + _address[3] = fourth_octet; +} + +IPAddress::IPAddress(uint32_t address) +{ + memcpy(_address, &address, sizeof(_address)); +} + +IPAddress::IPAddress(const uint8_t *address) +{ + memcpy(_address, address, sizeof(_address)); +} + +IPAddress& IPAddress::operator=(const uint8_t *address) +{ + memcpy(_address, address, sizeof(_address)); + return *this; +} + +IPAddress& IPAddress::operator=(uint32_t address) +{ + memcpy(_address, (const uint8_t *)&address, sizeof(_address)); + return *this; +} + +bool IPAddress::operator==(const uint8_t* addr) +{ + return memcmp(addr, _address, sizeof(_address)) == 0; +} + +size_t IPAddress::printTo(Print& p) const +{ + size_t n = 0; + for (int i =0; i < 3; i++) + { + n += p.print(_address[i], DEC); + n += p.print('.'); + } + n += p.print(_address[3], DEC); + return n; +} + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.h b/Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.h new file mode 100644 index 00000000..51dbb564 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/IPAddress.h @@ -0,0 +1,76 @@ +/* + * + * MIT License: + * Copyright (c) 2011 Adrian McEwen + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * adrianm@mcqn.com 1/1/2011 + */ + +#ifndef IPAddress_h +#define IPAddress_h + +#include + +// A class to make it easier to handle and pass around IP addresses + +class IPAddress : public Printable { +private: + uint8_t _address[4]; // IPv4 address + // Access the raw byte array containing the address. Because this returns a pointer + // to the internal structure rather than a copy of the address this function should only + // be used when you know that the usage of the returned uint8_t* will be transient and not + // stored. + uint8_t* raw_address() { return _address; }; + +public: + // Constructors + IPAddress(); + IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet); + IPAddress(uint32_t address); + IPAddress(const uint8_t *address); + + // Overloaded cast operator to allow IPAddress objects to be used where a pointer + // to a four-byte uint8_t array is expected + operator uint32_t() { return *((uint32_t*)_address); }; + bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); }; + bool operator==(const uint8_t* addr); + + // Overloaded index operator to allow getting and setting individual octets of the address + uint8_t operator[](int index) const { return _address[index]; }; + uint8_t& operator[](int index) { return _address[index]; }; + + // Overloaded copy operators to allow initialisation of IPAddress objects from other types + IPAddress& operator=(const uint8_t *address); + IPAddress& operator=(uint32_t address); + + virtual size_t printTo(Print& p) const; + + friend class EthernetClass; + friend class UDP; + friend class Client; + friend class Server; + friend class DhcpClass; + friend class DNSClient; +}; + +const IPAddress INADDR_NONE(0,0,0,0); + + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Platform.h b/Micropendous/Firmware/Arduino1/cores/arduino/Platform.h new file mode 100644 index 00000000..3efcd8dc --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Platform.h @@ -0,0 +1,23 @@ + +#ifndef __PLATFORM_H__ +#define __PLATFORM_H__ + +#include +#include +#include +#include +#include + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; + +#include "Arduino.h" + +#if defined(USBCON) + #include "USBDesc.h" + #include "USBCore.h" + #include "USBAPI.h" +#endif /* if defined(USBCON) */ + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Print.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/Print.cpp new file mode 100644 index 00000000..a48b856e --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Print.cpp @@ -0,0 +1,263 @@ +/* + Print.cpp - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + */ + +#include +#include +#include +#include +#include "Arduino.h" + +#include "Print.h" + +// Public Methods ////////////////////////////////////////////////////////////// + +/* default implementation: may be overridden */ +size_t Print::write(const uint8_t *buffer, size_t size) +{ + size_t n = 0; + while (size--) { + n += write(*buffer++); + } + return n; +} + +size_t Print::print(const __FlashStringHelper *ifsh) +{ + const prog_char *p = (const prog_char *)ifsh; + size_t n = 0; + while (1) { + unsigned char c = pgm_read_byte(p++); + if (c == 0) break; + n += write(c); + } + return n; +} + +size_t Print::print(const String &s) +{ + size_t n = 0; + for (uint16_t i = 0; i < s.length(); i++) { + n += write(s[i]); + } + return n; +} + +size_t Print::print(const char str[]) +{ + return write(str); +} + +size_t Print::print(char c) +{ + return write(c); +} + +size_t Print::print(unsigned char b, int base) +{ + return print((unsigned long) b, base); +} + +size_t Print::print(int n, int base) +{ + return print((long) n, base); +} + +size_t Print::print(unsigned int n, int base) +{ + return print((unsigned long) n, base); +} + +size_t Print::print(long n, int base) +{ + if (base == 0) { + return write(n); + } else if (base == 10) { + if (n < 0) { + int t = print('-'); + n = -n; + return printNumber(n, 10) + t; + } + return printNumber(n, 10); + } else { + return printNumber(n, base); + } +} + +size_t Print::print(unsigned long n, int base) +{ + if (base == 0) return write(n); + else return printNumber(n, base); +} + +size_t Print::print(double n, int digits) +{ + return printFloat(n, digits); +} + +size_t Print::println(const __FlashStringHelper *ifsh) +{ + size_t n = print(ifsh); + n += println(); + return n; +} + +size_t Print::print(const Printable& x) +{ + return x.printTo(*this); +} + +size_t Print::println(void) +{ + size_t n = print('\r'); + n += print('\n'); + return n; +} + +size_t Print::println(const String &s) +{ + size_t n = print(s); + n += println(); + return n; +} + +size_t Print::println(const char c[]) +{ + size_t n = print(c); + n += println(); + return n; +} + +size_t Print::println(char c) +{ + size_t n = print(c); + n += println(); + return n; +} + +size_t Print::println(unsigned char b, int base) +{ + size_t n = print(b, base); + n += println(); + return n; +} + +size_t Print::println(int num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(unsigned int num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(long num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(unsigned long num, int base) +{ + size_t n = print(num, base); + n += println(); + return n; +} + +size_t Print::println(double num, int digits) +{ + size_t n = print(num, digits); + n += println(); + return n; +} + +size_t Print::println(const Printable& x) +{ + size_t n = print(x); + n += println(); + return n; +} + +// Private Methods ///////////////////////////////////////////////////////////// + +size_t Print::printNumber(unsigned long n, uint8_t base) { + char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. + char *str = &buf[sizeof(buf) - 1]; + + *str = '\0'; + + // prevent crash if called with base == 1 + if (base < 2) base = 10; + + do { + unsigned long m = n; + n /= base; + char c = m - base * n; + *--str = c < 10 ? c + '0' : c + 'A' - 10; + } while(n); + + return write(str); +} + +size_t Print::printFloat(double number, uint8_t digits) +{ + size_t n = 0; + + // Handle negative numbers + if (number < 0.0) + { + n += print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i=0; i 0) { + n += print("."); + } + + // Extract digits from the remainder one at a time + while (digits-- > 0) + { + remainder *= 10.0; + int toPrint = int(remainder); + n += print(toPrint); + remainder -= toPrint; + } + + return n; +} diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Print.h b/Micropendous/Firmware/Arduino1/cores/arduino/Print.h new file mode 100644 index 00000000..0bcad239 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Print.h @@ -0,0 +1,78 @@ +/* + Print.h - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Print_h +#define Print_h + +#include +#include // for size_t + +#include "WString.h" +#include "Printable.h" + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +class Print +{ + private: + int write_error; + size_t printNumber(unsigned long, uint8_t); + size_t printFloat(double, uint8_t); + protected: + void setWriteError(int err = 1) { write_error = err; } + public: + Print() : write_error(0) {} + + int getWriteError() { return write_error; } + void clearWriteError() { setWriteError(0); } + + virtual size_t write(uint8_t) = 0; + size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); } + virtual size_t write(const uint8_t *buffer, size_t size); + + size_t print(const __FlashStringHelper *); + size_t print(const String &); + size_t print(const char[]); + size_t print(char); + size_t print(unsigned char, int = DEC); + size_t print(int, int = DEC); + size_t print(unsigned int, int = DEC); + size_t print(long, int = DEC); + size_t print(unsigned long, int = DEC); + size_t print(double, int = 2); + size_t print(const Printable&); + + size_t println(const __FlashStringHelper *); + size_t println(const String &s); + size_t println(const char[]); + size_t println(char); + size_t println(unsigned char, int = DEC); + size_t println(int, int = DEC); + size_t println(unsigned int, int = DEC); + size_t println(long, int = DEC); + size_t println(unsigned long, int = DEC); + size_t println(double, int = 2); + size_t println(const Printable&); + size_t println(void); +}; + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Printable.h b/Micropendous/Firmware/Arduino1/cores/arduino/Printable.h new file mode 100644 index 00000000..c09ba2f7 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Printable.h @@ -0,0 +1,40 @@ +/* + Printable.h - Interface class that allows printing of complex types + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Printable_h +#define Printable_h + +#include + +class Print; + +/** The Printable class provides a way for new classes to allow themselves to be printed. + By deriving from Printable and implementing the printTo method, it will then be possible + for users to print out instances of this class by passing them into the usual + Print::print and Print::println methods. +*/ + +class Printable +{ + public: + virtual size_t printTo(Print& p) const = 0; +}; + +#endif + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Server.h b/Micropendous/Firmware/Arduino1/cores/arduino/Server.h new file mode 100644 index 00000000..f571214c --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Server.h @@ -0,0 +1,9 @@ +#ifndef server_h +#define server_h + +class Server : public Print { +public: + virtual void begin() =0; +}; + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Stream.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/Stream.cpp new file mode 100644 index 00000000..5203a095 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Stream.cpp @@ -0,0 +1,243 @@ +/* + Stream.cpp - adds parsing methods to Stream class + Copyright (c) 2008 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Created July 2011 + parsing functions based on TextFinder library by Michael Margolis + */ + +#include "Arduino.h" +#include "Stream.h" + +#define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait +#define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field + +// private method to read stream with timeout +int Stream::timedRead() +{ + int c; + _startMillis = millis(); + do { + c = read(); + if (c >= 0) return c; + } while(millis() - _startMillis < _timeout); + return -1; // -1 indicates timeout +} + +// private method to peek stream with timeout +int Stream::timedPeek() +{ + int c; + _startMillis = millis(); + do { + c = peek(); + if (c >= 0) return c; + } while(millis() - _startMillis < _timeout); + return -1; // -1 indicates timeout +} + +// returns peek of the next digit in the stream or -1 if timeout +// discards non-numeric characters +int Stream::peekNextDigit() +{ + int c; + while (1) { + c = timedPeek(); + if (c < 0) return c; // timeout + if (c == '-') return c; + if (c >= '0' && c <= '9') return c; + read(); // discard non-numeric + } +} + +// Public Methods +////////////////////////////////////////////////////////////// + +void Stream::setTimeout(unsigned long timeout) // sets the maximum number of milliseconds to wait +{ + _timeout = timeout; +} + + // find returns true if the target string is found +bool Stream::find(char *target) +{ + return findUntil(target, NULL); +} + +// reads data from the stream until the target string of given length is found +// returns true if target string is found, false if timed out +bool Stream::find(char *target, size_t length) +{ + return findUntil(target, length, NULL, 0); +} + +// as find but search ends if the terminator string is found +bool Stream::findUntil(char *target, char *terminator) +{ + return findUntil(target, strlen(target), terminator, strlen(terminator)); +} + +// reads data from the stream until the target string of the given length is found +// search terminated if the terminator string is found +// returns true if target string is found, false if terminated or timed out +bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen) +{ + size_t index = 0; // maximum target string length is 64k bytes! + size_t termIndex = 0; + int c; + + if( *target == 0) + return true; // return true if target is a null string + while( (c = timedRead()) > 0){ + if( c == target[index]){ + //////Serial.print("found "); Serial.write(c); Serial.print("index now"); Serial.println(index+1); + if(++index >= targetLen){ // return true if all chars in the target match + return true; + } + } + else{ + index = 0; // reset index if any char does not match + } + if(termLen > 0 && c == terminator[termIndex]){ + if(++termIndex >= termLen) + return false; // return false if terminate string found before target string + } + else + termIndex = 0; + } + return false; +} + + +// returns the first valid (long) integer value from the current position. +// initial characters that are not digits (or the minus sign) are skipped +// function is terminated by the first character that is not a digit. +long Stream::parseInt() +{ + return parseInt(NO_SKIP_CHAR); // terminate on first non-digit character (or timeout) +} + +// as above but a given skipChar is ignored +// this allows format characters (typically commas) in values to be ignored +long Stream::parseInt(char skipChar) +{ + boolean isNegative = false; + long value = 0; + int c; + + c = peekNextDigit(); + // ignore non numeric leading characters + if(c < 0) + return 0; // zero returned if timeout + + do{ + if(c == skipChar) + ; // ignore this charactor + else if(c == '-') + isNegative = true; + else if(c >= '0' && c <= '9') // is c a digit? + value = value * 10 + c - '0'; + read(); // consume the character we got with peek + c = timedPeek(); + } + while( (c >= '0' && c <= '9') || c == skipChar ); + + if(isNegative) + value = -value; + return value; +} + + +// as parseInt but returns a floating point value +float Stream::parseFloat() +{ + return parseFloat(NO_SKIP_CHAR); +} + +// as above but the given skipChar is ignored +// this allows format characters (typically commas) in values to be ignored +float Stream::parseFloat(char skipChar){ + boolean isNegative = false; + boolean isFraction = false; + long value = 0; + char c; + float fraction = 1.0; + + c = peekNextDigit(); + // ignore non numeric leading characters + if(c < 0) + return 0; // zero returned if timeout + + do{ + if(c == skipChar) + ; // ignore + else if(c == '-') + isNegative = true; + else if (c == '.') + isFraction = true; + else if(c >= '0' && c <= '9') { // is c a digit? + value = value * 10 + c - '0'; + if(isFraction) + fraction *= 0.1; + } + read(); // consume the character we got with peek + c = timedPeek(); + } + while( (c >= '0' && c <= '9') || c == '.' || c == skipChar ); + + if(isNegative) + value = -value; + if(isFraction) + return value * fraction; + else + return value; +} + +// read characters from stream into buffer +// terminates if length characters have been read, null is detected or timeout (see setTimeout) +// returns the number of characters placed in the buffer (0 means no valid data found) +int Stream::readBytes( char *buffer, size_t length) +{ + return readBytesUntil( 0, buffer, length); +} + + +// as readBytes with terminator character +// terminates if length characters have been read, timeout, or if the terminator character detected +// returns the number of characters placed in the buffer (0 means no valid data found) + +int Stream::readBytesUntil( char terminator, char *buffer, size_t length) +{ + unsigned int index = 0; + *buffer = 0; + while(index < length-1 ){ + int c = timedRead(); + if( c <= 0 ){ + return 0; // timeout returns 0 ! + } + else if( c == terminator){ + buffer[index] = 0; // terminate the string + return index; // data got successfully + } + else{ + buffer[index++] = (char)c; + } + } + buffer[index] = 0; + return index; // here if buffer is full before detecting the terminator +} + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Stream.h b/Micropendous/Firmware/Arduino1/cores/arduino/Stream.h new file mode 100644 index 00000000..757d8c6b --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Stream.h @@ -0,0 +1,94 @@ +/* + Stream.h - base class for character-based streams. + Copyright (c) 2010 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + parsing functions based on TextFinder library by Michael Margolis +*/ + +#ifndef Stream_h +#define Stream_h + +#include +#include "Print.h" + +// compatability macros for testing +/* +#define getInt() parseInt() +#define getInt(skipChar) parseInt(skipchar) +#define getFloat() parseFloat() +#define getFloat(skipChar) parseFloat(skipChar) +#define getString( pre_string, post_string, buffer, length) +readBytesBetween( pre_string, terminator, buffer, length) +*/ + +class Stream : public Print +{ + private: + unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read + unsigned long _startMillis; // used for timeout measurement + int timedRead(); // private method to read stream with timeout + int timedPeek(); // private method to peek stream with timeout + int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout + + public: + virtual int available() = 0; + virtual int read() = 0; + virtual int peek() = 0; + virtual void flush() = 0; + + Stream() {_timeout=1000;} + +// parsing methods + + void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second + + bool find(char *target); // reads data from the stream until the target string is found + // returns true if target string is found, false if timed out (see setTimeout) + + bool find(char *target, size_t length); // reads data from the stream until the target string of given length is found + // returns true if target string is found, false if timed out + + bool findUntil(char *target, char *terminator); // as find but search ends if the terminator string is found + + bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen); // as above but search ends if the terminate string is found + + + long parseInt(); // returns the first valid (long) integer value from the current position. + // initial characters that are not digits (or the minus sign) are skipped + // integer is terminated by the first character that is not a digit. + + long parseInt(char skipChar); // as above but the given skipChar is ignored + // as above but the given skipChar is ignored + // this allows format characters (typically commas) in values to be ignored + + float parseFloat(); // float version of parseInt + + float parseFloat(char skipChar); // as above but the given skipChar is ignored + + int readBytes( char *buffer, size_t length); // read chars from stream into buffer + // terminates if length characters have been read or timeout (see setTimeout) + // returns the number of characters placed in the buffer (0 means no valid data found) + + int readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character + // terminates if length characters have been read, timeout, or if the terminator character detected + // returns the number of characters placed in the buffer (0 means no valid data found) + + // Arduino String functions to be added here + +}; + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Tone.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/Tone.cpp new file mode 100644 index 00000000..1c68bea0 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Tone.cpp @@ -0,0 +1,601 @@ +/* Tone.cpp + + A Tone Generator Library + + Written by Brett Hagman + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Version Modified By Date Comments +------- ----------- -------- -------- +0001 B Hagman 09/08/02 Initial coding +0002 B Hagman 09/08/18 Multiple pins +0003 B Hagman 09/08/18 Moved initialization from constructor to begin() +0004 B Hagman 09/09/26 Fixed problems with ATmega8 +0005 B Hagman 09/11/23 Scanned prescalars for best fit on 8 bit timers + 09/11/25 Changed pin toggle method to XOR + 09/11/25 Fixed timer0 from being excluded +0006 D Mellis 09/12/29 Replaced objects with functions +0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register +*************************************************/ + +#include +#include +#include "Arduino.h" +#include "pins_arduino.h" + +#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) +#define TCCR2A TCCR2 +#define TCCR2B TCCR2 +#define COM2A1 COM21 +#define COM2A0 COM20 +#define OCR2A OCR2 +#define TIMSK2 TIMSK +#define OCIE2A OCIE2 +#define TIMER2_COMPA_vect TIMER2_COMP_vect +#define TIMSK1 TIMSK +#endif + +// timerx_toggle_count: +// > 0 - duration specified +// = 0 - stopped +// < 0 - infinitely (until stop() method called, or new play() called) + +#if !defined(__AVR_ATmega8__) +volatile long timer0_toggle_count; +volatile uint8_t *timer0_pin_port; +volatile uint8_t timer0_pin_mask; +#endif + +volatile long timer1_toggle_count; +volatile uint8_t *timer1_pin_port; +volatile uint8_t timer1_pin_mask; +volatile long timer2_toggle_count; +volatile uint8_t *timer2_pin_port; +volatile uint8_t timer2_pin_mask; + +#if defined(TIMSK3) +volatile long timer3_toggle_count; +volatile uint8_t *timer3_pin_port; +volatile uint8_t timer3_pin_mask; +#endif + +#if defined(TIMSK4) +volatile long timer4_toggle_count; +volatile uint8_t *timer4_pin_port; +volatile uint8_t timer4_pin_mask; +#endif + +#if defined(TIMSK5) +volatile long timer5_toggle_count; +volatile uint8_t *timer5_pin_port; +volatile uint8_t timer5_pin_mask; +#endif + + +// MLS: This does not make sense, the 3 options are the same +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + +#define AVAILABLE_TONE_PINS 1 + +const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 3, 4, 5, 1, 0 */ }; +static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ }; + +#elif defined(__AVR_ATmega8__) + +#define AVAILABLE_TONE_PINS 1 + +const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ }; +static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ }; + +#else + +#define AVAILABLE_TONE_PINS 1 + +// Leave timer 0 to last. +const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ }; +static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ }; + +#endif + + + +static int8_t toneBegin(uint8_t _pin) +{ + int8_t _timer = -1; + + // if we're already using the pin, the timer should be configured. + for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { + if (tone_pins[i] == _pin) { + return pgm_read_byte(tone_pin_to_timer_PGM + i); + } + } + + // search for an unused timer. + for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { + if (tone_pins[i] == 255) { + tone_pins[i] = _pin; + _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); + break; + } + } + + if (_timer != -1) + { + // Set timer specific stuff + // All timers in CTC mode + // 8 bit timers will require changing prescalar values, + // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar + switch (_timer) + { + #if defined(TCCR0A) && defined(TCCR0B) + case 0: + // 8 bit timer + TCCR0A = 0; + TCCR0B = 0; + bitWrite(TCCR0A, WGM01, 1); + bitWrite(TCCR0B, CS00, 1); + timer0_pin_port = portOutputRegister(digitalPinToPort(_pin)); + timer0_pin_mask = digitalPinToBitMask(_pin); + break; + #endif + + #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12) + case 1: + // 16 bit timer + TCCR1A = 0; + TCCR1B = 0; + bitWrite(TCCR1B, WGM12, 1); + bitWrite(TCCR1B, CS10, 1); + timer1_pin_port = portOutputRegister(digitalPinToPort(_pin)); + timer1_pin_mask = digitalPinToBitMask(_pin); + break; + #endif + + #if defined(TCCR2A) && defined(TCCR2B) + case 2: + // 8 bit timer + TCCR2A = 0; + TCCR2B = 0; + bitWrite(TCCR2A, WGM21, 1); + bitWrite(TCCR2B, CS20, 1); + timer2_pin_port = portOutputRegister(digitalPinToPort(_pin)); + timer2_pin_mask = digitalPinToBitMask(_pin); + break; + #endif + + #if defined(TCCR3A) && defined(TCCR3B) && defined(TIMSK3) + case 3: + // 16 bit timer + TCCR3A = 0; + TCCR3B = 0; + bitWrite(TCCR3B, WGM32, 1); + bitWrite(TCCR3B, CS30, 1); + timer3_pin_port = portOutputRegister(digitalPinToPort(_pin)); + timer3_pin_mask = digitalPinToBitMask(_pin); + break; + #endif + + #if defined(TCCR4A) && defined(TCCR4B) && defined(TIMSK4) + case 4: + // 16 bit timer + TCCR4A = 0; + TCCR4B = 0; + #if defined(WGM42) + bitWrite(TCCR4B, WGM42, 1); + #elif defined(CS43) + #warning this may not be correct + // atmega32u4 + bitWrite(TCCR4B, CS43, 1); + #endif + bitWrite(TCCR4B, CS40, 1); + timer4_pin_port = portOutputRegister(digitalPinToPort(_pin)); + timer4_pin_mask = digitalPinToBitMask(_pin); + break; + #endif + + #if defined(TCCR5A) && defined(TCCR5B) && defined(TIMSK5) + case 5: + // 16 bit timer + TCCR5A = 0; + TCCR5B = 0; + bitWrite(TCCR5B, WGM52, 1); + bitWrite(TCCR5B, CS50, 1); + timer5_pin_port = portOutputRegister(digitalPinToPort(_pin)); + timer5_pin_mask = digitalPinToBitMask(_pin); + break; + #endif + } + } + + return _timer; +} + + + +// frequency (in hertz) and duration (in milliseconds). + +void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) +{ + uint8_t prescalarbits = 0b001; + long toggle_count = 0; + uint32_t ocr = 0; + int8_t _timer; + + _timer = toneBegin(_pin); + + if (_timer >= 0) + { + // Set the pinMode as OUTPUT + pinMode(_pin, OUTPUT); + + // if we are using an 8 bit timer, scan through prescalars to find the best fit + if (_timer == 0 || _timer == 2) + { + ocr = F_CPU / frequency / 2 - 1; + prescalarbits = 0b001; // ck/1: same for both timers + if (ocr > 255) + { + ocr = F_CPU / frequency / 2 / 8 - 1; + prescalarbits = 0b010; // ck/8: same for both timers + + if (_timer == 2 && ocr > 255) + { + ocr = F_CPU / frequency / 2 / 32 - 1; + prescalarbits = 0b011; + } + + if (ocr > 255) + { + ocr = F_CPU / frequency / 2 / 64 - 1; + prescalarbits = _timer == 0 ? 0b011 : 0b100; + + if (_timer == 2 && ocr > 255) + { + ocr = F_CPU / frequency / 2 / 128 - 1; + prescalarbits = 0b101; + } + + if (ocr > 255) + { + ocr = F_CPU / frequency / 2 / 256 - 1; + prescalarbits = _timer == 0 ? 0b100 : 0b110; + if (ocr > 255) + { + // can't do any better than /1024 + ocr = F_CPU / frequency / 2 / 1024 - 1; + prescalarbits = _timer == 0 ? 0b101 : 0b111; + } + } + } + } + +#if defined(TCCR0B) + if (_timer == 0) + { + TCCR0B = prescalarbits; + } + else +#endif +#if defined(TCCR2B) + { + TCCR2B = prescalarbits; + } +#else + { + // dummy place holder to make the above ifdefs work + } +#endif + } + else + { + // two choices for the 16 bit timers: ck/1 or ck/64 + ocr = F_CPU / frequency / 2 - 1; + + prescalarbits = 0b001; + if (ocr > 0xffff) + { + ocr = F_CPU / frequency / 2 / 64 - 1; + prescalarbits = 0b011; + } + + if (_timer == 1) + { +#if defined(TCCR1B) + TCCR1B = (TCCR1B & 0b11111000) | prescalarbits; +#endif + } +#if defined(TCCR3B) + else if (_timer == 3) + TCCR3B = (TCCR3B & 0b11111000) | prescalarbits; +#endif +#if defined(TCCR4B) + else if (_timer == 4) + TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; +#endif +#if defined(TCCR5B) + else if (_timer == 5) + TCCR5B = (TCCR5B & 0b11111000) | prescalarbits; +#endif + + } + + + // Calculate the toggle count + if (duration > 0) + { + toggle_count = 2 * frequency * duration / 1000; + } + else + { + toggle_count = -1; + } + + // Set the OCR for the given timer, + // set the toggle count, + // then turn on the interrupts + switch (_timer) + { + +#if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A) + case 0: + OCR0A = ocr; + timer0_toggle_count = toggle_count; + bitWrite(TIMSK0, OCIE0A, 1); + break; +#endif + + case 1: +#if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A) + OCR1A = ocr; + timer1_toggle_count = toggle_count; + bitWrite(TIMSK1, OCIE1A, 1); +#elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A) + // this combination is for at least the ATmega32 + OCR1A = ocr; + timer1_toggle_count = toggle_count; + bitWrite(TIMSK, OCIE1A, 1); +#endif + break; + +#if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A) + case 2: + OCR2A = ocr; + timer2_toggle_count = toggle_count; + bitWrite(TIMSK2, OCIE2A, 1); + break; +#endif + +#if defined(TIMSK3) + case 3: + OCR3A = ocr; + timer3_toggle_count = toggle_count; + bitWrite(TIMSK3, OCIE3A, 1); + break; +#endif + +#if defined(TIMSK4) + case 4: + OCR4A = ocr; + timer4_toggle_count = toggle_count; + bitWrite(TIMSK4, OCIE4A, 1); + break; +#endif + +#if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A) + case 5: + OCR5A = ocr; + timer5_toggle_count = toggle_count; + bitWrite(TIMSK5, OCIE5A, 1); + break; +#endif + + } + } +} + + +// XXX: this function only works properly for timer 2 (the only one we use +// currently). for the others, it should end the tone, but won't restore +// proper PWM functionality for the timer. +void disableTimer(uint8_t _timer) +{ + switch (_timer) + { + case 0: + #if defined(TIMSK0) + TIMSK0 = 0; + #elif defined(TIMSK) + TIMSK = 0; // atmega32 + #endif + break; + +#if defined(TIMSK1) && defined(OCIE1A) + case 1: + bitWrite(TIMSK1, OCIE1A, 0); + break; +#endif + + case 2: + #if defined(TIMSK2) && defined(OCIE2A) + bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt + #endif + #if defined(TCCR2A) && defined(WGM20) + TCCR2A = (1 << WGM20); + #endif + #if defined(TCCR2B) && defined(CS22) + TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22); + #endif + #if defined(OCR2A) + OCR2A = 0; + #endif + break; + +#if defined(TIMSK3) + case 3: + TIMSK3 = 0; + break; +#endif + +#if defined(TIMSK4) + case 4: + TIMSK4 = 0; + break; +#endif + +#if defined(TIMSK5) + case 5: + TIMSK5 = 0; + break; +#endif + } +} + + +void noTone(uint8_t _pin) +{ + int8_t _timer = -1; + + for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { + if (tone_pins[i] == _pin) { + _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); + tone_pins[i] = 255; + } + } + + disableTimer(_timer); + + digitalWrite(_pin, 0); +} + +#if 0 +#if !defined(__AVR_ATmega8__) +ISR(TIMER0_COMPA_vect) +{ + if (timer0_toggle_count != 0) + { + // toggle the pin + *timer0_pin_port ^= timer0_pin_mask; + + if (timer0_toggle_count > 0) + timer0_toggle_count--; + } + else + { + disableTimer(0); + *timer0_pin_port &= ~(timer0_pin_mask); // keep pin low after stop + } +} +#endif + + +ISR(TIMER1_COMPA_vect) +{ + if (timer1_toggle_count != 0) + { + // toggle the pin + *timer1_pin_port ^= timer1_pin_mask; + + if (timer1_toggle_count > 0) + timer1_toggle_count--; + } + else + { + disableTimer(1); + *timer1_pin_port &= ~(timer1_pin_mask); // keep pin low after stop + } +} +#endif + + +ISR(TIMER2_COMPA_vect) +{ + + if (timer2_toggle_count != 0) + { + // toggle the pin + *timer2_pin_port ^= timer2_pin_mask; + + if (timer2_toggle_count > 0) + timer2_toggle_count--; + } + else + { + // need to call noTone() so that the tone_pins[] entry is reset, so the + // timer gets initialized next time we call tone(). + // XXX: this assumes timer 2 is always the first one used. + noTone(tone_pins[0]); +// disableTimer(2); +// *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop + } +} + + + +//#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#if 0 + +ISR(TIMER3_COMPA_vect) +{ + if (timer3_toggle_count != 0) + { + // toggle the pin + *timer3_pin_port ^= timer3_pin_mask; + + if (timer3_toggle_count > 0) + timer3_toggle_count--; + } + else + { + disableTimer(3); + *timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop + } +} + +ISR(TIMER4_COMPA_vect) +{ + if (timer4_toggle_count != 0) + { + // toggle the pin + *timer4_pin_port ^= timer4_pin_mask; + + if (timer4_toggle_count > 0) + timer4_toggle_count--; + } + else + { + disableTimer(4); + *timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop + } +} + +ISR(TIMER5_COMPA_vect) +{ + if (timer5_toggle_count != 0) + { + // toggle the pin + *timer5_pin_port ^= timer5_pin_mask; + + if (timer5_toggle_count > 0) + timer5_toggle_count--; + } + else + { + disableTimer(5); + *timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop + } +} + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/USBAPI.h b/Micropendous/Firmware/Arduino1/cores/arduino/USBAPI.h new file mode 100644 index 00000000..7dee14da --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/USBAPI.h @@ -0,0 +1,166 @@ + + +#ifndef __USBAPI__ +#define __USBAPI__ + +#if defined(USBCON) + +//================================================================================ +//================================================================================ +// USB + +class USB_ +{ +public: + USB_(); + bool configured(); + + void attach(); + void detach(); // Serial port goes down too... + void poll(); +}; +extern USB_ USB; + +//================================================================================ +//================================================================================ +// Serial over CDC (Serial1 is the physical port) + +class Serial_ : public Stream +{ +public: + void begin(uint16_t baud_count); + void end(void); + + virtual int available(void); + virtual int peek(void); + virtual int read(void); + virtual void flush(void); + virtual size_t write(uint8_t); +}; +extern Serial_ Serial; + +//================================================================================ +//================================================================================ +// Mouse + +#define MOUSE_LEFT 1 +#define MOUSE_RIGHT 2 +#define MOUSE_MIDDLE 4 +#define MOUSE_ALL (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE) + +class Mouse_ +{ +private: + uint8_t _buttons; + void buttons(uint8_t b); +public: + Mouse_(); + void click(uint8_t b = MOUSE_LEFT); + void move(signed char x, signed char y, signed char wheel = 0); + void press(uint8_t b = MOUSE_LEFT); // press LEFT by default + void release(uint8_t b = MOUSE_LEFT); // release LEFT by default + bool isPressed(uint8_t b = MOUSE_ALL); // check all buttons by default +}; +extern Mouse_ Mouse; + +//================================================================================ +//================================================================================ +// Keyboard + +#define KEY_MODIFIER_LEFT_CTRL 0x01 +#define KEY_MODIFIER_LEFT_SHIFT 0x02 +#define KEY_MODIFIER_LEFT_ALT 0x04 +#define KEY_MODIFIER_LEFT_GUI 0x08 +#define KEY_MODIFIER_RIGHT_CTRL 0x010 +#define KEY_MODIFIER_RIGHT_SHIFT 0x020 +#define KEY_MODIFIER_RIGHT_ALT 0x040 +#define KEY_MODIFIER_RIGHT_GUI 0x080 + +// Low level key report: up to 6 keys and shift, ctrl etc at once +typedef struct +{ + uint8_t modifiers; + uint8_t reserved; + uint8_t keys[6]; +} KeyReport; + +// Map a character into a key report +// Called from Print to map text to keycodes +class KeyMap +{ +public: + virtual void charToKey(int c, KeyReport* keyReport) = 0; +}; + +// +class Keyboard_ : public Print +{ +private: + KeyMap* _keyMap; + void sendReport(KeyReport* keys); + void setKeyMap(KeyMap* keyMap); +public: + Keyboard_(); + virtual size_t write(uint8_t); +}; +extern Keyboard_ Keyboard; + +//================================================================================ +//================================================================================ +// Low level API + +typedef struct +{ + uint8_t bmRequestType; + uint8_t bRequest; + uint8_t wValueL; + uint8_t wValueH; + uint16_t wIndex; + uint16_t wLength; +} Setup; + +//================================================================================ +//================================================================================ +// HID 'Driver' + +int HID_GetInterface(uint8_t* interfaceNum); +int HID_GetDescriptor(int i); +bool HID_Setup(Setup& setup); +void HID_SendReport(uint8_t id, const void* data, int len); + +//================================================================================ +//================================================================================ +// MSC 'Driver' + +int MSC_GetInterface(uint8_t* interfaceNum); +int MSC_GetDescriptor(int i); +bool MSC_Setup(Setup& setup); +bool MSC_Data(uint8_t rx,uint8_t tx); + +//================================================================================ +//================================================================================ +// CSC 'Driver' + +int CDC_GetInterface(uint8_t* interfaceNum); +int CDC_GetDescriptor(int i); +bool CDC_Setup(Setup& setup); + +//================================================================================ +//================================================================================ + +#define TRANSFER_PGM 0x80 +#define TRANSFER_RELEASE 0x40 +#define TRANSFER_ZERO 0x20 + +int USB_SendControl(uint8_t flags, const void* d, int len); +int USB_RecvControl(void* d, int len); + +uint8_t USB_Available(uint8_t ep); +int USB_Send(uint8_t ep, const void* data, int len); // blocking +int USB_Recv(uint8_t ep, void* data, int len); // non-blocking +int USB_Recv(uint8_t ep); // non-blocking +void USB_Flush(uint8_t ep); + +#endif + +#endif /* if defined(USBCON) */ \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/USBCore.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/USBCore.cpp new file mode 100644 index 00000000..aaef60d1 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/USBCore.cpp @@ -0,0 +1,660 @@ + + +/* Copyright (c) 2010, Peter Barrett +** +** Permission to use, copy, modify, and/or distribute this software for +** any purpose with or without fee is hereby granted, provided that the +** above copyright notice and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR +** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +*/ + +#include "Platform.h" +#include "USBAPI.h" +#include "USBDesc.h" + +#if defined(USBCON) + +#define EP_TYPE_CONTROL 0x00 +#define EP_TYPE_BULK_IN 0x81 +#define EP_TYPE_BULK_OUT 0x80 +#define EP_TYPE_INTERRUPT_IN 0xC1 +#define EP_TYPE_INTERRUPT_OUT 0xC0 +#define EP_TYPE_ISOCHRONOUS_IN 0x41 +#define EP_TYPE_ISOCHRONOUS_OUT 0x40 + +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ +#define TX_RX_LED_PULSE_MS 100 +volatile u8 TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ +volatile u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ + +//================================================================== +//================================================================== + +extern const u16 STRING_LANGUAGE[] PROGMEM; +extern const u16 STRING_IPRODUCT[] PROGMEM; +extern const u16 STRING_IMANUFACTURER[] PROGMEM; +extern const DeviceDescriptor USB_DeviceDescriptor PROGMEM; +extern const DeviceDescriptor USB_DeviceDescriptorA PROGMEM; + +const u16 STRING_LANGUAGE[2] = { + (3<<8) | (2+2), + 0x0409 // English +}; + +const u16 STRING_IPRODUCT[17] = { + (3<<8) | (2+2*16), +#if USB_PID == USB_PID_LEONARDO + 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' +#elif USB_PID == USB_PID_MICRO + 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ',' ',' ' +#endif +}; + +const u16 STRING_IMANUFACTURER[12] = { + (3<<8) | (2+2*11), + 'A','r','d','u','i','n','o',' ','L','L','C' +}; + +#ifdef CDC_ENABLED +#define DEVICE_CLASS 0x02 +#else +#define DEVICE_CLASS 0x00 +#endif + +// DEVICE DESCRIPTOR +const DeviceDescriptor USB_DeviceDescriptor = + D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1); + +const DeviceDescriptor USB_DeviceDescriptorA = + D_DEVICE(DEVICE_CLASS,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1); + +//================================================================== +//================================================================== + +volatile u8 _usbConfiguration = 0; + +static inline void WaitIN(void) +{ + while (!(UEINTX & (1< len) + n = len; + len -= n; + { + LockEP lock(ep); + if (ep & TRANSFER_ZERO) + { + while (n--) + Send8(0); + } + else if (ep & TRANSFER_PGM) + { + while (n--) + Send8(pgm_read_byte(data++)); + } + else + { + while (n--) + Send8(*data++); + } + if (!ReadWriteAllowed() || ((len == 0) && (ep & TRANSFER_RELEASE))) // Release full buffer + ReleaseTX(); + } + } + TXLED1; // light the TX LED + TxLEDPulse = TX_RX_LED_PULSE_MS; + return r; +} + +extern const u8 _initEndpoints[] PROGMEM; +const u8 _initEndpoints[] = +{ + 0, + +#ifdef CDC_ENABLED + EP_TYPE_INTERRUPT_IN, // CDC_ENDPOINT_ACM + EP_TYPE_BULK_OUT, // CDC_ENDPOINT_OUT + EP_TYPE_BULK_IN, // CDC_ENDPOINT_IN +#endif + +#ifdef HID_ENABLED + EP_TYPE_INTERRUPT_IN // HID_ENDPOINT_INT +#endif +}; + +#define EP_SINGLE_64 0x32 // EP0 +#define EP_DOUBLE_64 0x36 // Other endpoints + +static +void InitEP(u8 index, u8 type, u8 size) +{ + UENUM = index; + UECONX = 1; + UECFG0X = type; + UECFG1X = size; +} + +static +void InitEndpoints() +{ + for (u8 i = 1; i < sizeof(_initEndpoints); i++) + { + UENUM = i; + UECONX = 1; + UECFG0X = pgm_read_byte(_initEndpoints+i); + UECFG1X = EP_DOUBLE_64; + } + UERST = 0x7E; // And reset them + UERST = 0; +} + +// Handle CLASS_INTERFACE requests +static +bool ClassInterfaceRequest(Setup& setup) +{ + u8 i = setup.wIndex; + +#ifdef CDC_ENABLED + if (CDC_ACM_INTERFACE == i) + return CDC_Setup(setup); +#endif + +#ifdef HID_ENABLED + if (HID_INTERFACE == i) + return HID_Setup(setup); +#endif + return false; +} + +int _cmark; +int _cend; +void InitControl(int end) +{ + SetEP(0); + _cmark = 0; + _cend = end; +} + +static +bool SendControl(u8 d) +{ + if (_cmark < _cend) + { + if (!WaitForINOrOUT()) + return false; + Send8(d); + if (!((_cmark + 1) & 0x3F)) + ClearIN(); // Fifo is full, release this packet + } + _cmark++; + return true; +}; + +// Clipped by _cmark/_cend +int USB_SendControl(u8 flags, const void* d, int len) +{ + int sent = len; + const u8* data = (const u8*)d; + bool pgm = flags & TRANSFER_PGM; + while (len--) + { + u8 c = pgm ? pgm_read_byte(data++) : *data++; + if (!SendControl(c)) + return -1; + } + return sent; +} + +// Does not timeout or cross fifo boundaries +// Will only work for transfers <= 64 bytes +// TODO +int USB_RecvControl(void* d, int len) +{ + WaitOUT(); + Recv((u8*)d,len); + ClearOUT(); + return len; +} + +int SendInterfaces() +{ + int total = 0; + u8 interfaces = 0; + +#ifdef CDC_ENABLED + total = CDC_GetInterface(&interfaces); +#endif + +#ifdef HID_ENABLED + total += HID_GetInterface(&interfaces); +#endif + + return interfaces; +} + +// Construct a dynamic configuration descriptor +// This really needs dynamic endpoint allocation etc +// TODO +static +bool SendConfiguration(int maxlen) +{ + // Count and measure interfaces + InitControl(0); + int interfaces = SendInterfaces(); + ConfigDescriptor config = D_CONFIG(_cmark + sizeof(ConfigDescriptor),interfaces); + + // Now send them + InitControl(maxlen); + USB_SendControl(0,&config,sizeof(ConfigDescriptor)); + SendInterfaces(); + return true; +} + +u8 _cdcComposite = 0; + +static +bool SendDescriptor(Setup& setup) +{ + u8 t = setup.wValueH; + if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) + return SendConfiguration(setup.wLength); + + InitControl(setup.wLength); +#ifdef HID_ENABLED + if (HID_REPORT_DESCRIPTOR_TYPE == t) + return HID_GetDescriptor(t); +#endif + + u8 desc_length = 0; + const u8* desc_addr = 0; + if (USB_DEVICE_DESCRIPTOR_TYPE == t) + { + if (setup.wLength == 8) + _cdcComposite = 1; + desc_addr = _cdcComposite ? (const u8*)&USB_DeviceDescriptorA : (const u8*)&USB_DeviceDescriptor; + } + else if (USB_STRING_DESCRIPTOR_TYPE == t) + { + if (setup.wValueL == 0) + desc_addr = (const u8*)&STRING_LANGUAGE; + else if (setup.wValueL == IPRODUCT) + desc_addr = (const u8*)&STRING_IPRODUCT; + else if (setup.wValueL == IMANUFACTURER) + desc_addr = (const u8*)&STRING_IMANUFACTURER; + else + return false; + } + + if (desc_addr == 0) + return false; + if (desc_length == 0) + desc_length = pgm_read_byte(desc_addr); + + USB_SendControl(TRANSFER_PGM,desc_addr,desc_length); + return true; +} + +// Endpoint 0 interrupt +ISR(USB_COM_vect) +{ + SetEP(0); + if (!ReceivedSetupInt()) + return; + + Setup setup; + Recv((u8*)&setup,8); + ClearSetupInt(); + + u8 requestType = setup.bmRequestType; + if (requestType & REQUEST_DEVICETOHOST) + WaitIN(); + else + ClearIN(); + + bool ok = true; + if (REQUEST_STANDARD == (requestType & REQUEST_TYPE)) + { + // Standard Requests + u8 r = setup.bRequest; + if (GET_STATUS == r) + { + Send8(0); // TODO + Send8(0); + } + else if (CLEAR_FEATURE == r) + { + } + else if (SET_FEATURE == r) + { + } + else if (SET_ADDRESS == r) + { + WaitIN(); + UDADDR = setup.wValueL | (1<> 8) & 0xFF) + +#define CDC_V1_10 0x0110 +#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 + +#define CDC_CALL_MANAGEMENT 0x01 +#define CDC_ABSTRACT_CONTROL_MODEL 0x02 +#define CDC_HEADER 0x00 +#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 +#define CDC_UNION 0x06 +#define CDC_CS_INTERFACE 0x24 +#define CDC_CS_ENDPOINT 0x25 +#define CDC_DATA_INTERFACE_CLASS 0x0A + +#define MSC_SUBCLASS_SCSI 0x06 +#define MSC_PROTOCOL_BULK_ONLY 0x50 + +#define HID_HID_DESCRIPTOR_TYPE 0x21 +#define HID_REPORT_DESCRIPTOR_TYPE 0x22 +#define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23 + + +// Device +typedef struct { + u8 len; // 18 + u8 dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE + u16 usbVersion; // 0x200 + u8 deviceClass; + u8 deviceSubClass; + u8 deviceProtocol; + u8 packetSize0; // Packet 0 + u16 idVendor; + u16 idProduct; + u16 deviceVersion; // 0x100 + u8 iManufacturer; + u8 iProduct; + u8 iSerialNumber; + u8 bNumConfigurations; +} DeviceDescriptor; + +// Config +typedef struct { + u8 len; // 9 + u8 dtype; // 2 + u16 clen; // total length + u8 numInterfaces; + u8 config; + u8 iconfig; + u8 attributes; + u8 maxPower; +} ConfigDescriptor; + +// String + +// Interface +typedef struct +{ + u8 len; // 9 + u8 dtype; // 4 + u8 number; + u8 alternate; + u8 numEndpoints; + u8 interfaceClass; + u8 interfaceSubClass; + u8 protocol; + u8 iInterface; +} InterfaceDescriptor; + +// Endpoint +typedef struct +{ + u8 len; // 7 + u8 dtype; // 5 + u8 addr; + u8 attr; + u16 packetSize; + u8 interval; +} EndpointDescriptor; + +// Interface Association Descriptor +// Used to bind 2 interfaces together in CDC compostite device +typedef struct +{ + u8 len; // 8 + u8 dtype; // 11 + u8 firstInterface; + u8 interfaceCount; + u8 functionClass; + u8 funtionSubClass; + u8 functionProtocol; + u8 iInterface; +} IADDescriptor; + +// CDC CS interface descriptor +typedef struct +{ + u8 len; // 5 + u8 dtype; // 0x24 + u8 subtype; + u8 d0; + u8 d1; +} CDCCSInterfaceDescriptor; + +typedef struct +{ + u8 len; // 4 + u8 dtype; // 0x24 + u8 subtype; + u8 d0; +} CDCCSInterfaceDescriptor4; + +typedef struct +{ + u8 len; + u8 dtype; // 0x24 + u8 subtype; // 1 + u8 bmCapabilities; + u8 bDataInterface; +} CMFunctionalDescriptor; + +typedef struct +{ + u8 len; + u8 dtype; // 0x24 + u8 subtype; // 1 + u8 bmCapabilities; +} ACMFunctionalDescriptor; + +typedef struct +{ + // IAD + IADDescriptor iad; // Only needed on compound device + + // Control + InterfaceDescriptor cif; // + CDCCSInterfaceDescriptor header; + CMFunctionalDescriptor callManagement; // Call Management + ACMFunctionalDescriptor controlManagement; // ACM + CDCCSInterfaceDescriptor functionalDescriptor; // CDC_UNION + EndpointDescriptor cifin; + + // Data + InterfaceDescriptor dif; + EndpointDescriptor in; + EndpointDescriptor out; +} CDCDescriptor; + +typedef struct +{ + InterfaceDescriptor msc; + EndpointDescriptor in; + EndpointDescriptor out; +} MSCDescriptor; + +typedef struct +{ + u8 len; // 9 + u8 dtype; // 0x21 + u8 addr; + u8 versionL; // 0x101 + u8 versionH; // 0x101 + u8 country; + u8 desctype; // 0x22 report + u8 descLenL; + u8 descLenH; +} HIDDescDescriptor; + +typedef struct +{ + InterfaceDescriptor hid; + HIDDescDescriptor desc; + EndpointDescriptor in; +} HIDDescriptor; + + +#define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \ + { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs } + +#define D_CONFIG(_totalLength,_interfaces) \ + { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(500) } + +#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \ + { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 } + +#define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \ + { 7, 5, _addr,_attr,_packetSize, _interval } + +#define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \ + { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 } + +#define D_HIDREPORT(_descriptorLength) \ + { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 } + +#define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 } +#define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 } + + +#endif \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/USBDesc.h b/Micropendous/Firmware/Arduino1/cores/arduino/USBDesc.h new file mode 100644 index 00000000..98bcf2b5 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/USBDesc.h @@ -0,0 +1,67 @@ + + +/* Copyright (c) 2011, Peter Barrett +** +** Permission to use, copy, modify, and/or distribute this software for +** any purpose with or without fee is hereby granted, provided that the +** above copyright notice and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR +** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +*/ + +#define CDC_ENABLED +#define HID_ENABLED + + +#ifdef CDC_ENABLED +#define CDC_INTERFACE_COUNT 2 +#define CDC_ENPOINT_COUNT 3 +#else +#define CDC_INTERFACE_COUNT 0 +#define CDC_ENPOINT_COUNT 0 +#endif + +#ifdef HID_ENABLED +#define HID_INTERFACE_COUNT 1 +#define HID_ENPOINT_COUNT 1 +#else +#define HID_INTERFACE_COUNT 0 +#define HID_ENPOINT_COUNT 0 +#endif + +#define CDC_ACM_INTERFACE 0 // CDC ACM +#define CDC_DATA_INTERFACE 1 // CDC Data +#define CDC_FIRST_ENDPOINT 1 +#define CDC_ENDPOINT_ACM (CDC_FIRST_ENDPOINT) // CDC First +#define CDC_ENDPOINT_OUT (CDC_FIRST_ENDPOINT+1) +#define CDC_ENDPOINT_IN (CDC_FIRST_ENDPOINT+2) + +#define HID_INTERFACE (CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT) // HID Interface +#define HID_FIRST_ENDPOINT (CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT) +#define HID_ENDPOINT_INT (HID_FIRST_ENDPOINT) + +#define INTERFACE_COUNT (MSC_INTERFACE + MSC_INTERFACE_COUNT) + +#ifdef CDC_ENABLED +#define CDC_RX CDC_ENDPOINT_OUT +#define CDC_TX CDC_ENDPOINT_IN +#endif + +#ifdef HID_ENABLED +#define HID_TX HID_ENDPOINT_INT +#endif + +#define IMANUFACTURER 1 +#define IPRODUCT 2 +#define USB_PID_LEONARDO 0x0034 +#define USB_PID_MICRO 0x0035 +#define USB_VID 0x2341 // arduino LLC vid +#define USB_PID ARDUINO_MODEL_USB_PID + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/Udp.h b/Micropendous/Firmware/Arduino1/cores/arduino/Udp.h new file mode 100644 index 00000000..8479020e --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/Udp.h @@ -0,0 +1,88 @@ +/* + * Udp.cpp: Library to send/receive UDP packets. + * + * NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these) + * 1) UDP does not guarantee the order in which assembled UDP packets are received. This + * might not happen often in practice, but in larger network topologies, a UDP + * packet can be received out of sequence. + * 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being + * aware of it. Again, this may not be a concern in practice on small local networks. + * For more information, see http://www.cafeaulait.org/course/week12/35.html + * + * MIT License: + * Copyright (c) 2008 Bjoern Hartmann + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * bjoern@cs.stanford.edu 12/30/2008 + */ + +#ifndef udp_h +#define udp_h + +#include +#include + +class UDP : public Stream { + +public: + virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + virtual void stop() =0; // Finish with the UDP socket + + // Sending UDP packets + + // Start building up a packet to send to the remote host specific in ip and port + // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port + virtual int beginPacket(IPAddress ip, uint16_t port) =0; + // Start building up a packet to send to the remote host specific in host and port + // Returns 1 if successful, 0 if there was a problem resolving the hostname or port + virtual int beginPacket(const char *host, uint16_t port) =0; + // Finish off this packet and send it + // Returns 1 if the packet was sent successfully, 0 if there was an error + virtual int endPacket() =0; + // Write a single byte into the packet + virtual size_t write(uint8_t) =0; + // Write size bytes from buffer into the packet + virtual size_t write(const uint8_t *buffer, size_t size) =0; + + // Start processing the next available incoming packet + // Returns the size of the packet in bytes, or 0 if no packets are available + virtual int parsePacket() =0; + // Number of bytes remaining in the current packet + virtual int available() =0; + // Read a single byte from the current packet + virtual int read() =0; + // Read up to len bytes from the current packet and place them into buffer + // Returns the number of bytes read, or 0 if none are available + virtual int read(unsigned char* buffer, size_t len) =0; + // Read up to len characters from the current packet and place them into buffer + // Returns the number of characters read, or 0 if none are available + virtual int read(char* buffer, size_t len) =0; + // Return the next byte from the current packet without moving on to the next byte + virtual int peek() =0; + virtual void flush() =0; // Finish reading the current packet + + // Return the IP address of the host who sent the current incoming packet + virtual IPAddress remoteIP() =0; + // Return the port of the host who sent the current incoming packet + virtual uint16_t remotePort() =0; +protected: + uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; +}; + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/WCharacter.h b/Micropendous/Firmware/Arduino1/cores/arduino/WCharacter.h new file mode 100644 index 00000000..8b728283 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/WCharacter.h @@ -0,0 +1,168 @@ +/* + WCharacter.h - Character utility functions for Wiring & Arduino + Copyright (c) 2010 Hernando Barragan. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef Character_h +#define Character_h + +#include + +// WCharacter.h prototypes +inline boolean isAlphaNumeric(int c) __attribute__((always_inline)); +inline boolean isAlpha(int c) __attribute__((always_inline)); +inline boolean isAscii(int c) __attribute__((always_inline)); +inline boolean isWhitespace(int c) __attribute__((always_inline)); +inline boolean isControl(int c) __attribute__((always_inline)); +inline boolean isDigit(int c) __attribute__((always_inline)); +inline boolean isGraph(int c) __attribute__((always_inline)); +inline boolean isLowerCase(int c) __attribute__((always_inline)); +inline boolean isPrintable(int c) __attribute__((always_inline)); +inline boolean isPunct(int c) __attribute__((always_inline)); +inline boolean isSpace(int c) __attribute__((always_inline)); +inline boolean isUpperCase(int c) __attribute__((always_inline)); +inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); +inline int toAscii(int c) __attribute__((always_inline)); +inline int toLowerCase(int c) __attribute__((always_inline)); +inline int toUpperCase(int c)__attribute__((always_inline)); + + +// Checks for an alphanumeric character. +// It is equivalent to (isalpha(c) || isdigit(c)). +inline boolean isAlphaNumeric(int c) +{ + return ( isalnum(c) == 0 ? false : true); +} + + +// Checks for an alphabetic character. +// It is equivalent to (isupper(c) || islower(c)). +inline boolean isAlpha(int c) +{ + return ( isalpha(c) == 0 ? false : true); +} + + +// Checks whether c is a 7-bit unsigned char value +// that fits into the ASCII character set. +inline boolean isAscii(int c) +{ + return ( isascii (c) == 0 ? false : true); +} + + +// Checks for a blank character, that is, a space or a tab. +inline boolean isWhitespace(int c) +{ + return ( isblank (c) == 0 ? false : true); +} + + +// Checks for a control character. +inline boolean isControl(int c) +{ + return ( iscntrl (c) == 0 ? false : true); +} + + +// Checks for a digit (0 through 9). +inline boolean isDigit(int c) +{ + return ( isdigit (c) == 0 ? false : true); +} + + +// Checks for any printable character except space. +inline boolean isGraph(int c) +{ + return ( isgraph (c) == 0 ? false : true); +} + + +// Checks for a lower-case character. +inline boolean isLowerCase(int c) +{ + return (islower (c) == 0 ? false : true); +} + + +// Checks for any printable character including space. +inline boolean isPrintable(int c) +{ + return ( isprint (c) == 0 ? false : true); +} + + +// Checks for any printable character which is not a space +// or an alphanumeric character. +inline boolean isPunct(int c) +{ + return ( ispunct (c) == 0 ? false : true); +} + + +// Checks for white-space characters. For the avr-libc library, +// these are: space, formfeed ('\f'), newline ('\n'), carriage +// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). +inline boolean isSpace(int c) +{ + return ( isspace (c) == 0 ? false : true); +} + + +// Checks for an uppercase letter. +inline boolean isUpperCase(int c) +{ + return ( isupper (c) == 0 ? false : true); +} + + +// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7 +// 8 9 a b c d e f A B C D E F. +inline boolean isHexadecimalDigit(int c) +{ + return ( isxdigit (c) == 0 ? false : true); +} + + +// Converts c to a 7-bit unsigned char value that fits into the +// ASCII character set, by clearing the high-order bits. +inline int toAscii(int c) +{ + return toascii (c); +} + + +// Warning: +// Many people will be unhappy if you use this function. +// This function will convert accented letters into random +// characters. + +// Converts the letter c to lower case, if possible. +inline int toLowerCase(int c) +{ + return tolower (c); +} + + +// Converts the letter c to upper case, if possible. +inline int toUpperCase(int c) +{ + return toupper (c); +} + +#endif \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/WInterrupts.c b/Micropendous/Firmware/Arduino1/cores/arduino/WInterrupts.c new file mode 100644 index 00000000..a0f958bb --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/WInterrupts.c @@ -0,0 +1,248 @@ +/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Wiring project - http://wiring.uniandes.edu.co + + Copyright (c) 2004-05 Hernando Barragan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 24 November 2006 by David A. Mellis + Modified 1 August 2010 by Mark Sproul +*/ + +#include +#include +#include +#include +#include + +#include "wiring_private.h" + +volatile static voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS]; +// volatile static voidFuncPtr twiIntFunc; + +void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { + if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { + intFunc[interruptNum] = userFunc; + + // Configure the interrupt mode (trigger on low input, any change, rising + // edge, or falling edge). The mode constants were chosen to correspond + // to the configuration bits in the hardware register, so we simply shift + // the mode into place. + + // Enable the interrupt. + + switch (interruptNum) { +#if defined(EICRA) && defined(EICRB) && defined(EIMSK) + case 2: + EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + EIMSK |= (1 << INT0); + break; + case 3: + EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + EIMSK |= (1 << INT1); + break; + case 4: + EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); + EIMSK |= (1 << INT2); + break; + case 5: + EICRA = (EICRA & ~((1 << ISC30) | (1 << ISC31))) | (mode << ISC30); + EIMSK |= (1 << INT3); + break; + case 0: + EICRB = (EICRB & ~((1 << ISC40) | (1 << ISC41))) | (mode << ISC40); + EIMSK |= (1 << INT4); + break; + case 1: + EICRB = (EICRB & ~((1 << ISC50) | (1 << ISC51))) | (mode << ISC50); + EIMSK |= (1 << INT5); + break; + case 6: + EICRB = (EICRB & ~((1 << ISC60) | (1 << ISC61))) | (mode << ISC60); + EIMSK |= (1 << INT6); + break; + case 7: + EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70); + EIMSK |= (1 << INT7); + break; +#else + case 0: + #if defined(EICRA) && defined(ISC00) && defined(EIMSK) + EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + EIMSK |= (1 << INT0); + #elif defined(MCUCR) && defined(ISC00) && defined(GICR) + MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + GICR |= (1 << INT0); + #elif defined(MCUCR) && defined(ISC00) && defined(GIMSK) + MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + GIMSK |= (1 << INT0); + #else + #error attachInterrupt not finished for this CPU (case 0) + #endif + break; + + case 1: + #if defined(EICRA) && defined(ISC10) && defined(ISC11) && defined(EIMSK) + EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + EIMSK |= (1 << INT1); + #elif defined(MCUCR) && defined(ISC10) && defined(ISC11) && defined(GICR) + MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + GICR |= (1 << INT1); + #elif defined(MCUCR) && defined(ISC10) && defined(GIMSK) && defined(GIMSK) + MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + GIMSK |= (1 << INT1); + #else + #warning attachInterrupt may need some more work for this cpu (case 1) + #endif + break; +#endif + } + } +} + +void detachInterrupt(uint8_t interruptNum) { + if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { + // Disable the interrupt. (We can't assume that interruptNum is equal + // to the number of the EIMSK bit to clear, as this isn't true on the + // ATmega8. There, INT0 is 6 and INT1 is 7.) + switch (interruptNum) { +#if defined(EICRA) && defined(EICRB) && defined(EIMSK) + case 2: + EIMSK &= ~(1 << INT0); + break; + case 3: + EIMSK &= ~(1 << INT1); + break; + case 4: + EIMSK &= ~(1 << INT2); + break; + case 5: + EIMSK &= ~(1 << INT3); + break; + case 0: + EIMSK &= ~(1 << INT4); + break; + case 1: + EIMSK &= ~(1 << INT5); + break; + case 6: + EIMSK &= ~(1 << INT6); + break; + case 7: + EIMSK &= ~(1 << INT7); + break; +#else + case 0: + #if defined(EIMSK) && defined(INT0) + EIMSK &= ~(1 << INT0); + #elif defined(GICR) && defined(ISC00) + GICR &= ~(1 << INT0); // atmega32 + #elif defined(GIMSK) && defined(INT0) + GIMSK &= ~(1 << INT0); + #else + #error detachInterrupt not finished for this cpu + #endif + break; + + case 1: + #if defined(EIMSK) && defined(INT1) + EIMSK &= ~(1 << INT1); + #elif defined(GICR) && defined(INT1) + GICR &= ~(1 << INT1); // atmega32 + #elif defined(GIMSK) && defined(INT1) + GIMSK &= ~(1 << INT1); + #else + #warning detachInterrupt may need some more work for this cpu (case 1) + #endif + break; +#endif + } + + intFunc[interruptNum] = 0; + } +} + +/* +void attachInterruptTwi(void (*userFunc)(void) ) { + twiIntFunc = userFunc; +} +*/ + +#if defined(EICRA) && defined(EICRB) + +SIGNAL(INT0_vect) { + if(intFunc[EXTERNAL_INT_2]) + intFunc[EXTERNAL_INT_2](); +} + +SIGNAL(INT1_vect) { + if(intFunc[EXTERNAL_INT_3]) + intFunc[EXTERNAL_INT_3](); +} + +SIGNAL(INT2_vect) { + if(intFunc[EXTERNAL_INT_4]) + intFunc[EXTERNAL_INT_4](); +} + +SIGNAL(INT3_vect) { + if(intFunc[EXTERNAL_INT_5]) + intFunc[EXTERNAL_INT_5](); +} + +SIGNAL(INT4_vect) { + if(intFunc[EXTERNAL_INT_0]) + intFunc[EXTERNAL_INT_0](); +} + +SIGNAL(INT5_vect) { + if(intFunc[EXTERNAL_INT_1]) + intFunc[EXTERNAL_INT_1](); +} + +SIGNAL(INT6_vect) { + if(intFunc[EXTERNAL_INT_6]) + intFunc[EXTERNAL_INT_6](); +} + +SIGNAL(INT7_vect) { + if(intFunc[EXTERNAL_INT_7]) + intFunc[EXTERNAL_INT_7](); +} + +#else + +SIGNAL(INT0_vect) { + if(intFunc[EXTERNAL_INT_0]) + intFunc[EXTERNAL_INT_0](); +} + +SIGNAL(INT1_vect) { + if(intFunc[EXTERNAL_INT_1]) + intFunc[EXTERNAL_INT_1](); +} + +#endif + +/* +SIGNAL(SIG_2WIRE_SERIAL) { + if(twiIntFunc) + twiIntFunc(); +} +*/ + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/WMath.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/WMath.cpp new file mode 100644 index 00000000..d4e258e9 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/WMath.cpp @@ -0,0 +1,60 @@ +/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Wiring project - http://wiring.org.co + Copyright (c) 2004-06 Hernando Barragan + Modified 13 August 2006, David A. Mellis for Arduino - http://www.arduino.cc/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id$ +*/ + +extern "C" { + #include "stdlib.h" +} + +void randomSeed(unsigned int seed) +{ + if (seed != 0) { + srandom(seed); + } +} + +long random(long howbig) +{ + if (howbig == 0) { + return 0; + } + return random() % howbig; +} + +long random(long howsmall, long howbig) +{ + if (howsmall >= howbig) { + return howsmall; + } + long diff = howbig - howsmall; + return random(diff) + howsmall; +} + +long map(long x, long in_min, long in_max, long out_min, long out_max) +{ + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +unsigned int makeWord(unsigned int w) { return w; } +unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; } \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/WString.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/WString.cpp new file mode 100644 index 00000000..b5b83827 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/WString.cpp @@ -0,0 +1,645 @@ +/* + WString.cpp - String library for Wiring & Arduino + ...mostly rewritten by Paul Stoffregen... + Copyright (c) 2009-10 Hernando Barragan. All rights reserved. + Copyright 2011, Paul Stoffregen, paul@pjrc.com + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "WString.h" + + +/*********************************************/ +/* Constructors */ +/*********************************************/ + +String::String(const char *cstr) +{ + init(); + if (cstr) copy(cstr, strlen(cstr)); +} + +String::String(const String &value) +{ + init(); + *this = value; +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +String::String(String &&rval) +{ + init(); + move(rval); +} +String::String(StringSumHelper &&rval) +{ + init(); + move(rval); +} +#endif + +String::String(char c) +{ + init(); + char buf[2]; + buf[0] = c; + buf[1] = 0; + *this = buf; +} + +String::String(unsigned char value, unsigned char base) +{ + init(); + char buf[9]; + utoa(value, buf, base); + *this = buf; +} + +String::String(int value, unsigned char base) +{ + init(); + char buf[18]; + itoa(value, buf, base); + *this = buf; +} + +String::String(unsigned int value, unsigned char base) +{ + init(); + char buf[17]; + utoa(value, buf, base); + *this = buf; +} + +String::String(long value, unsigned char base) +{ + init(); + char buf[34]; + ltoa(value, buf, base); + *this = buf; +} + +String::String(unsigned long value, unsigned char base) +{ + init(); + char buf[33]; + ultoa(value, buf, base); + *this = buf; +} + +String::~String() +{ + free(buffer); +} + +/*********************************************/ +/* Memory Management */ +/*********************************************/ + +inline void String::init(void) +{ + buffer = NULL; + capacity = 0; + len = 0; + flags = 0; +} + +void String::invalidate(void) +{ + if (buffer) free(buffer); + buffer = NULL; + capacity = len = 0; +} + +unsigned char String::reserve(unsigned int size) +{ + if (buffer && capacity >= size) return 1; + if (changeBuffer(size)) { + if (len == 0) buffer[0] = 0; + return 1; + } + return 0; +} + +unsigned char String::changeBuffer(unsigned int maxStrLen) +{ + char *newbuffer = (char *)realloc(buffer, maxStrLen + 1); + if (newbuffer) { + buffer = newbuffer; + capacity = maxStrLen; + return 1; + } + return 0; +} + +/*********************************************/ +/* Copy and Move */ +/*********************************************/ + +String & String::copy(const char *cstr, unsigned int length) +{ + if (!reserve(length)) { + invalidate(); + return *this; + } + len = length; + strcpy(buffer, cstr); + return *this; +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +void String::move(String &rhs) +{ + if (buffer) { + if (capacity >= rhs.len) { + strcpy(buffer, rhs.buffer); + len = rhs.len; + rhs.len = 0; + return; + } else { + free(buffer); + } + } + buffer = rhs.buffer; + capacity = rhs.capacity; + len = rhs.len; + rhs.buffer = NULL; + rhs.capacity = 0; + rhs.len = 0; +} +#endif + +String & String::operator = (const String &rhs) +{ + if (this == &rhs) return *this; + + if (rhs.buffer) copy(rhs.buffer, rhs.len); + else invalidate(); + + return *this; +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +String & String::operator = (String &&rval) +{ + if (this != &rval) move(rval); + return *this; +} + +String & String::operator = (StringSumHelper &&rval) +{ + if (this != &rval) move(rval); + return *this; +} +#endif + +String & String::operator = (const char *cstr) +{ + if (cstr) copy(cstr, strlen(cstr)); + else invalidate(); + + return *this; +} + +/*********************************************/ +/* concat */ +/*********************************************/ + +unsigned char String::concat(const String &s) +{ + return concat(s.buffer, s.len); +} + +unsigned char String::concat(const char *cstr, unsigned int length) +{ + unsigned int newlen = len + length; + if (!cstr) return 0; + if (length == 0) return 1; + if (!reserve(newlen)) return 0; + strcpy(buffer + len, cstr); + len = newlen; + return 1; +} + +unsigned char String::concat(const char *cstr) +{ + if (!cstr) return 0; + return concat(cstr, strlen(cstr)); +} + +unsigned char String::concat(char c) +{ + char buf[2]; + buf[0] = c; + buf[1] = 0; + return concat(buf, 1); +} + +unsigned char String::concat(unsigned char num) +{ + char buf[4]; + itoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(int num) +{ + char buf[7]; + itoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(unsigned int num) +{ + char buf[6]; + utoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(long num) +{ + char buf[12]; + ltoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +unsigned char String::concat(unsigned long num) +{ + char buf[11]; + ultoa(num, buf, 10); + return concat(buf, strlen(buf)); +} + +/*********************************************/ +/* Concatenate */ +/*********************************************/ + +StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(rhs.buffer, rhs.len)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr) +{ + StringSumHelper &a = const_cast(lhs); + if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, char c) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(c)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, int num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, long num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num) +{ + StringSumHelper &a = const_cast(lhs); + if (!a.concat(num)) a.invalidate(); + return a; +} + +/*********************************************/ +/* Comparison */ +/*********************************************/ + +int String::compareTo(const String &s) const +{ + if (!buffer || !s.buffer) { + if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer; + if (buffer && len > 0) return *(unsigned char *)buffer; + return 0; + } + return strcmp(buffer, s.buffer); +} + +unsigned char String::equals(const String &s2) const +{ + return (len == s2.len && compareTo(s2) == 0); +} + +unsigned char String::equals(const char *cstr) const +{ + if (len == 0) return (cstr == NULL || *cstr == 0); + if (cstr == NULL) return buffer[0] == 0; + return strcmp(buffer, cstr) == 0; +} + +unsigned char String::operator<(const String &rhs) const +{ + return compareTo(rhs) < 0; +} + +unsigned char String::operator>(const String &rhs) const +{ + return compareTo(rhs) > 0; +} + +unsigned char String::operator<=(const String &rhs) const +{ + return compareTo(rhs) <= 0; +} + +unsigned char String::operator>=(const String &rhs) const +{ + return compareTo(rhs) >= 0; +} + +unsigned char String::equalsIgnoreCase( const String &s2 ) const +{ + if (this == &s2) return 1; + if (len != s2.len) return 0; + if (len == 0) return 1; + const char *p1 = buffer; + const char *p2 = s2.buffer; + while (*p1) { + if (tolower(*p1++) != tolower(*p2++)) return 0; + } + return 1; +} + +unsigned char String::startsWith( const String &s2 ) const +{ + if (len < s2.len) return 0; + return startsWith(s2, 0); +} + +unsigned char String::startsWith( const String &s2, unsigned int offset ) const +{ + if (offset > len - s2.len || !buffer || !s2.buffer) return 0; + return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0; +} + +unsigned char String::endsWith( const String &s2 ) const +{ + if ( len < s2.len || !buffer || !s2.buffer) return 0; + return strcmp(&buffer[len - s2.len], s2.buffer) == 0; +} + +/*********************************************/ +/* Character Access */ +/*********************************************/ + +char String::charAt(unsigned int loc) const +{ + return operator[](loc); +} + +void String::setCharAt(unsigned int loc, char c) +{ + if (loc < len) buffer[loc] = c; +} + +char & String::operator[](unsigned int index) +{ + static char dummy_writable_char; + if (index >= len || !buffer) { + dummy_writable_char = 0; + return dummy_writable_char; + } + return buffer[index]; +} + +char String::operator[]( unsigned int index ) const +{ + if (index >= len || !buffer) return 0; + return buffer[index]; +} + +void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const +{ + if (!bufsize || !buf) return; + if (index >= len) { + buf[0] = 0; + return; + } + unsigned int n = bufsize - 1; + if (n > len - index) n = len - index; + strncpy((char *)buf, buffer + index, n); + buf[n] = 0; +} + +/*********************************************/ +/* Search */ +/*********************************************/ + +int String::indexOf(char c) const +{ + return indexOf(c, 0); +} + +int String::indexOf( char ch, unsigned int fromIndex ) const +{ + if (fromIndex >= len) return -1; + const char* temp = strchr(buffer + fromIndex, ch); + if (temp == NULL) return -1; + return temp - buffer; +} + +int String::indexOf(const String &s2) const +{ + return indexOf(s2, 0); +} + +int String::indexOf(const String &s2, unsigned int fromIndex) const +{ + if (fromIndex >= len) return -1; + const char *found = strstr(buffer + fromIndex, s2.buffer); + if (found == NULL) return -1; + return found - buffer; +} + +int String::lastIndexOf( char theChar ) const +{ + return lastIndexOf(theChar, len - 1); +} + +int String::lastIndexOf(char ch, unsigned int fromIndex) const +{ + if (fromIndex >= len || fromIndex < 0) return -1; + char tempchar = buffer[fromIndex + 1]; + buffer[fromIndex + 1] = '\0'; + char* temp = strrchr( buffer, ch ); + buffer[fromIndex + 1] = tempchar; + if (temp == NULL) return -1; + return temp - buffer; +} + +int String::lastIndexOf(const String &s2) const +{ + return lastIndexOf(s2, len - s2.len); +} + +int String::lastIndexOf(const String &s2, unsigned int fromIndex) const +{ + if (s2.len == 0 || len == 0 || s2.len > len || fromIndex < 0) return -1; + if (fromIndex >= len) fromIndex = len - 1; + int found = -1; + for (char *p = buffer; p <= buffer + fromIndex; p++) { + p = strstr(p, s2.buffer); + if (!p) break; + if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer; + } + return found; +} + +String String::substring( unsigned int left ) const +{ + return substring(left, len); +} + +String String::substring(unsigned int left, unsigned int right) const +{ + if (left > right) { + unsigned int temp = right; + right = left; + left = temp; + } + String out; + if (left > len) return out; + if (right > len) right = len; + char temp = buffer[right]; // save the replaced character + buffer[right] = '\0'; + out = buffer + left; // pointer arithmetic + buffer[right] = temp; //restore character + return out; +} + +/*********************************************/ +/* Modification */ +/*********************************************/ + +void String::replace(char find, char replace) +{ + if (!buffer) return; + for (char *p = buffer; *p; p++) { + if (*p == find) *p = replace; + } +} + +void String::replace(const String& find, const String& replace) +{ + if (len == 0 || find.len == 0) return; + int diff = replace.len - find.len; + char *readFrom = buffer; + char *foundAt; + if (diff == 0) { + while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { + memcpy(foundAt, replace.buffer, replace.len); + readFrom = foundAt + replace.len; + } + } else if (diff < 0) { + char *writeTo = buffer; + while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { + unsigned int n = foundAt - readFrom; + memcpy(writeTo, readFrom, n); + writeTo += n; + memcpy(writeTo, replace.buffer, replace.len); + writeTo += replace.len; + readFrom = foundAt + find.len; + len += diff; + } + strcpy(writeTo, readFrom); + } else { + unsigned int size = len; // compute size needed for result + while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { + readFrom = foundAt + find.len; + size += diff; + } + if (size == len) return; + if (size > capacity && !changeBuffer(size)) return; // XXX: tell user! + int index = len - 1; + while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) { + readFrom = buffer + index + find.len; + memmove(readFrom + diff, readFrom, len - (readFrom - buffer)); + len += diff; + buffer[len] = 0; + memcpy(buffer + index, replace.buffer, replace.len); + index--; + } + } +} + +void String::toLowerCase(void) +{ + if (!buffer) return; + for (char *p = buffer; *p; p++) { + *p = tolower(*p); + } +} + +void String::toUpperCase(void) +{ + if (!buffer) return; + for (char *p = buffer; *p; p++) { + *p = toupper(*p); + } +} + +void String::trim(void) +{ + if (!buffer || len == 0) return; + char *begin = buffer; + while (isspace(*begin)) begin++; + char *end = buffer + len - 1; + while (isspace(*end) && end >= begin) end--; + len = end + 1 - begin; + if (begin > buffer) memcpy(buffer, begin, len); + buffer[len] = 0; +} + +/*********************************************/ +/* Parsing / Conversion */ +/*********************************************/ + +long String::toInt(void) const +{ + if (buffer) return atol(buffer); + return 0; +} + + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/WString.h b/Micropendous/Firmware/Arduino1/cores/arduino/WString.h new file mode 100644 index 00000000..cfd354be --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/WString.h @@ -0,0 +1,205 @@ +/* + WString.h - String library for Wiring & Arduino + ...mostly rewritten by Paul Stoffregen... + Copyright (c) 2009-10 Hernando Barragan. All right reserved. + Copyright 2011, Paul Stoffregen, paul@pjrc.com + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef String_class_h +#define String_class_h +#ifdef __cplusplus + +#include +#include +#include +#include + +// When compiling programs with this class, the following gcc parameters +// dramatically increase performance and memory (RAM) efficiency, typically +// with little or no increase in code size. +// -felide-constructors +// -std=c++0x + +class __FlashStringHelper; +#define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal))) + +// An inherited class for holding the result of a concatenation. These +// result objects are assumed to be writable by subsequent concatenations. +class StringSumHelper; + +// The string class +class String +{ + // use a function pointer to allow for "if (s)" without the + // complications of an operator bool(). for more information, see: + // http://www.artima.com/cppsource/safebool.html + typedef void (String::*StringIfHelperType)() const; + void StringIfHelper() const {} + +public: + // constructors + // creates a copy of the initial value. + // if the initial value is null or invalid, or if memory allocation + // fails, the string will be marked as invalid (i.e. "if (s)" will + // be false). + String(const char *cstr = ""); + String(const String &str); + #ifdef __GXX_EXPERIMENTAL_CXX0X__ + String(String &&rval); + String(StringSumHelper &&rval); + #endif + explicit String(char c); + explicit String(unsigned char, unsigned char base=10); + explicit String(int, unsigned char base=10); + explicit String(unsigned int, unsigned char base=10); + explicit String(long, unsigned char base=10); + explicit String(unsigned long, unsigned char base=10); + ~String(void); + + // memory management + // return true on success, false on failure (in which case, the string + // is left unchanged). reserve(0), if successful, will validate an + // invalid string (i.e., "if (s)" will be true afterwards) + unsigned char reserve(unsigned int size); + inline unsigned int length(void) const {return len;} + + // creates a copy of the assigned value. if the value is null or + // invalid, or if the memory allocation fails, the string will be + // marked as invalid ("if (s)" will be false). + String & operator = (const String &rhs); + String & operator = (const char *cstr); + #ifdef __GXX_EXPERIMENTAL_CXX0X__ + String & operator = (String &&rval); + String & operator = (StringSumHelper &&rval); + #endif + + // concatenate (works w/ built-in types) + + // returns true on success, false on failure (in which case, the string + // is left unchanged). if the argument is null or invalid, the + // concatenation is considered unsucessful. + unsigned char concat(const String &str); + unsigned char concat(const char *cstr); + unsigned char concat(char c); + unsigned char concat(unsigned char c); + unsigned char concat(int num); + unsigned char concat(unsigned int num); + unsigned char concat(long num); + unsigned char concat(unsigned long num); + + // if there's not enough memory for the concatenated value, the string + // will be left unchanged (but this isn't signalled in any way) + String & operator += (const String &rhs) {concat(rhs); return (*this);} + String & operator += (const char *cstr) {concat(cstr); return (*this);} + String & operator += (char c) {concat(c); return (*this);} + String & operator += (unsigned char num) {concat(num); return (*this);} + String & operator += (int num) {concat(num); return (*this);} + String & operator += (unsigned int num) {concat(num); return (*this);} + String & operator += (long num) {concat(num); return (*this);} + String & operator += (unsigned long num) {concat(num); return (*this);} + + friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs); + friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr); + friend StringSumHelper & operator + (const StringSumHelper &lhs, char c); + friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, int num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, long num); + friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num); + + // comparison (only works w/ Strings and "strings") + operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; } + int compareTo(const String &s) const; + unsigned char equals(const String &s) const; + unsigned char equals(const char *cstr) const; + unsigned char operator == (const String &rhs) const {return equals(rhs);} + unsigned char operator == (const char *cstr) const {return equals(cstr);} + unsigned char operator != (const String &rhs) const {return !equals(rhs);} + unsigned char operator != (const char *cstr) const {return !equals(cstr);} + unsigned char operator < (const String &rhs) const; + unsigned char operator > (const String &rhs) const; + unsigned char operator <= (const String &rhs) const; + unsigned char operator >= (const String &rhs) const; + unsigned char equalsIgnoreCase(const String &s) const; + unsigned char startsWith( const String &prefix) const; + unsigned char startsWith(const String &prefix, unsigned int offset) const; + unsigned char endsWith(const String &suffix) const; + + // character acccess + char charAt(unsigned int index) const; + void setCharAt(unsigned int index, char c); + char operator [] (unsigned int index) const; + char& operator [] (unsigned int index); + void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const; + void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const + {getBytes((unsigned char *)buf, bufsize, index);} + + // search + int indexOf( char ch ) const; + int indexOf( char ch, unsigned int fromIndex ) const; + int indexOf( const String &str ) const; + int indexOf( const String &str, unsigned int fromIndex ) const; + int lastIndexOf( char ch ) const; + int lastIndexOf( char ch, unsigned int fromIndex ) const; + int lastIndexOf( const String &str ) const; + int lastIndexOf( const String &str, unsigned int fromIndex ) const; + String substring( unsigned int beginIndex ) const; + String substring( unsigned int beginIndex, unsigned int endIndex ) const; + + // modification + void replace(char find, char replace); + void replace(const String& find, const String& replace); + void toLowerCase(void); + void toUpperCase(void); + void trim(void); + + // parsing/conversion + long toInt(void) const; + +protected: + char *buffer; // the actual char array + unsigned int capacity; // the array length minus one (for the '\0') + unsigned int len; // the String length (not counting the '\0') + unsigned char flags; // unused, for future features +protected: + void init(void); + void invalidate(void); + unsigned char changeBuffer(unsigned int maxStrLen); + unsigned char concat(const char *cstr, unsigned int length); + + // copy and move + String & copy(const char *cstr, unsigned int length); + #ifdef __GXX_EXPERIMENTAL_CXX0X__ + void move(String &rhs); + #endif +}; + +class StringSumHelper : public String +{ +public: + StringSumHelper(const String &s) : String(s) {} + StringSumHelper(const char *p) : String(p) {} + StringSumHelper(char c) : String(c) {} + StringSumHelper(unsigned char num) : String(num) {} + StringSumHelper(int num) : String(num) {} + StringSumHelper(unsigned int num) : String(num) {} + StringSumHelper(long num) : String(num) {} + StringSumHelper(unsigned long num) : String(num) {} +}; + +#endif // __cplusplus +#endif // String_class_h diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/binary.h b/Micropendous/Firmware/Arduino1/cores/arduino/binary.h new file mode 100644 index 00000000..815a0daa --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/binary.h @@ -0,0 +1,515 @@ +#ifndef Binary_h +#define Binary_h + +#define B0 0 +#define B00 0 +#define B000 0 +#define B0000 0 +#define B00000 0 +#define B000000 0 +#define B0000000 0 +#define B00000000 0 +#define B1 1 +#define B01 1 +#define B001 1 +#define B0001 1 +#define B00001 1 +#define B000001 1 +#define B0000001 1 +#define B00000001 1 +#define B10 2 +#define B010 2 +#define B0010 2 +#define B00010 2 +#define B000010 2 +#define B0000010 2 +#define B00000010 2 +#define B11 3 +#define B011 3 +#define B0011 3 +#define B00011 3 +#define B000011 3 +#define B0000011 3 +#define B00000011 3 +#define B100 4 +#define B0100 4 +#define B00100 4 +#define B000100 4 +#define B0000100 4 +#define B00000100 4 +#define B101 5 +#define B0101 5 +#define B00101 5 +#define B000101 5 +#define B0000101 5 +#define B00000101 5 +#define B110 6 +#define B0110 6 +#define B00110 6 +#define B000110 6 +#define B0000110 6 +#define B00000110 6 +#define B111 7 +#define B0111 7 +#define B00111 7 +#define B000111 7 +#define B0000111 7 +#define B00000111 7 +#define B1000 8 +#define B01000 8 +#define B001000 8 +#define B0001000 8 +#define B00001000 8 +#define B1001 9 +#define B01001 9 +#define B001001 9 +#define B0001001 9 +#define B00001001 9 +#define B1010 10 +#define B01010 10 +#define B001010 10 +#define B0001010 10 +#define B00001010 10 +#define B1011 11 +#define B01011 11 +#define B001011 11 +#define B0001011 11 +#define B00001011 11 +#define B1100 12 +#define B01100 12 +#define B001100 12 +#define B0001100 12 +#define B00001100 12 +#define B1101 13 +#define B01101 13 +#define B001101 13 +#define B0001101 13 +#define B00001101 13 +#define B1110 14 +#define B01110 14 +#define B001110 14 +#define B0001110 14 +#define B00001110 14 +#define B1111 15 +#define B01111 15 +#define B001111 15 +#define B0001111 15 +#define B00001111 15 +#define B10000 16 +#define B010000 16 +#define B0010000 16 +#define B00010000 16 +#define B10001 17 +#define B010001 17 +#define B0010001 17 +#define B00010001 17 +#define B10010 18 +#define B010010 18 +#define B0010010 18 +#define B00010010 18 +#define B10011 19 +#define B010011 19 +#define B0010011 19 +#define B00010011 19 +#define B10100 20 +#define B010100 20 +#define B0010100 20 +#define B00010100 20 +#define B10101 21 +#define B010101 21 +#define B0010101 21 +#define B00010101 21 +#define B10110 22 +#define B010110 22 +#define B0010110 22 +#define B00010110 22 +#define B10111 23 +#define B010111 23 +#define B0010111 23 +#define B00010111 23 +#define B11000 24 +#define B011000 24 +#define B0011000 24 +#define B00011000 24 +#define B11001 25 +#define B011001 25 +#define B0011001 25 +#define B00011001 25 +#define B11010 26 +#define B011010 26 +#define B0011010 26 +#define B00011010 26 +#define B11011 27 +#define B011011 27 +#define B0011011 27 +#define B00011011 27 +#define B11100 28 +#define B011100 28 +#define B0011100 28 +#define B00011100 28 +#define B11101 29 +#define B011101 29 +#define B0011101 29 +#define B00011101 29 +#define B11110 30 +#define B011110 30 +#define B0011110 30 +#define B00011110 30 +#define B11111 31 +#define B011111 31 +#define B0011111 31 +#define B00011111 31 +#define B100000 32 +#define B0100000 32 +#define B00100000 32 +#define B100001 33 +#define B0100001 33 +#define B00100001 33 +#define B100010 34 +#define B0100010 34 +#define B00100010 34 +#define B100011 35 +#define B0100011 35 +#define B00100011 35 +#define B100100 36 +#define B0100100 36 +#define B00100100 36 +#define B100101 37 +#define B0100101 37 +#define B00100101 37 +#define B100110 38 +#define B0100110 38 +#define B00100110 38 +#define B100111 39 +#define B0100111 39 +#define B00100111 39 +#define B101000 40 +#define B0101000 40 +#define B00101000 40 +#define B101001 41 +#define B0101001 41 +#define B00101001 41 +#define B101010 42 +#define B0101010 42 +#define B00101010 42 +#define B101011 43 +#define B0101011 43 +#define B00101011 43 +#define B101100 44 +#define B0101100 44 +#define B00101100 44 +#define B101101 45 +#define B0101101 45 +#define B00101101 45 +#define B101110 46 +#define B0101110 46 +#define B00101110 46 +#define B101111 47 +#define B0101111 47 +#define B00101111 47 +#define B110000 48 +#define B0110000 48 +#define B00110000 48 +#define B110001 49 +#define B0110001 49 +#define B00110001 49 +#define B110010 50 +#define B0110010 50 +#define B00110010 50 +#define B110011 51 +#define B0110011 51 +#define B00110011 51 +#define B110100 52 +#define B0110100 52 +#define B00110100 52 +#define B110101 53 +#define B0110101 53 +#define B00110101 53 +#define B110110 54 +#define B0110110 54 +#define B00110110 54 +#define B110111 55 +#define B0110111 55 +#define B00110111 55 +#define B111000 56 +#define B0111000 56 +#define B00111000 56 +#define B111001 57 +#define B0111001 57 +#define B00111001 57 +#define B111010 58 +#define B0111010 58 +#define B00111010 58 +#define B111011 59 +#define B0111011 59 +#define B00111011 59 +#define B111100 60 +#define B0111100 60 +#define B00111100 60 +#define B111101 61 +#define B0111101 61 +#define B00111101 61 +#define B111110 62 +#define B0111110 62 +#define B00111110 62 +#define B111111 63 +#define B0111111 63 +#define B00111111 63 +#define B1000000 64 +#define B01000000 64 +#define B1000001 65 +#define B01000001 65 +#define B1000010 66 +#define B01000010 66 +#define B1000011 67 +#define B01000011 67 +#define B1000100 68 +#define B01000100 68 +#define B1000101 69 +#define B01000101 69 +#define B1000110 70 +#define B01000110 70 +#define B1000111 71 +#define B01000111 71 +#define B1001000 72 +#define B01001000 72 +#define B1001001 73 +#define B01001001 73 +#define B1001010 74 +#define B01001010 74 +#define B1001011 75 +#define B01001011 75 +#define B1001100 76 +#define B01001100 76 +#define B1001101 77 +#define B01001101 77 +#define B1001110 78 +#define B01001110 78 +#define B1001111 79 +#define B01001111 79 +#define B1010000 80 +#define B01010000 80 +#define B1010001 81 +#define B01010001 81 +#define B1010010 82 +#define B01010010 82 +#define B1010011 83 +#define B01010011 83 +#define B1010100 84 +#define B01010100 84 +#define B1010101 85 +#define B01010101 85 +#define B1010110 86 +#define B01010110 86 +#define B1010111 87 +#define B01010111 87 +#define B1011000 88 +#define B01011000 88 +#define B1011001 89 +#define B01011001 89 +#define B1011010 90 +#define B01011010 90 +#define B1011011 91 +#define B01011011 91 +#define B1011100 92 +#define B01011100 92 +#define B1011101 93 +#define B01011101 93 +#define B1011110 94 +#define B01011110 94 +#define B1011111 95 +#define B01011111 95 +#define B1100000 96 +#define B01100000 96 +#define B1100001 97 +#define B01100001 97 +#define B1100010 98 +#define B01100010 98 +#define B1100011 99 +#define B01100011 99 +#define B1100100 100 +#define B01100100 100 +#define B1100101 101 +#define B01100101 101 +#define B1100110 102 +#define B01100110 102 +#define B1100111 103 +#define B01100111 103 +#define B1101000 104 +#define B01101000 104 +#define B1101001 105 +#define B01101001 105 +#define B1101010 106 +#define B01101010 106 +#define B1101011 107 +#define B01101011 107 +#define B1101100 108 +#define B01101100 108 +#define B1101101 109 +#define B01101101 109 +#define B1101110 110 +#define B01101110 110 +#define B1101111 111 +#define B01101111 111 +#define B1110000 112 +#define B01110000 112 +#define B1110001 113 +#define B01110001 113 +#define B1110010 114 +#define B01110010 114 +#define B1110011 115 +#define B01110011 115 +#define B1110100 116 +#define B01110100 116 +#define B1110101 117 +#define B01110101 117 +#define B1110110 118 +#define B01110110 118 +#define B1110111 119 +#define B01110111 119 +#define B1111000 120 +#define B01111000 120 +#define B1111001 121 +#define B01111001 121 +#define B1111010 122 +#define B01111010 122 +#define B1111011 123 +#define B01111011 123 +#define B1111100 124 +#define B01111100 124 +#define B1111101 125 +#define B01111101 125 +#define B1111110 126 +#define B01111110 126 +#define B1111111 127 +#define B01111111 127 +#define B10000000 128 +#define B10000001 129 +#define B10000010 130 +#define B10000011 131 +#define B10000100 132 +#define B10000101 133 +#define B10000110 134 +#define B10000111 135 +#define B10001000 136 +#define B10001001 137 +#define B10001010 138 +#define B10001011 139 +#define B10001100 140 +#define B10001101 141 +#define B10001110 142 +#define B10001111 143 +#define B10010000 144 +#define B10010001 145 +#define B10010010 146 +#define B10010011 147 +#define B10010100 148 +#define B10010101 149 +#define B10010110 150 +#define B10010111 151 +#define B10011000 152 +#define B10011001 153 +#define B10011010 154 +#define B10011011 155 +#define B10011100 156 +#define B10011101 157 +#define B10011110 158 +#define B10011111 159 +#define B10100000 160 +#define B10100001 161 +#define B10100010 162 +#define B10100011 163 +#define B10100100 164 +#define B10100101 165 +#define B10100110 166 +#define B10100111 167 +#define B10101000 168 +#define B10101001 169 +#define B10101010 170 +#define B10101011 171 +#define B10101100 172 +#define B10101101 173 +#define B10101110 174 +#define B10101111 175 +#define B10110000 176 +#define B10110001 177 +#define B10110010 178 +#define B10110011 179 +#define B10110100 180 +#define B10110101 181 +#define B10110110 182 +#define B10110111 183 +#define B10111000 184 +#define B10111001 185 +#define B10111010 186 +#define B10111011 187 +#define B10111100 188 +#define B10111101 189 +#define B10111110 190 +#define B10111111 191 +#define B11000000 192 +#define B11000001 193 +#define B11000010 194 +#define B11000011 195 +#define B11000100 196 +#define B11000101 197 +#define B11000110 198 +#define B11000111 199 +#define B11001000 200 +#define B11001001 201 +#define B11001010 202 +#define B11001011 203 +#define B11001100 204 +#define B11001101 205 +#define B11001110 206 +#define B11001111 207 +#define B11010000 208 +#define B11010001 209 +#define B11010010 210 +#define B11010011 211 +#define B11010100 212 +#define B11010101 213 +#define B11010110 214 +#define B11010111 215 +#define B11011000 216 +#define B11011001 217 +#define B11011010 218 +#define B11011011 219 +#define B11011100 220 +#define B11011101 221 +#define B11011110 222 +#define B11011111 223 +#define B11100000 224 +#define B11100001 225 +#define B11100010 226 +#define B11100011 227 +#define B11100100 228 +#define B11100101 229 +#define B11100110 230 +#define B11100111 231 +#define B11101000 232 +#define B11101001 233 +#define B11101010 234 +#define B11101011 235 +#define B11101100 236 +#define B11101101 237 +#define B11101110 238 +#define B11101111 239 +#define B11110000 240 +#define B11110001 241 +#define B11110010 242 +#define B11110011 243 +#define B11110100 244 +#define B11110101 245 +#define B11110110 246 +#define B11110111 247 +#define B11111000 248 +#define B11111001 249 +#define B11111010 250 +#define B11111011 251 +#define B11111100 252 +#define B11111101 253 +#define B11111110 254 +#define B11111111 255 + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/main.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/main.cpp new file mode 100644 index 00000000..7dfa32af --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/main.cpp @@ -0,0 +1,20 @@ +#include + +int main(void) +{ + init(); + +#if defined(USBCON) + USB.attach(); +#endif + + setup(); + + for (;;) { + loop(); + if (serialEventRun) serialEventRun(); + } + + return 0; +} + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/new.cpp b/Micropendous/Firmware/Arduino1/cores/arduino/new.cpp new file mode 100644 index 00000000..b811dfe6 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/new.cpp @@ -0,0 +1,18 @@ +#include + +void * operator new(size_t size) +{ + return malloc(size); +} + +void operator delete(void * ptr) +{ + free(ptr); +} + +int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);}; +void __cxa_guard_release (__guard *g) {*(char *)g = 1;}; +void __cxa_guard_abort (__guard *) {}; + +void __cxa_pure_virtual(void) {}; + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/new.h b/Micropendous/Firmware/Arduino1/cores/arduino/new.h new file mode 100644 index 00000000..5ba2e134 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/new.h @@ -0,0 +1,22 @@ +/* Header to define new/delete operators as they aren't provided by avr-gcc by default + Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453 + */ + +#ifndef NEW_H +#define NEW_H + +#include + +void * operator new(size_t size); +void operator delete(void * ptr); + +__extension__ typedef int __guard __attribute__((mode (__DI__))); + +extern "C" int __cxa_guard_acquire(__guard *); +extern "C" void __cxa_guard_release (__guard *); +extern "C" void __cxa_guard_abort (__guard *); + +extern "C" void __cxa_pure_virtual(void); + +#endif + diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/wiring.c b/Micropendous/Firmware/Arduino1/cores/arduino/wiring.c new file mode 100644 index 00000000..3f7e6803 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/wiring.c @@ -0,0 +1,297 @@ +/* + wiring.c - Partial implementation of the Wiring API for the ATmega8. + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id$ +*/ + +#include "wiring_private.h" + +// the prescaler is set so that timer0 ticks every 64 clock cycles, and the +// the overflow handler is called every 256 ticks. +#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) + +// the whole number of milliseconds per timer0 overflow +#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) + +// the fractional number of milliseconds per timer0 overflow. we shift right +// by three to fit these numbers into a byte. (for the clock speeds we care +// about - 8 and 16 MHz - this doesn't lose precision.) +#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) +#define FRACT_MAX (1000 >> 3) + +volatile unsigned long timer0_overflow_count = 0; +volatile unsigned long timer0_millis = 0; +static unsigned char timer0_fract = 0; + +#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) +SIGNAL(TIM0_OVF_vect) +#else +SIGNAL(TIMER0_OVF_vect) +#endif +{ + // copy these to local variables so they can be stored in registers + // (volatile variables must be read from memory on every access) + unsigned long m = timer0_millis; + unsigned char f = timer0_fract; + + m += MILLIS_INC; + f += FRACT_INC; + if (f >= FRACT_MAX) { + f -= FRACT_MAX; + m += 1; + } + + timer0_fract = f; + timer0_millis = m; + timer0_overflow_count++; +} + +unsigned long millis() +{ + unsigned long m; + uint8_t oldSREG = SREG; + + // disable interrupts while we read timer0_millis or we might get an + // inconsistent value (e.g. in the middle of a write to timer0_millis) + cli(); + m = timer0_millis; + SREG = oldSREG; + + return m; +} + +unsigned long micros() { + unsigned long m; + uint8_t oldSREG = SREG, t; + + cli(); + m = timer0_overflow_count; +#if defined(TCNT0) + t = TCNT0; +#elif defined(TCNT0L) + t = TCNT0L; +#else + #error TIMER 0 not defined +#endif + + +#ifdef TIFR0 + if ((TIFR0 & _BV(TOV0)) && (t < 255)) + m++; +#else + if ((TIFR & _BV(TOV0)) && (t < 255)) + m++; +#endif + + SREG = oldSREG; + + return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); +} + +void delay(unsigned long ms) +{ + uint16_t start = (uint16_t)micros(); + + while (ms > 0) { + if (((uint16_t)micros() - start) >= 1000) { + ms--; + start += 1000; + } + } +} + +/* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock. */ +void delayMicroseconds(unsigned int us) +{ + // calling avrlib's delay_us() function with low values (e.g. 1 or + // 2 microseconds) gives delays longer than desired. + //delay_us(us); + +#if F_CPU >= 16000000L + // for the 16 MHz clock on most Arduino boards + + // for a one-microsecond delay, simply return. the overhead + // of the function call yields a delay of approximately 1 1/8 us. + if (--us == 0) + return; + + // the following loop takes a quarter of a microsecond (4 cycles) + // per iteration, so execute it four times for each microsecond of + // delay requested. + us <<= 2; + + // account for the time taken in the preceeding commands. + us -= 2; +#else + // for the 8 MHz internal clock on the ATmega168 + + // for a one- or two-microsecond delay, simply return. the overhead of + // the function calls takes more than two microseconds. can't just + // subtract two, since us is unsigned; we'd overflow. + if (--us == 0) + return; + if (--us == 0) + return; + + // the following loop takes half of a microsecond (4 cycles) + // per iteration, so execute it twice for each microsecond of + // delay requested. + us <<= 1; + + // partially compensate for the time taken by the preceeding commands. + // we can't subtract any more than this or we'd overflow w/ small delays. + us--; +#endif + + // busy wait + __asm__ __volatile__ ( + "1: sbiw %0,1" "\n\t" // 2 cycles + "brne 1b" : "=w" (us) : "0" (us) // 2 cycles + ); +} + +void init() +{ + // this needs to be called before setup() or some functions won't + // work there + sei(); + + // on the ATmega168, timer 0 is also used for fast hardware pwm + // (using phase-correct PWM would mean that timer 0 overflowed half as often + // resulting in different millis() behavior on the ATmega8 and ATmega168) +#if defined(TCCR0A) && defined(WGM01) + sbi(TCCR0A, WGM01); + sbi(TCCR0A, WGM00); +#endif + + // set timer 0 prescale factor to 64 +#if defined(__AVR_ATmega128__) + // CPU specific: different values for the ATmega128 + sbi(TCCR0, CS02); +#elif defined(TCCR0) && defined(CS01) && defined(CS00) + // this combination is for the standard atmega8 + sbi(TCCR0, CS01); + sbi(TCCR0, CS00); +#elif defined(TCCR0B) && defined(CS01) && defined(CS00) + // this combination is for the standard 168/328/1280/2560 + sbi(TCCR0B, CS01); + sbi(TCCR0B, CS00); +#elif defined(TCCR0A) && defined(CS01) && defined(CS00) + // this combination is for the __AVR_ATmega645__ series + sbi(TCCR0A, CS01); + sbi(TCCR0A, CS00); +#else + #error Timer 0 prescale factor 64 not set correctly +#endif + + // enable timer 0 overflow interrupt +#if defined(TIMSK) && defined(TOIE0) + sbi(TIMSK, TOIE0); +#elif defined(TIMSK0) && defined(TOIE0) + sbi(TIMSK0, TOIE0); +#else + #error Timer 0 overflow interrupt not set correctly +#endif + + // timers 1 and 2 are used for phase-correct hardware pwm + // this is better for motors as it ensures an even waveform + // note, however, that fast pwm mode can achieve a frequency of up + // 8 MHz (with a 16 MHz clock) at 50% duty cycle + +#if defined(TCCR1B) && defined(CS11) && defined(CS10) + TCCR1B = 0; + + // set timer 1 prescale factor to 64 + sbi(TCCR1B, CS11); +#if F_CPU >= 8000000L + sbi(TCCR1B, CS10); +#endif +#elif defined(TCCR1) && defined(CS11) && defined(CS10) + sbi(TCCR1, CS11); +#if F_CPU >= 8000000L + sbi(TCCR1, CS10); +#endif +#endif + // put timer 1 in 8-bit phase correct pwm mode +#if defined(TCCR1A) && defined(WGM10) + sbi(TCCR1A, WGM10); +#elif defined(TCCR1) + #warning this needs to be finished +#endif + + // set timer 2 prescale factor to 64 +#if defined(TCCR2) && defined(CS22) + sbi(TCCR2, CS22); +#elif defined(TCCR2B) && defined(CS22) + sbi(TCCR2B, CS22); +#else + #warning Timer 2 not finished (may not be present on this CPU) +#endif + + // configure timer 2 for phase correct pwm (8-bit) +#if defined(TCCR2) && defined(WGM20) + sbi(TCCR2, WGM20); +#elif defined(TCCR2A) && defined(WGM20) + sbi(TCCR2A, WGM20); +#else + #warning Timer 2 not finished (may not be present on this CPU) +#endif + +#if defined(TCCR3B) && defined(CS31) && defined(WGM30) + sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64 + sbi(TCCR3B, CS30); + sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode +#endif + +#if defined(TCCR4B) && defined(CS41) && defined(WGM40) + sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 + sbi(TCCR4B, CS40); + sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode +#endif + +#if defined(TCCR5B) && defined(CS51) && defined(WGM50) + sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 + sbi(TCCR5B, CS50); + sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode +#endif + +#if defined(ADCSRA) + // set a2d prescale factor to 128 + // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. + // XXX: this will not work properly for other clock speeds, and + // this code should use F_CPU to determine the prescale factor. + sbi(ADCSRA, ADPS2); + sbi(ADCSRA, ADPS1); + sbi(ADCSRA, ADPS0); + + // enable a2d conversions + sbi(ADCSRA, ADEN); +#endif + + // the bootloader connects pins 0 and 1 to the USART; disconnect them + // here so they can be used as normal digital i/o; they will be + // reconnected in Serial.begin() +#if defined(UCSRB) + UCSRB = 0; +#elif defined(UCSR0B) + UCSR0B = 0; +#endif +} diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/wiring_analog.c b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_analog.c new file mode 100644 index 00000000..1e2be86a --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_analog.c @@ -0,0 +1,270 @@ +/* + wiring_analog.c - analog input and output + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 28 September 2010 by Mark Sproul + + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + +uint8_t analog_reference = DEFAULT; + +void analogReference(uint8_t mode) +{ + // can't actually set the register here because the default setting + // will connect AVCC and the AREF pin, which would cause a short if + // there's something connected to AREF. + analog_reference = mode; +} + +int analogRead(uint8_t pin) +{ + uint8_t low, high; + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + if (pin >= 54) pin -= 54; // allow for channel or pin numbers +#else + if (pin >= 14) pin -= 14; // allow for channel or pin numbers +#endif + +#if defined(__AVR_ATmega32U4__) + pin = analogPinToChannel(pin); + ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); +#elif defined(ADCSRB) && defined(MUX5) + // the MUX5 bit of ADCSRB selects whether we're reading from channels + // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). + ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); +#endif + + // set the analog reference (high two bits of ADMUX) and select the + // channel (low 4 bits). this also sets ADLAR (left-adjust result) + // to 0 (the default). +#if defined(ADMUX) + ADMUX = (analog_reference << 6) | (pin & 0x07); +#endif + + // without a delay, we seem to read from the wrong channel + //delay(1); + +#if defined(ADCSRA) && defined(ADCL) + // start the conversion + sbi(ADCSRA, ADSC); + + // ADSC is cleared when the conversion finishes + while (bit_is_set(ADCSRA, ADSC)); + + // we have to read ADCL first; doing so locks both ADCL + // and ADCH until ADCH is read. reading ADCL second would + // cause the results of each conversion to be discarded, + // as ADCL and ADCH would be locked when it completed. + low = ADCL; + high = ADCH; +#else + // we dont have an ADC, return 0 + low = 0; + high = 0; +#endif + + // combine the two bytes + return (high << 8) | low; +} + +// Right now, PWM output only works on the pins with +// hardware support. These are defined in the appropriate +// pins_*.c file. For the rest of the pins, we default +// to digital output. +void analogWrite(uint8_t pin, int val) +{ + // We need to make sure the PWM output is enabled for those pins + // that support it, as we turn it off when digitally reading or + // writing with them. Also, make sure the pin is in output mode + // for consistenty with Wiring, which doesn't require a pinMode + // call for the analog output pins. + pinMode(pin, OUTPUT); + if (val == 0) + { + digitalWrite(pin, LOW); + } + else if (val == 255) + { + digitalWrite(pin, HIGH); + } + else + { + switch(digitalPinToTimer(pin)) + { + // XXX fix needed for atmega8 + #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__) + case TIMER0A: + // connect pwm to pin on timer 0 + sbi(TCCR0, COM00); + OCR0 = val; // set pwm duty + break; + #endif + + #if defined(TCCR0A) && defined(COM0A1) + case TIMER0A: + // connect pwm to pin on timer 0, channel A + sbi(TCCR0A, COM0A1); + OCR0A = val; // set pwm duty + break; + #endif + + #if defined(TCCR0A) && defined(COM0B1) + case TIMER0B: + // connect pwm to pin on timer 0, channel B + sbi(TCCR0A, COM0B1); + OCR0B = val; // set pwm duty + break; + #endif + + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: + // connect pwm to pin on timer 1, channel A + sbi(TCCR1A, COM1A1); + OCR1A = val; // set pwm duty + break; + #endif + + #if defined(TCCR1A) && defined(COM1B1) + case TIMER1B: + // connect pwm to pin on timer 1, channel B + sbi(TCCR1A, COM1B1); + OCR1B = val; // set pwm duty + break; + #endif + + #if defined(TCCR2) && defined(COM21) + case TIMER2: + // connect pwm to pin on timer 2 + sbi(TCCR2, COM21); + OCR2 = val; // set pwm duty + break; + #endif + + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: + // connect pwm to pin on timer 2, channel A + sbi(TCCR2A, COM2A1); + OCR2A = val; // set pwm duty + break; + #endif + + #if defined(TCCR2A) && defined(COM2B1) + case TIMER2B: + // connect pwm to pin on timer 2, channel B + sbi(TCCR2A, COM2B1); + OCR2B = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: + // connect pwm to pin on timer 3, channel A + sbi(TCCR3A, COM3A1); + OCR3A = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3B1) + case TIMER3B: + // connect pwm to pin on timer 3, channel B + sbi(TCCR3A, COM3B1); + OCR3B = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3C1) + case TIMER3C: + // connect pwm to pin on timer 3, channel C + sbi(TCCR3A, COM3C1); + OCR3C = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4A1) + case TIMER4A: + // connect pwm to pin on timer 4, channel A + sbi(TCCR4A, COM4A1); + OCR4A = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4B1) + case TIMER4B: + // connect pwm to pin on timer 4, channel B + sbi(TCCR4A, COM4B1); + OCR4B = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4C1) + case TIMER4C: + // connect pwm to pin on timer 4, channel C + sbi(TCCR4A, COM4C1); + OCR4C = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4D1) + case TIMER4D: + // connect pwm to pin on timer 4, channel D + sbi(TCCR4A, COM4D1); + OCR4D = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5A1) + case TIMER5A: + // connect pwm to pin on timer 5, channel A + sbi(TCCR5A, COM5A1); + OCR5A = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5B1) + case TIMER5B: + // connect pwm to pin on timer 5, channel B + sbi(TCCR5A, COM5B1); + OCR5B = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5C1) + case TIMER5C: + // connect pwm to pin on timer 5, channel C + sbi(TCCR5A, COM5C1); + OCR5C = val; // set pwm duty + break; + #endif + + case NOT_ON_TIMER: + default: + if (val < 128) { + digitalWrite(pin, LOW); + } else { + digitalWrite(pin, HIGH); + } + } + } +} diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/wiring_digital.c b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_digital.c new file mode 100644 index 00000000..111269a0 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_digital.c @@ -0,0 +1,166 @@ +/* + wiring_digital.c - digital input and output functions + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 28 September 2010 by Mark Sproul + + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#define ARDUINO_MAIN +#include "wiring_private.h" +#include "pins_arduino.h" + +void pinMode(uint8_t pin, uint8_t mode) +{ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile uint8_t *reg; + + if (port == NOT_A_PIN) return; + + // JWS: can I let the optimizer do this? + reg = portModeRegister(port); + + if (mode == INPUT) { + uint8_t oldSREG = SREG; + cli(); + *reg &= ~bit; + SREG = oldSREG; + } else { + uint8_t oldSREG = SREG; + cli(); + *reg |= bit; + SREG = oldSREG; + } +} + +// Forcing this inline keeps the callers from having to push their own stuff +// on the stack. It is a good performance win and only takes 1 more byte per +// user than calling. (It will take more bytes on the 168.) +// +// But shouldn't this be moved into pinMode? Seems silly to check and do on +// each digitalread or write. +// +// Mark Sproul: +// - Removed inline. Save 170 bytes on atmega1280 +// - changed to a switch statment; added 32 bytes but much easier to read and maintain. +// - Added more #ifdefs, now compiles for atmega645 +// +//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); +//static inline void turnOffPWM(uint8_t timer) +static void turnOffPWM(uint8_t timer) +{ + switch (timer) + { + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: cbi(TCCR1A, COM1A1); break; + #endif + #if defined(TCCR1A) && defined(COM1B1) + case TIMER1B: cbi(TCCR1A, COM1B1); break; + #endif + + #if defined(TCCR2) && defined(COM21) + case TIMER2: cbi(TCCR2, COM21); break; + #endif + + #if defined(TCCR0A) && defined(COM0A1) + case TIMER0A: cbi(TCCR0A, COM0A1); break; + #endif + + #if defined(TIMER0B) && defined(COM0B1) + case TIMER0B: cbi(TCCR0A, COM0B1); break; + #endif + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: cbi(TCCR2A, COM2A1); break; + #endif + #if defined(TCCR2A) && defined(COM2B1) + case TIMER2B: cbi(TCCR2A, COM2B1); break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: cbi(TCCR3A, COM3A1); break; + #endif + #if defined(TCCR3A) && defined(COM3B1) + case TIMER3B: cbi(TCCR3A, COM3B1); break; + #endif + #if defined(TCCR3A) && defined(COM3C1) + case TIMER3C: cbi(TCCR3A, COM3C1); break; + #endif + + #if defined(TCCR4A) && defined(COM4A1) + case TIMER4A: cbi(TCCR4A, COM4A1); break; + #endif + #if defined(TCCR4A) && defined(COM4B1) + case TIMER4B: cbi(TCCR4A, COM4B1); break; + #endif + #if defined(TCCR4A) && defined(COM4C1) + case TIMER4C: cbi(TCCR4A, COM4C1); break; + #endif + #if defined(TCCR5A) + case TIMER5A: cbi(TCCR5A, COM5A1); break; + case TIMER5B: cbi(TCCR5A, COM5B1); break; + case TIMER5C: cbi(TCCR5A, COM5C1); break; + #endif + } +} + +void digitalWrite(uint8_t pin, uint8_t val) +{ + uint8_t timer = digitalPinToTimer(pin); + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile uint8_t *out; + + if (port == NOT_A_PIN) return; + + // If the pin that support PWM output, we need to turn it off + // before doing a digital write. + if (timer != NOT_ON_TIMER) turnOffPWM(timer); + + out = portOutputRegister(port); + + uint8_t oldSREG = SREG; + cli(); + + if (val == LOW) { + *out &= ~bit; + } else { + *out |= bit; + } + + SREG = oldSREG; +} + +int digitalRead(uint8_t pin) +{ + uint8_t timer = digitalPinToTimer(pin); + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + + if (port == NOT_A_PIN) return LOW; + + // If the pin that support PWM output, we need to turn it off + // before getting a digital reading. + if (timer != NOT_ON_TIMER) turnOffPWM(timer); + + if (*portInputRegister(port) & bit) return HIGH; + return LOW; +} diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/wiring_private.h b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_private.h new file mode 100644 index 00000000..1aff5583 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_private.h @@ -0,0 +1,67 @@ +/* + wiring_private.h - Internal header file. + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 239 2007-01-12 17:58:39Z mellis $ +*/ + +#ifndef WiringPrivate_h +#define WiringPrivate_h + +#include +#include +#include +#include + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +#define EXTERNAL_INT_0 0 +#define EXTERNAL_INT_1 1 +#define EXTERNAL_INT_2 2 +#define EXTERNAL_INT_3 3 +#define EXTERNAL_INT_4 4 +#define EXTERNAL_INT_5 5 +#define EXTERNAL_INT_6 6 +#define EXTERNAL_INT_7 7 + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define EXTERNAL_NUM_INTERRUPTS 8 +#else +#define EXTERNAL_NUM_INTERRUPTS 2 +#endif + +typedef void (*voidFuncPtr)(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/wiring_pulse.c b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_pulse.c new file mode 100644 index 00000000..64ec799d --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_pulse.c @@ -0,0 +1,69 @@ +/* + wiring_pulse.c - pulseIn() function + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + +/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH + * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds + * to 3 minutes in length, but must be called at least a few dozen microseconds + * before the start of the pulse. */ +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) +{ + // cache the port and bit of the pin in order to speed up the + // pulse width measuring loop and achieve finer resolution. calling + // digitalRead() instead yields much coarser resolution. + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + uint8_t stateMask = (state ? bit : 0); + unsigned long width = 0; // keep initialization out of time critical area + + // convert the timeout from microseconds to a number of times through + // the initial loop; it takes 16 clock cycles per iteration. + unsigned long numloops = 0; + unsigned long maxloops = microsecondsToClockCycles(timeout) / 16; + + // wait for any previous pulse to end + while ((*portInputRegister(port) & bit) == stateMask) + if (numloops++ == maxloops) + return 0; + + // wait for the pulse to start + while ((*portInputRegister(port) & bit) != stateMask) + if (numloops++ == maxloops) + return 0; + + // wait for the pulse to stop + while ((*portInputRegister(port) & bit) == stateMask) { + if (numloops++ == maxloops) + return 0; + width++; + } + + // convert the reading to microseconds. The loop has been determined + // to be 20 clock cycles long and have about 16 clocks between the edge + // and the start of the loop. There will be some error introduced by + // the interrupt handlers. + return clockCyclesToMicroseconds(width * 21 + 16); +} diff --git a/Micropendous/Firmware/Arduino1/cores/arduino/wiring_shift.c b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_shift.c new file mode 100644 index 00000000..b18b6340 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/cores/arduino/wiring_shift.c @@ -0,0 +1,55 @@ +/* + wiring_shift.c - shiftOut() function + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" + +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) { + uint8_t value = 0; + uint8_t i; + + for (i = 0; i < 8; ++i) { + digitalWrite(clockPin, HIGH); + if (bitOrder == LSBFIRST) + value |= digitalRead(dataPin) << i; + else + value |= digitalRead(dataPin) << (7 - i); + digitalWrite(clockPin, LOW); + } + return value; +} + +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) +{ + uint8_t i; + + for (i = 0; i < 8; i++) { + if (bitOrder == LSBFIRST) + digitalWrite(dataPin, !!(val & (1 << i))); + else + digitalWrite(dataPin, !!(val & (1 << (7 - i)))); + + digitalWrite(clockPin, HIGH); + digitalWrite(clockPin, LOW); + } +} diff --git a/Micropendous/Firmware/Arduino1/variants/micropendous/pins_arduino.h b/Micropendous/Firmware/Arduino1/variants/micropendous/pins_arduino.h new file mode 100644 index 00000000..738792e3 --- /dev/null +++ b/Micropendous/Firmware/Arduino1/variants/micropendous/pins_arduino.h @@ -0,0 +1,276 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define ARDUINO_MODEL_USB_PID 0x0034 + +#define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) +#define TXLED0 PORTD |= (1<<5) +#define TXLED1 PORTD &= ~(1<<5) +#define RXLED0 PORTB |= (1<<0) +#define RXLED1 PORTB &= ~(1<<0) + +// Map SPI port to 'new' pins D14..D17 +// D14 PB0 RXLED,SS/PCINT0 +// D15 PB1 SCK,PCINT1 +// D16 PB2 MOSI,PCINT2 +// D17 PB3 MISO,PCINT3 +const static uint8_t SS = 14; +const static uint8_t MOSI = 16; +const static uint8_t MISO = 17; +const static uint8_t SCK = 15; + +const static uint8_t A0 = 14; +const static uint8_t A1 = 15; +const static uint8_t A2 = 16; +const static uint8_t A3 = 17; +const static uint8_t A4 = 18; +const static uint8_t A5 = 19; +const static uint8_t A6 = 20; +const static uint8_t A7 = 21; +const static uint8_t A8 = 22; +const static uint8_t A9 = 23; +const static uint8_t A10 = 24; + +// __AVR_ATmega32U4__ has an unusual mapping of pins to channels +extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; +#define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) + +#ifdef ARDUINO_MAIN + +// On the Arduino board, digital pins are also used +// for the analog output (software PWM). Analog input +// pins are a separate set. + +// ATMEL ATMEGA8 & 168 / ARDUINO +// +// +-\/-+ +// PC6 1| |28 PC5 (AI 5) +// (D 0) PD0 2| |27 PC4 (AI 4) +// (D 1) PD1 3| |26 PC3 (AI 3) +// (D 2) PD2 4| |25 PC2 (AI 2) +// PWM+ (D 3) PD3 5| |24 PC1 (AI 1) +// (D 4) PD4 6| |23 PC0 (AI 0) +// VCC 7| |22 GND +// GND 8| |21 AREF +// PB6 9| |20 AVCC +// PB7 10| |19 PB5 (D 13) +// PWM+ (D 5) PD5 11| |18 PB4 (D 12) +// PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM +// (D 7) PD7 13| |16 PB2 (D 10) PWM +// (D 8) PB0 14| |15 PB1 (D 9) PWM +// +----+ +// +// (PWM+ indicates the additional PWM pins on the ATmega168.) + +// ATMEL ATMEGA1280 / ARDUINO +// +// 0-7 PE0-PE7 works +// 8-13 PB0-PB5 works +// 14-21 PA0-PA7 works +// 22-29 PH0-PH7 works +// 30-35 PG5-PG0 works +// 36-43 PC7-PC0 works +// 44-51 PJ7-PJ0 works +// 52-59 PL7-PL0 works +// 60-67 PD7-PD0 works +// A0-A7 PF0-PF7 +// A8-A15 PK0-PK7 + +// ATMEL ATMEGA32U4 / ARDUINO LEONARDO +// +// D0 PD2 RXD1/INT2 +// D1 PD3 TXD1/INT3 +// D2 PD1 SDA SDA/INT1 +// D3# PD0 PWM8/SCL OC0B/SCL/INT0 +// D4 A6 PD4 ADC8 +// D5# PC6 ??? OC3A/#OC4A +// D6# A7 PD7 FastPWM #OC4D/ADC10 +// D7 PE6 INT6/AIN0 +// +// D8 PB4 ADC11/PCINT4 +// D9# A8 PB5 PWM16 OC1A/#OC4B/ADC13/PCINT5 +// D10# A9 PB6 PWM16 OC1B/0c4B/ADC12/PCINT6 +// D11# PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7 +// D12 A10 PD6 T1/#OC4D/ADC9 +// D13# PC7 PWM10 CLK0/OC4A +// +// A0 PF7 ADC7 +// A1 PF6 ADC6 +// A2 PF5 ADC5 +// A3 PF4 ADC4 +// A4 PF1 ADC1 +// A5 PF0 ADC0 +// +// New pins D14..D17 to map SPI port to digitial pins +// +// D14 PB0 RXLED,SS/PCINT0 +// D15 PB1 SCK,PCINT1 +// D16 PB2 MOSI,PCINT2 +// D17 PB3 MISO,PCINT3 +// +// TXLED PD5 +// RXLED PB0 +// HWB PE2 HWB + + +// these arrays map port names (e.g. port B) to the +// appropriate addresses for various functions (e.g. reading +// and writing) +const uint16_t PROGMEM port_to_mode_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t) &DDRB, + (uint16_t) &DDRC, + (uint16_t) &DDRD, + (uint16_t) &DDRE, + (uint16_t) &DDRF, +}; + +const uint16_t PROGMEM port_to_output_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t) &PORTB, + (uint16_t) &PORTC, + (uint16_t) &PORTD, + (uint16_t) &PORTE, + (uint16_t) &PORTF, +}; + +const uint16_t PROGMEM port_to_input_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t) &PINB, + (uint16_t) &PINC, + (uint16_t) &PIND, + (uint16_t) &PINE, + (uint16_t) &PINF, +}; + +const uint8_t PROGMEM digital_pin_to_port_PGM[18] = { + PD, /* 0 */ + PD, + PD, + PD, + PD, + PC, /* 5 */ + PD, /* 6 */ + PE, /* 7 */ + + PB, /* 8 */ + PB, + PB, + PB, + + PD, /* 12 */ + PC, /* 13 */ + + PB, /* 14 */ + PB, /* 15 */ + PB, /* 16 */ + PB, /* 17 */ +}; + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[18] = { + _BV(2), /* 0, port D */ + _BV(3), + _BV(1), + _BV(0), + _BV(4), + _BV(6), /* 5, port C */ + _BV(7), /* 6, port D */ + _BV(6), /* 7, port E */ + + _BV(4), /* 8, port B */ + _BV(5), + _BV(6), + _BV(7), + + _BV(6), /* 12 port D */ + _BV(7), + + _BV(0), /* 14, port B */ + _BV(1), + _BV(2), + _BV(3), +}; + +const uint8_t PROGMEM digital_pin_to_timer_PGM[18] = { + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + TIMER0B, /* 3 */ + NOT_ON_TIMER, + TIMER3A, /* 5 */ + TIMER4D, /* 6 */ + NOT_ON_TIMER, + + NOT_ON_TIMER, + TIMER1A, /* 9 */ + TIMER1B, /* 10 */ + TIMER0A, /* 11 */ + + NOT_ON_TIMER, + TIMER4A, /* 13 */ + + NOT_ON_TIMER, + NOT_ON_TIMER, +}; + +const uint8_t PROGMEM analog_pin_to_channel_PGM[11] = { + /* + A0 PF7 ADC7 + A1 PF6 ADC6 + A2 PF5 ADC5 + A3 PF4 ADC4 + A4 PF1 ADC1 + A5 PF0 ADC0 + D4 A6 PD4 ADC8 + D6 A7 PD7 FastPWM #OC4D/ADC10 + D9 A8 PB5 PWM16 OC1A/#OC4B/ADC13/PCINT5 + D10 A9 PB6 PWM16 OC1B/0c4B/ADC12/PCINT6 + D12 A10 PD6 T1/#OC4D/ADC9 + */ + + 7, + 6, + 5, + 4, + 1, + 0, + 8, + 10, + + 13, + 12, + 9 +}; + +#endif + +#endif \ No newline at end of file diff --git a/Micropendous/Firmware/Arduino1_Bootloader/DiskLoader_Micropendous_Rev2_Working.hex b/Micropendous/Firmware/Arduino1_Bootloader/DiskLoader_Micropendous_Rev2_Working.hex new file mode 100644 index 00000000..808ac7ad --- /dev/null +++ b/Micropendous/Firmware/Arduino1_Bootloader/DiskLoader_Micropendous_Rev2_Working.hex @@ -0,0 +1,143 @@ +:020000021000EC +:10E00000D7C00000F2C00000F0C00000EEC0000069 +:10E01000ECC00000EAC00000E8C00000E6C000005C +:10E02000E4C00000E2C00000E0C00000DEC000006C +:10E03000DCC00000DAC00000D8C00000D6C000007C +:10E04000D4C00000D2C00000D0C00000CEC000008C +:10E05000CCC00000CAC00000C8C00000C6C000009C +:10E06000C4C00000C2C00000C0C00000BEC00000AC +:10E07000BCC00000BAC00000B8C00000B6C00000BC +:10E08000B4C00000B2C00000B0C00000AEC00000CC +:10E09000ACC00000AAC0000041014214450556046E +:10E0A00055026403740300001E97820201100300EE +:10E0B00000C18081C106C0FF0A000CA10185037563 +:10E0C00008150026FF0095400901810295400902CC +:10E0D0009102C00403090438034100720064007512 +:10E0E0000069006E006F0020004C0065006F006E3C +:10E0F000006100720064006F00200062006F006F1A +:10E100000074006C006F006100640065007200180C +:10E1100003410072006400750069006E006F00200A +:10E12000004C004C0043001201000202000040417C +:10E13000233400000101020001120100020000006E +:10E140004041233400000101020001090264000380 +:10E1500001008032080B00020202010009040000E5 +:10E160000102020000052400100105240101010440 +:10E17000240202052406000107058103100040095E +:10E18000040100020A000000070502024000000727 +:10E190000583024000000904020001030000000999 +:10E1A0002101010001221E000705840340004000F8 +:10E1B00011241FBECFEFD0E2DEBFCDBF11E0A0E043 +:10E1C000B1E0EEEAF8EE01E00BBF02C007900D925D +:10E1D000A830B107D9F711E0A8E0B1E001C01D9265 +:10E1E000AB39B107E1F781D060C30ACF20918A0132 +:10E1F00030918B012C5F3F4F30938B0120938A012C +:10E20000C901892F99278695982F803418F08FE7B8 +:10E21000891B982F990F921710F429980895299A1D +:10E2200008950000000081E08093E0001092E20079 +:10E23000EE27FF2709940895FF920F931F93CF9322 +:10E24000DF93382FEB01042F10E080EE6030780769 +:10E2500058F411E0CB01A0E0B0E023E0FC01A09372 +:10E260005B0020935700E895832F68E071E0402F12 +:10E2700025D1112309F433C007B600FCFDCF402F90 +:10E280004695BE0108E011E050E0FF24F39414C06D +:10E29000CB01AA2797FDA095BA2FF80121913191C2 +:10E2A0008F010901FC01A0935B00F0925700E895F3 +:10E2B00011246E5F7F4F5F5F541750F3CE01A0E0D3 +:10E2C000B0E025E0FC01A0935B0020935700E895A7 +:10E2D00007B600FCFDCF81E180935700E895DF9100 +:10E2E000CF911F910F91FF900895BF92CF92DF922F +:10E2F000EF92FF920F931F93CF93DF9384B7877FA3 +:10E3000084BF88E10FB6F89480936000109260009B +:10E310000FBE00000000299A219A209A90E890935D +:10E3200061001092610081E885BF95BF73986B9A78 +:10E33000779A6F9AA5D084E18093880180E18093D9 +:10E34000890180E090E0A0E0B0E0ABBFFC018791E4 +:10E3500096918F5F9F4F19F081E080938F01EE249B +:10E36000FF24BB24B39454EFC52E51E0D52E62D2C6 +:10E37000082F28E930EEC901AA2797FDA095BA2FEA +:10E38000ABBFFC0157912F5F3F4FC901AA2797FDF3 +:10E39000A095BA2F2F5F3F4FABBFFC01479150179D +:10E3A00011F0552341F7109291011092900182E0F3 +:10E3B00068E071E083D0013479F46091080160581D +:10E3C000633028F0683111F064E001C063E0C62FCB +:10E3D000D0E0C555DF410EC0063571F480910801CB +:10E3E000803311F011E022C080910A01C82FD0E0E3 +:10E3F000C855DF4111E022C0053721F413E0C8EA17 +:10E40000D0EE1CC0053539F4E0900801F090090108 +:10E41000EE0CFF1C0AC0043631F482E0B7014091D3 +:10E4200009010ADF02C0043721F010E0CFEAD0EE84 +:10E4300005C010910901E701E10EF11CFBD18097A5 +:10E44000B1F483E068E871E041E050E056D0112378 +:10E4500029F0412F50E083E8BE014FD083E469E802 +:10E4600071E041E050E049D0013509F080CFD09211 +:10E470009101C0929001B0928F01EE24FF2477CFDA +:10E48000109291011092900110928E0110928F01C2 +:10E4900081E08093E0006F9A779881E88093D700BD +:10E4A00080EA8093D80086E189BD09B400FEFDCFE3 +:10E4B00080E98093D8001092E0000895FB018093DA +:10E4C000E9008091EB0081608093EB0024E69BE6FD +:10E4D00011C08091E80085FFFCCF000020938D01E2 +:10E4E0008091F10081938091E80085FD02C09093B6 +:10E4F000E8004150442369F70895CF93DF93282F14 +:10E50000EB01382F307287708093E9008091EB0027 +:10E5100081608093EB0074E66AE31EC08091E8009E +:10E5200085FFFCCF27FF09C0CE01AA2797FDA09544 +:10E53000BA2FABBFFC01879101C0888121963111B0 +:10E5400080E0000070938C018093F1008091E800DE +:10E5500085FD02C06093E800415050408FEF4F3F6F +:10E560005807E1F626FF03C08AE38093E800DF91B5 +:10E57000CF91089580919301813299F4000084E64F +:10E5800080938C0120E030E003C080818093F10013 +:10E59000F901E050FF4F2F5F3F4F28303105A9F7B9 +:10E5A00022C08032D1F48091E80082FFFCCF0000CD +:10E5B00084E680938D0120E030E003C08091F1007B +:10E5C0008083F901E050FF4F2F5F3F4F2830310526 +:10E5D000A9F78BEF8093E80006C0823221F4809186 +:10E5E00094018093070181E00895209195012232E2 +:10E5F00061F1213081F480919801909199010897FF +:10E6000011F420939A0180919A01882309F052C055 +:10E6100029E331EE51C0223021F484E62BE431EEBF +:10E6200017C0233009F044C080919401882319F465 +:10E6300023ED30EE41C0823019F427ED30EE3CC0BE +:10E640008130B1F52FE031EE37C081E025EB30EEBF +:10E6500090919801582F981708F4592F90918C0198 +:10E6600040E06EEF8091E8008570E1F38091E80072 +:10E6700082FD1AC04F5FC901AA2797FDA095BA2F46 +:10E68000ABBFFC01879100008093F100842F8F7352 +:10E6900011F46093E8002F5F3F4F94E6451710F3A5 +:10E6A00090938C0181E0089590938C0180E008950F +:10E6B00080E0089527E231EEC901AA2797FDA095D1 +:10E6C000BA2FABBFFC018791C3CF1092E9008091B4 +:10E6D000EB0081608093EB008091E80083FF75C0C0 +:10E6E000000084E680938D01E2E9F1E003C08091AF +:10E6F000F100819381E0EA39F807C9F782EF80934E +:10E70000E8008091920187FF05C08091E80080FFBA +:10E71000FCCF03C08EEF8093E80080919301853099 +:10E7200051F48091E80080FFFCCF809194018068D3 +:10E730008093E30043C0893031F580919401809348 +:10E740008E0121EB30EE41E056E34093E9008091E9 +:10E75000EB0081608093EB00C901AA2797FDA0958B +:10E76000BA2FABBFFC0187918093EC005093ED0072 +:10E770004F5F2F5F3F4F453041F78EE18093EA00B6 +:10E780001092EA001BC0883049F490918E0100007D +:10E7900084E680938C019093F10010C0882339F4B3 +:10E7A000000084E680938C011092F10007C086304F +:10E7B00011F41BDF01C0DEDE882321F08EEF809391 +:10E7C000E800089581E28093EB0008958091E100D4 +:10E7D0001092E100282F83FF0EC01092E900809173 +:10E7E000EB0081608093EB001092EC0082E3809359 +:10E7F000ED0010928E0122FF1CC080918C018823B5 +:10E8000031F0815080938C01882309F400008091BD +:10E810008D01882331F0815080938D01882309F484 +:10E82000000080918F01882321F4109291011092B1 +:10E83000900108951F93CF93DF9312E0C0E9D1E0D8 +:10E8400044DFC4DF1093E9008091EB008160809386 +:10E85000EB008091E80085FF13C0000084E6809300 +:10E860008D019091F1008091E80085FD03C08BE659 +:10E870008093E800892F90E0DF91CF911F91089558 +:10E8800080919001909191010197909391018093D3 +:10E8900090018091900190919101892B09F4C1DC44 +:0EE8A000CE010197F1F7A2DCCBCFF894FFCFA9 +:08E8AE0000E100000000000081 +:040000031000E00009 +:00000001FF diff --git a/Micropendous/Firmware/Arduino1_Bootloader/src/DiskLoader.cpp b/Micropendous/Firmware/Arduino1_Bootloader/src/DiskLoader.cpp index 71276ec5..797f595a 100644 --- a/Micropendous/Firmware/Arduino1_Bootloader/src/DiskLoader.cpp +++ b/Micropendous/Firmware/Arduino1_Bootloader/src/DiskLoader.cpp @@ -137,8 +137,15 @@ int main() _inSync = STK_INSYNC; _ok = STK_OK; + + #if (FLASHEND > 0xFFFF) + if (((int16_t)pgm_read_word_far(0)) != ((int16_t)(-1))) + _ejected = 1; + #else if (((int16_t)pgm_read_word(0)) != ((int16_t)(-1))) _ejected = 1; + #endif + for(;;) { @@ -153,8 +160,14 @@ int main() const u8* rs = _readSize; for(;;) { + #if (FLASHEND > 0xFFFF) + u8 c = pgm_read_byte_far(rs++); + len = pgm_read_byte_far(rs++); + #else u8 c = pgm_read_byte(rs++); len = pgm_read_byte(rs++); + #endif + if (c == cmd || c == 0) break; } diff --git a/Micropendous/Firmware/Arduino1_Bootloader/src/USBCore.cpp b/Micropendous/Firmware/Arduino1_Bootloader/src/USBCore.cpp index 5a7093df..571ef85d 100644 --- a/Micropendous/Firmware/Arduino1_Bootloader/src/USBCore.cpp +++ b/Micropendous/Firmware/Arduino1_Bootloader/src/USBCore.cpp @@ -120,6 +120,7 @@ static inline void Send8(u8 d) static inline void SetEP(u8 ep) { UENUM = ep; + UECONX |= (1 << EPEN); // TODO: is this needed? } static inline u8 FifoByteCount() @@ -181,7 +182,7 @@ static inline u8 FrameNumber() static void InitEP(u8 index, u8 type, u8 size) { UENUM = index; - UECONX = 1; + UECONX |= (1 << EPEN); UECFG0X = type; UECFG1X = size; } @@ -193,6 +194,8 @@ void USBInit(void) _usbConfiguration = 0; _ejected = 0; + UDCON = (1 << DETACH); + // TODO: correctly check for other boards DDRE |= (1 << PE7); PORTE &= ~(1 << PE7); // enable the USB signal switch to the USB-B connector @@ -208,7 +211,7 @@ void USBInit(void) #endif - USBCON = ((1< 0xFFFF) + u8 d = (ep & TRANSFER_PGM) ? pgm_read_byte_far(data) : data[0]; + #else u8 d = (ep & TRANSFER_PGM) ? pgm_read_byte(data) : data[0]; + #endif + data++; if (zero) d = 0; @@ -305,8 +313,14 @@ static void InitEndpoints() for (u8 i = 1; i < sizeof(_initEndpoints); i++) { UENUM = i; - UECONX = 1; + UECONX |= (1 << EPEN); + + #if (FLASHEND > 0xFFFF) + UECFG0X = pgm_read_byte_far(_initEndpoints+i); + #else UECFG0X = pgm_read_byte(_initEndpoints+i); + #endif + UECFG1X = EP_DOUBLE_64; } @@ -426,7 +440,11 @@ bool SendDescriptor() return false; if (desc_length == 0) + #if (FLASHEND > 0xFFFF) + desc_length = pgm_read_byte_far(desc_addr); + #else desc_length = pgm_read_byte(desc_addr); + #endif if ((u8)setup.wLength < desc_length) // bit of a cheat limiting to 255 bytes TODO (saved 8 bytes) desc_length = (u8)setup.wLength; @@ -438,7 +456,11 @@ bool SendDescriptor() { if (!WaitForINOrOUT()) return false; + #if (FLASHEND > 0xFFFF) + Send8(pgm_read_byte_far(&desc_addr[n++])); + #else Send8(pgm_read_byte(&desc_addr[n++])); + #endif u8 clr = n & 0x3F; if (!clr) ClearIN(); // Fifo is full, release this packet diff --git a/Micropendous/libs/Arduino1/boards.txt b/Micropendous/libs/Arduino1/boards.txt new file mode 100644 index 00000000..feb8158c --- /dev/null +++ b/Micropendous/libs/Arduino1/boards.txt @@ -0,0 +1,453 @@ +############################################################## + +uno.name=Arduino Uno +uno.upload.protocol=arduino +uno.upload.maximum_size=32256 +uno.upload.speed=115200 +uno.bootloader.low_fuses=0xff +uno.bootloader.high_fuses=0xde +uno.bootloader.extended_fuses=0x05 +uno.bootloader.path=optiboot +uno.bootloader.file=optiboot_atmega328.hex +uno.bootloader.unlock_bits=0x3F +uno.bootloader.lock_bits=0x0F +uno.build.mcu=atmega328p +uno.build.f_cpu=16000000L +uno.build.core=arduino +uno.build.variant=standard + +############################################################## + +atmega328.name=Arduino Duemilanove w/ ATmega328 + +atmega328.upload.protocol=arduino +atmega328.upload.maximum_size=30720 +atmega328.upload.speed=57600 + +atmega328.bootloader.low_fuses=0xFF +atmega328.bootloader.high_fuses=0xDA +atmega328.bootloader.extended_fuses=0x05 +atmega328.bootloader.path=atmega +atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex +atmega328.bootloader.unlock_bits=0x3F +atmega328.bootloader.lock_bits=0x0F + +atmega328.build.mcu=atmega328p +atmega328.build.f_cpu=16000000L +atmega328.build.core=arduino +atmega328.build.variant=standard + +############################################################## + +diecimila.name=Arduino Diecimila or Duemilanove w/ ATmega168 + +diecimila.upload.protocol=arduino +diecimila.upload.maximum_size=14336 +diecimila.upload.speed=19200 + +diecimila.bootloader.low_fuses=0xff +diecimila.bootloader.high_fuses=0xdd +diecimila.bootloader.extended_fuses=0x00 +diecimila.bootloader.path=atmega +diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex +diecimila.bootloader.unlock_bits=0x3F +diecimila.bootloader.lock_bits=0x0F + +diecimila.build.mcu=atmega168 +diecimila.build.f_cpu=16000000L +diecimila.build.core=arduino +diecimila.build.variant=standard + +############################################################## + +nano328.name=Arduino Nano w/ ATmega328 + +nano328.upload.protocol=arduino +nano328.upload.maximum_size=30720 +nano328.upload.speed=57600 + +nano328.bootloader.low_fuses=0xFF +nano328.bootloader.high_fuses=0xDA +nano328.bootloader.extended_fuses=0x05 +nano328.bootloader.path=atmega +nano328.bootloader.file=ATmegaBOOT_168_atmega328.hex +nano328.bootloader.unlock_bits=0x3F +nano328.bootloader.lock_bits=0x0F + +nano328.build.mcu=atmega328p +nano328.build.f_cpu=16000000L +nano328.build.core=arduino +nano328.build.variant=eightanaloginputs + +############################################################## + +nano.name=Arduino Nano w/ ATmega168 + +nano.upload.protocol=arduino +nano.upload.maximum_size=14336 +nano.upload.speed=19200 + +nano.bootloader.low_fuses=0xff +nano.bootloader.high_fuses=0xdd +nano.bootloader.extended_fuses=0x00 +nano.bootloader.path=atmega +nano.bootloader.file=ATmegaBOOT_168_diecimila.hex +nano.bootloader.unlock_bits=0x3F +nano.bootloader.lock_bits=0x0F + +nano.build.mcu=atmega168 +nano.build.f_cpu=16000000L +nano.build.core=arduino +nano.build.variant=eightanaloginputs + +############################################################## + +mega2560.name=Arduino Mega 2560 or Mega ADK + +mega2560.upload.protocol=stk500v2 +mega2560.upload.maximum_size=258048 +mega2560.upload.speed=115200 + +mega2560.bootloader.low_fuses=0xFF +mega2560.bootloader.high_fuses=0xD8 +mega2560.bootloader.extended_fuses=0xFD +mega2560.bootloader.path=stk500v2 +mega2560.bootloader.file=stk500boot_v2_mega2560.hex +mega2560.bootloader.unlock_bits=0x3F +mega2560.bootloader.lock_bits=0x0F + +mega2560.build.mcu=atmega2560 +mega2560.build.f_cpu=16000000L +mega2560.build.core=arduino +mega2560.build.variant=mega + +############################################################## + +mega.name=Arduino Mega (ATmega1280) + +mega.upload.protocol=arduino +mega.upload.maximum_size=126976 +mega.upload.speed=57600 + +mega.bootloader.low_fuses=0xFF +mega.bootloader.high_fuses=0xDA +mega.bootloader.extended_fuses=0xF5 +mega.bootloader.path=atmega +mega.bootloader.file=ATmegaBOOT_168_atmega1280.hex +mega.bootloader.unlock_bits=0x3F +mega.bootloader.lock_bits=0x0F + +mega.build.mcu=atmega1280 +mega.build.f_cpu=16000000L +mega.build.core=arduino +mega.build.variant=mega + +############################################################## + +leonardo.name=Arduino Leonardo +leonardo.upload.protocol=arduino +leonardo.upload.maximum_size=30720 +leonardo.upload.speed=1200 +leonardo.bootloader.low_fuses=0xde +leonardo.bootloader.high_fuses=0xda +leonardo.bootloader.extended_fuses=0xcb +leonardo.bootloader.path=diskloader +leonardo.bootloader.file=DiskLoader-Leonardo.hex +leonardo.bootloader.unlock_bits=0x3F +leonardo.bootloader.lock_bits=0x2F +leonardo.build.mcu=atmega32u4 +leonardo.build.f_cpu=16000000L +leonardo.build.core=arduino +leonardo.build.variant=leonardo + +############################################################## + +#micro.name=Arduino Micro +#micro.upload.protocol=arduino +#micro.upload.maximum_size=30720 +#micro.upload.speed=1200 +#micro.bootloader.low_fuses=0xde +#micro.bootloader.high_fuses=0xda +#micro.bootloader.extended_fuses=0xcb +#micro.bootloader.path=diskloader +#micro.bootloader.file=DiskLoader-Micro.hex +#micro.bootloader.unlock_bits=0x3F +#micro.bootloader.lock_bits=0x2F +#micro.build.mcu=atmega32u4 +#micro.build.f_cpu=16000000L +#micro.build.core=arduino +#micro.build.variant=micro + +############################################################## + +mini.name=Arduino Mini + +mini.upload.protocol=arduino +mini.upload.maximum_size=14336 +mini.upload.speed=19200 + +mini.bootloader.low_fuses=0xff +mini.bootloader.high_fuses=0xdd +mini.bootloader.extended_fuses=0x00 +mini.bootloader.path=atmega +mini.bootloader.file=ATmegaBOOT_168_ng.hex +mini.bootloader.unlock_bits=0x3F +mini.bootloader.lock_bits=0x0F + +mini.build.mcu=atmega168 +mini.build.f_cpu=16000000L +mini.build.core=arduino +mini.build.variant=eightanaloginputs + +############################################################## + +ethernet.name=Arduino Ethernet + +ethernet.upload.protocol=arduino +ethernet.upload.maximum_size=32256 +ethernet.upload.speed=115200 + +ethernet.bootloader.low_fuses=0xff +ethernet.bootloader.high_fuses=0xde +ethernet.bootloader.extended_fuses=0x05 +ethernet.bootloader.path=optiboot +ethernet.bootloader.file=optiboot_atmega328.hex +ethernet.bootloader.unlock_bits=0x3F +ethernet.bootloader.lock_bits=0x0F + +ethernet.build.variant=standard +ethernet.build.mcu=atmega328p +ethernet.build.f_cpu=16000000L +ethernet.build.core=arduino + +############################################################## + +fio.name=Arduino Fio + +fio.upload.protocol=arduino +fio.upload.maximum_size=30720 +fio.upload.speed=57600 + +fio.bootloader.low_fuses=0xFF +fio.bootloader.high_fuses=0xDA +fio.bootloader.extended_fuses=0x05 +fio.bootloader.path=arduino:atmega +fio.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex +fio.bootloader.unlock_bits=0x3F +fio.bootloader.lock_bits=0x0F + +fio.build.mcu=atmega328p +fio.build.f_cpu=8000000L +fio.build.core=arduino +fio.build.variant=eightanaloginputs + +############################################################## + +bt328.name=Arduino BT w/ ATmega328 + +bt328.upload.protocol=arduino +bt328.upload.maximum_size=28672 +bt328.upload.speed=19200 +bt328.upload.disable_flushing=true + +bt328.bootloader.low_fuses=0xff +bt328.bootloader.high_fuses=0xd8 +bt328.bootloader.extended_fuses=0x05 +bt328.bootloader.path=bt +bt328.bootloader.file=ATmegaBOOT_168_atmega328_bt.hex +bt328.bootloader.unlock_bits=0x3F +bt328.bootloader.lock_bits=0x0F + +bt328.build.mcu=atmega328p +bt328.build.f_cpu=16000000L +bt328.build.core=arduino +bt328.build.variant=eightanaloginputs + +############################################################## + +bt.name=Arduino BT w/ ATmega168 + +bt.upload.protocol=arduino +bt.upload.maximum_size=14336 +bt.upload.speed=19200 +bt.upload.disable_flushing=true + +bt.bootloader.low_fuses=0xff +bt.bootloader.high_fuses=0xdd +bt.bootloader.extended_fuses=0x00 +bt.bootloader.path=bt +bt.bootloader.file=ATmegaBOOT_168.hex +bt.bootloader.unlock_bits=0x3F +bt.bootloader.lock_bits=0x0F + +bt.build.mcu=atmega168 +bt.build.f_cpu=16000000L +bt.build.core=arduino +bt.build.variant=eightanaloginputs + +############################################################## + +lilypad328.name=LilyPad Arduino w/ ATmega328 + +lilypad328.upload.protocol=arduino +lilypad328.upload.maximum_size=30720 +lilypad328.upload.speed=57600 + +lilypad328.bootloader.low_fuses=0xFF +lilypad328.bootloader.high_fuses=0xDA +lilypad328.bootloader.extended_fuses=0x05 +lilypad328.bootloader.path=atmega +lilypad328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex +lilypad328.bootloader.unlock_bits=0x3F +lilypad328.bootloader.lock_bits=0x0F + +lilypad328.build.mcu=atmega328p +lilypad328.build.f_cpu=8000000L +lilypad328.build.core=arduino +lilypad328.build.variant=standard + +############################################################## + +lilypad.name=LilyPad Arduino w/ ATmega168 + +lilypad.upload.protocol=arduino +lilypad.upload.maximum_size=14336 +lilypad.upload.speed=19200 + +lilypad.bootloader.low_fuses=0xe2 +lilypad.bootloader.high_fuses=0xdd +lilypad.bootloader.extended_fuses=0x00 +lilypad.bootloader.path=lilypad +lilypad.bootloader.file=LilyPadBOOT_168.hex +lilypad.bootloader.unlock_bits=0x3F +lilypad.bootloader.lock_bits=0x0F + +lilypad.build.mcu=atmega168 +lilypad.build.f_cpu=8000000L +lilypad.build.core=arduino +lilypad.build.variant=standard + +############################################################## + +pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 + +pro5v328.upload.protocol=arduino +pro5v328.upload.maximum_size=30720 +pro5v328.upload.speed=57600 + +pro5v328.bootloader.low_fuses=0xFF +pro5v328.bootloader.high_fuses=0xDA +pro5v328.bootloader.extended_fuses=0x05 +pro5v328.bootloader.path=atmega +pro5v328.bootloader.file=ATmegaBOOT_168_atmega328.hex +pro5v328.bootloader.unlock_bits=0x3F +pro5v328.bootloader.lock_bits=0x0F + +pro5v328.build.mcu=atmega328p +pro5v328.build.f_cpu=16000000L +pro5v328.build.core=arduino +pro5v328.build.variant=standard + +############################################################## + +pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 + +pro5v.upload.protocol=arduino +pro5v.upload.maximum_size=14336 +pro5v.upload.speed=19200 + +pro5v.bootloader.low_fuses=0xff +pro5v.bootloader.high_fuses=0xdd +pro5v.bootloader.extended_fuses=0x00 +pro5v.bootloader.path=atmega +pro5v.bootloader.file=ATmegaBOOT_168_diecimila.hex +pro5v.bootloader.unlock_bits=0x3F +pro5v.bootloader.lock_bits=0x0F + +pro5v.build.mcu=atmega168 +pro5v.build.f_cpu=16000000L +pro5v.build.core=arduino +pro5v.build.variant=standard + +############################################################## + +pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 + +pro328.upload.protocol=arduino +pro328.upload.maximum_size=30720 +pro328.upload.speed=57600 + +pro328.bootloader.low_fuses=0xFF +pro328.bootloader.high_fuses=0xDA +pro328.bootloader.extended_fuses=0x05 +pro328.bootloader.path=atmega +pro328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex +pro328.bootloader.unlock_bits=0x3F +pro328.bootloader.lock_bits=0x0F + +pro328.build.mcu=atmega328p +pro328.build.f_cpu=8000000L +pro328.build.core=arduino +pro328.build.variant=standard + +############################################################## + +pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 + +pro.upload.protocol=arduino +pro.upload.maximum_size=14336 +pro.upload.speed=19200 + +pro.bootloader.low_fuses=0xc6 +pro.bootloader.high_fuses=0xdd +pro.bootloader.extended_fuses=0x00 +pro.bootloader.path=atmega +pro.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex +pro.bootloader.unlock_bits=0x3F +pro.bootloader.lock_bits=0x0F + +pro.build.mcu=atmega168 +pro.build.f_cpu=8000000L +pro.build.core=arduino +pro.build.variant=standard + +############################################################## + +atmega168.name=Arduino NG or older w/ ATmega168 + +atmega168.upload.protocol=arduino +atmega168.upload.maximum_size=14336 +atmega168.upload.speed=19200 + +atmega168.bootloader.low_fuses=0xff +atmega168.bootloader.high_fuses=0xdd +atmega168.bootloader.extended_fuses=0x00 +atmega168.bootloader.path=atmega +atmega168.bootloader.file=ATmegaBOOT_168_ng.hex +atmega168.bootloader.unlock_bits=0x3F +atmega168.bootloader.lock_bits=0x0F + +atmega168.build.mcu=atmega168 +atmega168.build.f_cpu=16000000L +atmega168.build.core=arduino +atmega168.build.variant=standard + +############################################################## + +atmega8.name=Arduino NG or older w/ ATmega8 + +atmega8.upload.protocol=arduino +atmega8.upload.maximum_size=7168 +atmega8.upload.speed=19200 + +atmega8.bootloader.low_fuses=0xdf +atmega8.bootloader.high_fuses=0xca +atmega8.bootloader.path=atmega8 +atmega8.bootloader.file=ATmegaBOOT.hex +atmega8.bootloader.unlock_bits=0x3F +atmega8.bootloader.lock_bits=0x0F + +atmega8.build.mcu=atmega8 +atmega8.build.f_cpu=16000000L +atmega8.build.core=arduino +atmega8.build.variant=standard