From 6bec6f54f80c85cfd39698ddb39a43ba0bc08377 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 8 Feb 2025 08:55:34 +0800 Subject: [PATCH] add .class gitignore and formated every file --- .gitignore | 21 ++ .../frc/FSLib2025/math/LinearRegression.class | Bin 800 -> 0 bytes bin/main/frc/FSLib2025/math/Maths.class | Bin 920 -> 0 bytes .../state_machine/StateMachine.class | Bin 1979 -> 0 bytes .../state_machine/SuperstructureState.class | Bin 1250 -> 0 bytes .../FSLib2025/swerve/OnboardModuleState.class | Bin 1722 -> 0 bytes .../FSLib2025/swerve/SwerveModuleConfig.class | Bin 684 -> 0 bytes .../swerve/SwerveModuleConstants.class | Bin 430 -> 0 bytes .../util/LocalADStarAK$ADStarIO.class | Bin 3241 -> 0 bytes .../frc/FSLib2025/util/LocalADStarAK.class | Bin 2914 -> 0 bytes .../LimelightHelpers$LimelightResults.class | Bin 3560 -> 0 bytes ...lightHelpers$LimelightTarget_Barcode.class | Bin 482 -> 0 bytes ...htHelpers$LimelightTarget_Classifier.class | Bin 909 -> 0 bytes ...ightHelpers$LimelightTarget_Detector.class | Bin 901 -> 0 bytes ...ightHelpers$LimelightTarget_Fiducial.class | Bin 2436 -> 0 bytes ...melightHelpers$LimelightTarget_Retro.class | Bin 2314 -> 0 bytes .../LimelightHelpers$PoseEstimate.class | Bin 1323 -> 0 bytes .../LimelightHelpers$RawDetection.class | Bin 1166 -> 0 bytes .../vision/LimelightHelpers$RawFiducial.class | Bin 863 -> 0 bytes .../FSLib2025/vision/LimelightHelpers.class | Bin 24414 -> 0 bytes .../frc/robot/Constants$RobotConstants.class | Bin 572 -> 0 bytes .../Constants$SuperstructureConstants.class | Bin 1867 -> 0 bytes .../frc/robot/Constants$SwerveConstants.class | Bin 2840 -> 0 bytes bin/main/frc/robot/Constants.class | Bin 538 -> 0 bytes bin/main/frc/robot/Main.class | Bin 1044 -> 0 bytes bin/main/frc/robot/Robot.class | Bin 2341 -> 0 bytes bin/main/frc/robot/RobotContainer.class | Bin 1939 -> 0 bytes .../frc/robot/commands/TeleopSwerve.class | Bin 2684 -> 0 bytes bin/main/frc/robot/subsystems/Elevator.class | Bin 4611 -> 0 bytes bin/main/frc/robot/subsystems/Grabber.class | Bin 1978 -> 0 bytes bin/main/frc/robot/subsystems/Intake.class | Bin 1523 -> 0 bytes bin/main/frc/robot/subsystems/LED.class | Bin 372 -> 0 bytes bin/main/frc/robot/subsystems/Swerve.class | Bin 10671 -> 0 bytes .../frc/robot/subsystems/SwerveModule.class | Bin 6036 -> 0 bytes .../frc/FSLib2025/math/LinearRegression.java | 15 +- src/main/java/frc/FSLib2025/math/Maths.java | 10 +- .../FSLib2025/swerve/OnboardModuleState.java | 98 +++--- .../FSLib2025/swerve/SwerveModuleConfig.java | 4 +- .../frc/FSLib2025/util/LocalADStarAK.java | 234 ++++++------- .../FSLib2025/vision/LimelightHelpers.java | 323 +++++++++--------- src/main/java/frc/robot/Constants.java | 2 +- src/main/java/frc/robot/RobotContainer.java | 2 +- .../java/frc/robot/commands/TeleopSwerve.java | 2 +- .../java/frc/robot/subsystems/Elevator.java | 6 +- .../java/frc/robot/subsystems/Grabber.java | 18 +- .../java/frc/robot/subsystems/Intake.java | 134 ++++---- src/main/java/frc/robot/subsystems/LED.java | 13 +- .../frc/robot/subsystems/SwerveModule.java | 3 +- 48 files changed, 449 insertions(+), 436 deletions(-) delete mode 100644 bin/main/frc/FSLib2025/math/LinearRegression.class delete mode 100644 bin/main/frc/FSLib2025/math/Maths.class delete mode 100644 bin/main/frc/FSLib2025/state_machine/StateMachine.class delete mode 100644 bin/main/frc/FSLib2025/state_machine/SuperstructureState.class delete mode 100644 bin/main/frc/FSLib2025/swerve/OnboardModuleState.class delete mode 100644 bin/main/frc/FSLib2025/swerve/SwerveModuleConfig.class delete mode 100644 bin/main/frc/FSLib2025/swerve/SwerveModuleConstants.class delete mode 100644 bin/main/frc/FSLib2025/util/LocalADStarAK$ADStarIO.class delete mode 100644 bin/main/frc/FSLib2025/util/LocalADStarAK.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightResults.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Barcode.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Classifier.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Detector.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Fiducial.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Retro.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$PoseEstimate.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$RawDetection.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers$RawFiducial.class delete mode 100644 bin/main/frc/FSLib2025/vision/LimelightHelpers.class delete mode 100644 bin/main/frc/robot/Constants$RobotConstants.class delete mode 100644 bin/main/frc/robot/Constants$SuperstructureConstants.class delete mode 100644 bin/main/frc/robot/Constants$SwerveConstants.class delete mode 100644 bin/main/frc/robot/Constants.class delete mode 100644 bin/main/frc/robot/Main.class delete mode 100644 bin/main/frc/robot/Robot.class delete mode 100644 bin/main/frc/robot/RobotContainer.class delete mode 100644 bin/main/frc/robot/commands/TeleopSwerve.class delete mode 100644 bin/main/frc/robot/subsystems/Elevator.class delete mode 100644 bin/main/frc/robot/subsystems/Grabber.class delete mode 100644 bin/main/frc/robot/subsystems/Intake.class delete mode 100644 bin/main/frc/robot/subsystems/LED.class delete mode 100644 bin/main/frc/robot/subsystems/Swerve.class delete mode 100644 bin/main/frc/robot/subsystems/SwerveModule.class diff --git a/.gitignore b/.gitignore index 4dcb339..0384fc9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,24 @@ # build file .gradle build + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* diff --git a/bin/main/frc/FSLib2025/math/LinearRegression.class b/bin/main/frc/FSLib2025/math/LinearRegression.class deleted file mode 100644 index e689ea72ccec586a39269a154d676f8ec9536777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 800 zcma)3U279T6g{&uyVJy^iPdOoTeT^rNd;p9R%|sCECC@Z7!63DCYv?g=Bp$d(;v|P z;Db*-^-%;x@S#7zzv2I|p553g`XbBSz30xoXU@6%?Z?*>01vUEVF|3f9=gS9z2-N| zcglB*JrnE|YkuD|!{=Um=#57Hps%3>();F(DRxc2U3}Ku_uN20wM<|Hg+ZG`pU_Ty5Z*Zo>@y z5dSKwV9y^3tk(WR>XtyPXAT;sJN7seBbz(!ntta zg;uOqSYagVfpI%e%t53?!_im}h}Q?>q3c!sP;ut(W!(<4Trxpa2N_@r68GVR7i%n@-8m&i($xQxt{Q*5z+hG!F5 zS^tFOt4)2f;m8g97>n~dW0yD8yppB0x9{K_BYh;rku5TI#(97GeJvbVQmwKqwePD4 zF#WUWoB>rzWmVQ0v^&!_Rm!RkvHO8nON0h;k&FZ-CoxYutE}dkmnnan23}HpXsQw| zW^!(7LYr4<#=;m`PD(}!*Ra4_*%z|$-y1d0a(&)I48>GWjSao)C%d@mL-o(EwNzZA$+YkLCP>*&32B7>X-9frV6GYI{i zlYZMD?8&hy!fZ2*p2A;naBth~`YibWD zgRo?dPLKbheDO4BCaNJ;JPA z)JC}S=`(cgEOW+mCWSH*)JmdZ0oPDsofo;J5=SbpKu^OG{S3q$=Pcv;cus=_H79RZ zIVTzOg<)E%nd0X!`T0wJe#}?c8)NJn64Xx2($WYwmq)mzRHv!aDXK|og?09mT1l2- zl3L-79PYp#Q+Fs;y{KXra5pNT)*az~%3mAdAuC;0qJLj8pIUeYkCQD4Y>+mACw~BB CBZI#H diff --git a/bin/main/frc/FSLib2025/state_machine/StateMachine.class b/bin/main/frc/FSLib2025/state_machine/StateMachine.class deleted file mode 100644 index 84c3364bc421b408cc1ac787f1771e0d215cb01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1979 zcmb7FT~pgu5IxrxmQe&4$Ds)&1&W*6CPfJeZBvJ|fbBvea2f#)$wNk#WGpHyk1VDA zEBytX=@TWb!=#-&wln!rY4^$=Vh=P0&*)>XcF&&u^qaS@UISRf6A=-HOwBWtlBU|# z`5W^KO3T-M>)F0;)a{0)Xk1$F2qFZA#Gd|KR~)^utCXvImfJ1! zId*kVY1M;T&9SPk?wN|#Bgh!T2jp?r@;CJ=!)iu-msZX9?8a_BtDX~-kn(X{VMz7o zbt)t+f#E|L6S&GSMt)Dt!>vsA+}W2fiD?m2l!f=!{$$=|e2f`tA7ZnuI{~#1WxgQc z6MQP-T3@Rb+@R`MGBU_Ah|jrpxyEoQQ^@vYuA`NgFpJMbTxXa+e+p&HK_Mo(X);t! zsY{Q)&H$XTQucn+u`0Gn(Nf2bs5D(0!G6{9sBR9$o>W~!ceZuU=5qH?@auMq;Q|@0 z9S_;{|Ep5Z%;pEF?w`vTK#X_52=%b$>&Ex%dNXvvKYt}dM4Z|&Xqq(b4B5ATM;FO^yyXU z2bZx58p;$!{>a{~`^&*TEsN#A_uWPa_+*e=J&>Vt>SCc-TG~=K86@MFAH%h?#le&C zkVheL`j2F2Af#B>W|aNg6xg}PLImxQ@pn_b;c9_VFWHu37Cq1PL`Xzda|6$?N;YqR zQ7X*wuASqSm?mOTTGdfVyn^%=;iUo+_c>dV2S|gq6WxbMdI*8ufbrZ*3?~yuNG31m z+8A%+qa&o-$W?v~F>cU3NxC3gfvg9~`U-||lTJ7mAz(iAm&GmI?xGjTJO8B)vG6yB z{s7x~i7#GYf#d@^kAmY4hm1$bI*9~QAttx`GSpxR0;46=g;eOt-3{b^!yS$h2{B^f z;pHAa16@AT$m4F;I3R6~JbQ#iZr{c?bH9*0Nf!s@*XV2;g`Xhh4sri?+~MJOXm-NC zN?ax}gDK=_?eOr&I*?s=1derV5EQ2`ATlwOi1T*uQm_b(yO}vedFL+(2bCjy_xexi z0ry9Ig!0c2D!H8(C?Akwg0eh;tuBR5l(D`Hr4U^eQTd1dS{Oa~ZHq_pn4Cng^DprQ B=JEgl diff --git a/bin/main/frc/FSLib2025/state_machine/SuperstructureState.class b/bin/main/frc/FSLib2025/state_machine/SuperstructureState.class deleted file mode 100644 index 8f00c80c0601f7e1d585642510e7ff5043b33a1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmbW0T~E_s6vzM1y4S7@9P&QjQP+YL7V&12Kwyi+0vClPix;M=Wt8lNbS(*=N(Bu> zBk|e~WjxPAmB!%3ylJ0vdd~0s&v{ON{QPnW;3Y~a#2EB_&(>?E;WkT)rDeVETfXzQ zW7!98*U`=3$npBV7ubH_IVS&>LYyIYXdPR6+v>LTYB%UGq&BLxwLN2(VaXT}SY}8Z zTkXJMU>gkC>h|8&Y<|sB8ds2k%rI=wT(*Nw)A4q#W}8Ikjh=0_>z3zo zTR3G%nC5k6DDfuz75$Ea6w)NmKXCgD>6YWyuLeP~X%tB@7W(qMs17~{8MAnj!eeSV z(%(tncRC85qR5c3JkL6@dq*b>T2$sv^U$&V@@8Z(zg?Sro+%-0XP==OO$&#o4t!;N zUh@i6JY!gn64%>Szh92X_*3G#CBA^PL$cWmJlm}Aq zIi@nO@|E)H5^aY>Ka{jO#g~OnF@CMU$TVLWvJ+%wp-|iqS*s!jD0~HLo4YhOv)=GC@z7Xh0k}sxc|NoKG7Z(q552L4HM>E1Y9WQ$M3{oz1gA)sv(o zODs+p7eobjLmgrXDURVD?uS&JVi?6Hv`;9!r$Y=}Oj0<91ctZ6Tf4$!@Bk0P;u_)e4 FzW|ep7PJ5W diff --git a/bin/main/frc/FSLib2025/swerve/OnboardModuleState.class b/bin/main/frc/FSLib2025/swerve/OnboardModuleState.class deleted file mode 100644 index 33e63664a003de7306ef4f4aecc61759c316c6a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1722 zcma)6&rcgy5dI!sug$WAlo&7#p{2C22Fmg)X&q<;#36A6rHv!1s=2J!&(0>syIQY} z+Ef34-ieg9SB`C^szI$(_1t6sm>fgDx3*}jS|}jBnKwH#Z|3`E{O7A*e+Tdp?xxTu zFk1~>d#AMPl~r{6xBu zfWF~1yy%ud!pa>8Xt(`}G>|~Qi6nG^p z$6iw)xBHsqtP7<5Ao32qubA>1YgblU_EF&3RWEEt_MsC!wx9B4DxTZ4OL1HOYG=Jy zKu!9GG77)6ANXw9^BXIb^;|E<3o{#d16NWQ7MST#RF5}IWH2IN)MQkUwNOd|K{N~f z7{ho9SpmC8qKj%U@g}YcBuSJ)yeB$63RyQGaLvRd-l7cZjw_3etsn^ffMi8->7l=R zW2xl&0h1=JLZMURl!GAv2gZ&Uu9x~(vjjcBXG$3WzSB>TU&k^+ygR%AVL1P1w>`*hC< z;swz++Z{CYKf16G%cdgYfvifVcF9P(A&hTCn|j~c&g9p9N=ko94H5Q z>&GPw(V~L?qDPwYv-w|edG2S7Qk-I6-i@#y)^Q>l_V(|r5eq`!IT+U?t+z1~Y#RymG8nVb?9E)6%A|~Q8 z*Vq+H!FAlARN4o)%0h>54+k3HsU6hFi3<+Oy|pFT3{| z@A~m~XD_Xp8apN;rgEzhf-AA<*0XQVBY)t_o%ZiznEEV1u!w$+zcq8La-O6v(E2`> zN#h#V>n7zER#3ny?o)nBFuouh4xwlegoqxB(R(qRZEO+(_19*U0w_aYx15PjY(O`Ez++5)9tK-)u;J=7?I6CV-^sN_AN~IM8e`obfotw(oIAdTjmEM-4;%}+ZlVxf$ z<@r_5UF7*hQFA*{*;L$IYmsX^sl-@Tmtv&MSXK6u_+TnoX;XHymkdjQYY_I>{aVBuPB`$2v~7-nK2hZJX!**w*NqsZG_HcGGPC zzpGQXCLEHm8f`kHNID5Ir_x8#=p!lgk&!c;_%+HtBcS`hZuAxF(cT;z(f%A;(ZL)K zqMdM#?JvXz*l~CKJDmPlBe&M+G_i#iaT~+|&lfLY5Brq4`v=s)JbFwh@aPF4H|Z{( N(mZb7L&^di{Q~1zmMZ`N diff --git a/bin/main/frc/FSLib2025/swerve/SwerveModuleConstants.class b/bin/main/frc/FSLib2025/swerve/SwerveModuleConstants.class deleted file mode 100644 index 44bea4f0c3fe1c5530938a8f17dd981910133f92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcma)&O;5r=5Qg8O1+*d{ejL1cQ(~+k@#IHhN=Qfw9BR04%c4taH`#9ScX=}L;1BRe z8K(_;^5A8jdEc4Y%%Bfg^vfTP}0S z^E4zhZd9i19l<$0n-koCyFEDQw6KE~p%bc1PK)PQngYCt1x-f|xsq)?9KX1P%&&COOLH<0KSx192LUY5d4Y%P{K9!4eeV3KbBxb$; dhW0BbHFP;PD$~Ip=VdE5poe`X;ecZehu?Y-VPgOQ diff --git a/bin/main/frc/FSLib2025/util/LocalADStarAK$ADStarIO.class b/bin/main/frc/FSLib2025/util/LocalADStarAK$ADStarIO.class deleted file mode 100644 index 475460685b189c9053360c2eefb84c60a067fc86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3241 zcmcImOIs6X6n?)XFc8KYcTieUYeN8|6lqJ8mVy^*KuRbUu&qNfguyTqCle8^t+v>! ztySADy6ehypGTn127CIP>7!z%~+xCVsj*$#SteBSU?u|N{-F;+7_NDKr0-wOfY3;NYN@`{z zbaY}`k2wm81==k;5lR}4lhhr{w57nflaZD zZR@5Zmj*4vbkcM=;`*FLW~3dSFO3=rQ*$ylk99n>yl+)sLMv9oT{Kd>&oB+AOTZgw z8WHgISaIDCFDg`Qz(xgC0?p3=%a2M_ltQ3Zg@O|KRev)gc&urp3~gvv@RGp#JfV^}6?@UaNT!Xm6b8fEC%3+$;#G7Clo*a~ zYmP;|RzJXRUv55JhJEN#u%B4+hL=}WyoT3l+|ZFJ(y-G`Xog7;O6b;%?$~poVOulPNlk8Ti--Lh?3kcuOS5J5tB-f`*al~x8+99^Csl?=S4VhB+IWlCc}C0H^!R)V*go;?qzr;PA1 z88lj~c}%#*du47FIa!%Dtyxn7YRb)jS#$KbfM>jyju`PXEEGgt`0l}a?(xV*&zVh}8F5blTY`%y4=$l{ zbP?6JP!sgtLS66|Y`%rYpWTz&`CrY`fDRwa!3HEKyeVwvcn4?Y9khcNu#-=cj6m*= zf4IMxb6RtGQ}8D07SPN`<8ADr$5VHdes5QH{IWo2(G3Laif)4p{)X;OUrR%s?Hd!FM7z=pUN*dgQi2fgkVx*<3!{vValks29@FpbI_8e-pK^P>&Saaf-dnMg(b= z{uD-88ctx=b-vvNrsbTct6UwU`?cu9IF6IDdK|*Lc#rnm3Hg1V^l=xs!*icVixmh3 zEea-BV%bedfneZGmNO0%4)?NVf%2F?#mcw*Vc1Q!e0l^J!~gz z1#My*m(Q(8tCOrrNvJ_aw`Kt!5OZEiey)PKUWP9UO7t?X@^NpYG}FvD zUl?fp9qWUw3z#SV8}JwCG#mbUS8ta|`ZrYk73%g|)Zr@8Tz4-EW(}?|&`2k~be(O) tSGY{q{HVd#Je@^Z3eUf&Q*f!66IbYqhX$|m>E|JVYxs_D-@EhI{sYyIL-qgw diff --git a/bin/main/frc/FSLib2025/util/LocalADStarAK.class b/bin/main/frc/FSLib2025/util/LocalADStarAK.class deleted file mode 100644 index c076f3473aa2ab824adc92f36793c524df90ce2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2914 zcmcImQCAy96#gcp1i}&^QA%rDDYlXj%C=ar8j50oiUddrQj1o**$iPY+0EIVw1)?u zeD=jR{S7{}=TwS%jz7R3f3e8l)|=1 z`*N8(8m?l1C~g_TQq#6QY9kXxoS=BM3KS$2&Nd4Co0>dgNA8*LVhGPu zm3oz8*UQ|la_Q{oYmQ;L6+^8ZF9mnvfrihqKn2ZENlL}=R!ahn(%E!>DNh%%6hV&a zXR9+kW}Ajt%+Vcm57SSdfjw0qieE|62wzcI)sR=7Jy9D5h6F90-LZ_SFjtBMYF0Si zp6NG}=q&0nbQVO}GGyJM0{!x+v#H~P$s58s*3jaNj`PuC>2zi~bB5)qb*0y14Qu$4 zx|m%gL3)DQzN$(;smIWNxb5uJ8m;HYBSqlYpw2m3hN$0r=EXsaYnghP2a|dO1D2X!e>uRuv_tfhZhJT|KZJu}K7q~*KuA-aTY(IvY5UvFXBi?$}O|H`z4WND|7mC`X z2c;?3>Cs)>Is$g*4@@xpf(z`0kA5dTx`&Tn>{GZ*;J_F?bqa8tLb;1!Ody4O9+g2K zC7?oh_!Ki0sg%Z~f-xoJa*t6)v zyocBC@7l+UV;L*tGZ3MVhExnr19^B9Bu^j@38c^hq;M33ZV)k9C$1qp@{&aciYL5? zdKwXt=wB%`l_8CMc}i#oWsBJ)VPZd|1U5)yl_v>&O}HU^Lt{Uyl?DBozw|G( z=akc)p0+=rKdPtCB)dr@`yu2*_Riir_nBwz+Q+3;_lD3xZzx@I6_#4Zs#!BLRTfC@B z67xGOs0Tvzwg%U$;=c(k2g|$qvlyz)>OQV71P<=`|xtv&eF_Wp` zb}K(4ZLdnq&SA^n;a6sKx3#S$JXzpMZ_MA~Mevz8jNkC8c7k{J((A?9=V?Z>NuDHw#L@O|DvR zxr4=K+650WfZr32k?7$Pa}M`?d(#%k{<(J7sDogY-ufHTIb3I6C{&uRv9@;-Lg<}@ zV;o$#!Yr4Tm%{-~x4Vr10r;^Rn1K_X_0$ToU;@c@Yh*MfawQYVXKvckS0-|O%ghU} zfF#&6tMhQjR`22IeH=sT-k zNm?Rd>x4gDyZM7pfpLAYBjJ*+D`aJF0$&3k7~OB_zOG(s)ypYHsG8e{a6@OW+-hit zHCjOtF*;jQ1sPFmJ?9Tv>PN!p+(Ba)-w0Ef7>!|ROg~i75UK3x)#Ml2j_Z};W`XAq6{}+7>+Uw z!+_R-=YhE1f(nhG*)R$fYP#8Q2Pzb2v%!Q4b=GW%Lxq}YHax&t7R`7UybyCMJcd| z;JnvZzBD{zsY|i(mx&P5B^R5nMi+JE&>0a5p5mY#j)S%^;m!RU$K399LPi< zlYx9Q*7-NR-KPyL-|bUIOTJH*mSUgsTH5>c{#O824{;m?P3!~y6iG6ePlHU+MOLC= zR;D{_2VHfSrq~|MvyYTwpBl(628Z2Ag$kNW9^@0GPmv_4XS7@V(Zn>JSaqs6nJpdL&qc+x6ZC>26IwDc;Q_}Okr6WQJNy*vpXd;s6T zmk~Fi6ub#uW_D(OzMc8}e*XZ_L)%4x(0f*qKNtrx>~^}B{#t68CVn879Lw3<3^{&b zrH{A9M5q~?$2*~-^od;*35|tV3qKag%zp?M92r9SS|-xm5S-JqDWTZ6XFWKm)=)y3 zP!D9nqt!BGH4$OVgjSG7BAyB*Grcj3W-c}1Hu%>kuL#~aU8#r%G8@(2hS{XM$N~^* z_esL49}BHnyJ!(k{xp|xxP9?=J%q}LwHc<`;0U%2TRbdN)`CUXDnHji>HH0qS8EjD kS-T(jq diff --git a/bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Classifier.class b/bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Classifier.class deleted file mode 100644 index 7ccad425eab1e72d3d191cdfb03b7d6e2f44a779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 909 zcmbtS%We}v5UlYdjvYfxLV$#KNDy#fQ4l8{0)nChtqj7EuhDojcE+q{t(mc9^H-dZ zIPd}d5S$P-R%DQ}2P6*e-mWTjO?UhIudm+#JjdM%3IZ>?Hi`CHvF_|V+IbRO)q-a>8r#GRFfcS%7GGC ziU05|Z?)+?6EO0DKh){v9)`^e)DMhNc6K%8D!3!C{ZG~c8}p85 zPA{<7RL<{b&f_+?6aKFjnafyUtgu>Q4oKCZ#Cix?HRuL8w4ZC0ssI2 diff --git a/bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Detector.class b/bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Detector.class deleted file mode 100644 index 12a5110f0b488402af29a766b356dbd8c1b2f018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 901 zcmbtS%We}v5UlYdjva$df zqGCO`a7QX0DVuFCfKzD)%AFl3ry`fy3Q7Xap`6GdmSzxq=naVrRHImCSz9JbU^V>3 zcbwH`@Je9wvx#*@N56?V2 z`wgBEUV5#Kc6-cv{G`i5`{}u=p@^GxtmB42Bh*H<$4O7wQ^}e9<^e{&m zMyvI}u}j-!SuI{E-mv#&D1FZ^%cgK;V^?hmwXR8n4HM&2>f$pSj0vPa*3LHmJJdp6B_BE9@0AvdfO&wCg-nBIq<- zdyhMxhByW9lk5k0e-!vQi|Vd0I-@(LHY@R_bi0gBlm{o;R)O>y&}8ep z$!NymO%d=%ekdxvyKJ|(gH)NP$TX^MIu(T@O$C0{R}rfug^Ru)6&bhW?pp@%iU-h zj5!pjw`Ka47YmDJQES_uwWM8_L8$B|SG#sY_)VdLuB{cd@cKCtL6-RsvvtB0!v^t~IItkG%a53@vr z`uvGYCagG+CeVQe8XUbNJ*igF>xIRgamv!BMJ4(OQ)Sz42aYI7-4oOOnG_GH%lb#p z$lCNg5v;j939{#2D&y4!}Mm_vX>3=oqF)(8Pd~}=ct>vX>w6Qcf`aJg& zEyVF^9IwamRvd4C4?(X<&qlN0C5_PUXwpAuivFb2^cOAA-)Q205}Pl_&6}kMk@{mQ SBkIw?Fo!>(JZ(kmm;M9L)#r`? diff --git a/bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Retro.class b/bin/main/frc/FSLib2025/vision/LimelightHelpers$LimelightTarget_Retro.class deleted file mode 100644 index d1ae71139fe0c74ddb3e9a80a645f562e0baecad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcma)6VQ&*h6r6Q}P0Y2VKte)VC=jTVCLA>lEe(OD2_ZpNiV~C$MXI$vZ<0&Tch=oH z*#D}PTD7XG{(%0ds82>V5uxTY5^M@Oo2VcCQm^#y?=HMxfTiFw#;pYa-y*yr|_K%0#QU+X~zh z>HU=OKJtv@zTp049Pw7Vw<>V%R0bV}F6xI~T{Fa$IBG;X&AsKTpgBlQJgy%SpBm!t z+$|-T0Mj}xF^#a17BUQ>>z)abVeFY~Swc)gK}!L_S_`@>FrmBkw%=6&kulwEo8z82 z?q!a9=`k6zw6~u&@88|ZLQOS0?whvn9{O>j-ImnH?vaXG>_^WviU&=)GQJTt)dU1S zb#M;FGHzkMgxdmlMryZ%JGd)wUPoy}7E-Ca-W)Oa#hM?g-A=2a;#ZOl7PwT4JQ*Cw z*f;yZ;kZ8bS?*eGq#M}>kdSF78tPj*bjaEgo9pLI4ENbn-13Toj`d%>cpPf^36a@ojoUm z_vM~>L90Kfn9{7*|Tb&0c39!9+;1Z86<4PX5%%dqAFhyY623#dDV*_Rg%-Vo!1mq`x>f&$RbRE}pIP-^TJwf0RsY1Qr++#9 zfmQ$1s;7TB{SQ|Cw^lv<%jti#>iORv_!n{7%$zMR{*H~s$>Lw7-*98FE)7<9uvQ1_ z$}bf3hxB^-&rUE7%^~e@;!io;Z!nK8me9*2Umgta7@no-Ej;I1W^%zNbsH1dNzZTn E2L;;482|tP diff --git a/bin/main/frc/FSLib2025/vision/LimelightHelpers$PoseEstimate.class b/bin/main/frc/FSLib2025/vision/LimelightHelpers$PoseEstimate.class deleted file mode 100644 index 5f360f5a7ba9bf3a3179f121c26b3586c518625b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1323 zcmbVLSx-|z6#fpa6v|~00ShX!FJ-yV0-CrahDso5&)KmY>qVBSHS6Y7 zaZPzf;-h3V*fc`i33)p{6-=BOIf?X{%u*(k`5$RSjrfXN@p5{>NDuA5&*`L0CC|Z< z<7jWbsC-}hG0YGKPsASIJl+za;n-yGL@x8dF1mhzUZys}zo?Eai_0DlC`V#h*wC`9 zp=D7+%aVqc1r06h!nTHQ@Ko`7hNA~umDtWD_tBPojE=keNbI3A*|djqvRp_;_Ha?W zURnBO8B9i=V0aIs55sz6ye4_5K+pK2K1VaXKpVY8Cmo=hUZI~}^E|!51ii&9y~8-4 zx2msV0+SpGBKru@AtP$yTslNFCRj!UOCl;@+G_<(A|`MW^@1nSAb>g>{{ZKZ;k-vZ zeLxd^WJsUTMW4|_Uob>pF;3r*qVFM``%EG~c?3s1Az6q?hcwrOo)8@kJ)v4eNXrl6 q6XFTo)ha@`NRgJW!1)NKII6)kQfym83DTJ5)5Cmbj_svzKm8Lmf=iY7kz2lz)BXU-aFe9|_V@7LMRoRj%xfBgLR9l&u+gb^U*F4xML>A8Yk z$_?g5GHbSLSDj43Ua>0n;*vLGRjybyxBHxVb;|Orvd2%u2oVy?=9-zQn9gG6Olg@P z5W?k(>ALv^0_6!I@0wF)oD#e)81PI&v|Oz@R&8+pLLFcH!`Zrgc77|LtIOx=@Twh3!6dD=421D(vtnr4aWitwuU@P`y5Sg`HZ>H*c=;RRwdCe3n&z6bz0}-t}SFJo%tvpk$JW;JYPpv#ntvpMu zJV~uQN3A?Xt;B9NbN?1T2|42Nv#o*VxvK-jfj*RF{w9{G%)zzy=fyMEsUh}Fq)-_(aK#m_$mQpIWD7( zulJH)ox6zAJ;dogn&<(q;X`!LBXrSY^wJab(^F*W8AjIBL(j=zDHHj?=O=3(^lUUQNNz7?wGe-DV0HZj<8sqZ`V>rgI*0|1( F{Q?;g*8ufgc5Qg7LLX)^AEro)i6liH_5(=S3hy#=ZsiH=T+9<7Zx1A;3%CV8{6nf=b z;v0SmhYE=UKY-ta5HlMNh*PnpdEZ&h&h9?DKYo4t4qy$}^2iWY9>jjFvE9<%>W$S~ zwSArFD6F;gKn1$Ln{KG!p^B4*j{B&gdqZElK^{56 zN|#&Jqn@&m#gvT_P7<=^O1B8Yw2fmJ6L-c&9tCk{Z4^gt#)dU=vo^*@?xGEQ#mhM|h>*B7ONTfu!I5xI!g&c7BwVV_NJ&{roSf7+ zV^ZW4q{^|R%(1!d3-`=mp5uL4hhFnDdx9c8MTwsAeLsgoFEC3lF;B0sL~pQ6Z?Qt} zaGTy^jXt1GAJL>w*rLz4%zZj$_iZd-ku%=0IX@XE1Tw}6gPd_fLHM-go$xPCNLa=R a3!Be=g|iHnP-eB5388|k{Mweyc;z=uc%qpA diff --git a/bin/main/frc/FSLib2025/vision/LimelightHelpers.class b/bin/main/frc/FSLib2025/vision/LimelightHelpers.class deleted file mode 100644 index f884d4579c9c8148f98370aa39b63ac7c5858acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24414 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 diff --git a/bin/main/frc/robot/Constants$SuperstructureConstants.class b/bin/main/frc/robot/Constants$SuperstructureConstants.class deleted file mode 100644 index 901da05a330c8a64a4bfd81b328028d9f1df01ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1867 zcmb7FZBrXn6n<{g5)y9#DHdt5Z(@bkvQo8bp{*ea5Stg8q&V#tX0zPDrQt5K_b%3P z)DMpSA5*b2I^z%UtAD^>(&@Py2(V2%@@4m)XU}=gx#w;FdGY7p0Pf&n5+@k0Hv`WJ z{DyCwtgp0jmC+Nma9af01fgfbKy>jWPBIK_x;w7Za@D$1X>1D5Fq|#s7wW6|Vtyr4 zuT)n{75gmY7+8Vf^uGCu+X_X3T!Ue>T3B4_X)@BK$!5ygN-p1Fy4=e}wo+awEIzDe z>V-;~;YQK(x12!iMAwm?cJ#IzJaIf7P4-#MJxeyp~kb++|2iPOUJU%u>8boTJV-MmEzJ!#Kx#7-i_2iwILx z=8GI}f!mLlIj-P+hJLAbL}0`k!_4I4ssB;2c~{#Gv?a5YA8?!oPvS!c%JPTal8Xg`bDWkIoxW9pzbzWumRwZzF${d2t{4Eefna&)YPlKm%#4VHiz} zV*?Y|#57v;Z3{UlEW_Y2z9)?z2>ls5_ys@WS9~3@*gp-eq`eC|^k#&gy7nCR58T*_ h0FNRQ-cdjiCBhOYM>G|30}8{MKR}J@QIGHkF9FnH)U^Nr diff --git a/bin/main/frc/robot/Constants$SwerveConstants.class b/bin/main/frc/robot/Constants$SwerveConstants.class deleted file mode 100644 index 248fca2b8089dc8b3ed9065c10e16bf2122c3777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2840 zcmbVOTWl0n82+Z0S-K2mDceFtrICv*wb}?zA1c-KjIP zYBqXICK?pEl=x@c`#)O>BD{Q-mj-wBQbq;ykFQ}&7i7B>=L4pq-cqY<)qWdpjwIxLX3`%M`Ot&J*;ms z6~6oH)jvvCMAmopiuHN7bS1$0%rifBed;~SpvI}zCq@FjJ*;i9ZS*SVYDf%=amxtu zrY;Z@6T++!U4lQBj9DJB?Q74a1@Zbe2DL>-(XW8$4-0W2Cb7PoW%*4(_lG5f9w8>$ z4A%GU*u~y!_d^WoXQLaB`6E)uACHQWWKo5|w&Nisljl#4tNf6v8zw&{niMP+A+~)26QQ<0G1qQ%|+>X)QOT4jX)2 z&T6?}Ka~-|yl(qI7Sua4Q6jh9meZ99yOhbotCE)H9;wTk9M4u`Rl0TwVnl5Ing%F3Zy&##2qB|C% z9D1w;cc(v+CVz>~&U`bD&UN=LSR3OUdcjhy%&kXH4O`innaQ%X_kLSr zO&#a3ou+(uy8is?^1~lnQ%MdxEY|Hw_V9b(2V6)q*s-)kyODxmX$^7U(OgAvgoBC` zl(e9tWKwc^l)={jD4#i2G1*326|%^=Fh;5UcT-9>anP(l)JaOt(Db+#R?;JKPBq42 zRyDftG?`$DEwbX=7%w_ya@dI$3r=u2iBsg1nwwB`Q^_#c**MU&h&t|&4eQOMcY|Cz zgJ)bg%V5ugty$Q&QOsniU@{7ab9k0&cCKpmvsEROq=Dj*#M(0i2dddGSL;l~_!1K~{$yqPdHOtQV+YI^oaUC17( z_1Giz8+)W)VUP5B(P;U)3%kjaJ#<%pjw+f1)8P67t;fo5(Zh><^u2-o(y@wpe8|R? zMSRGMB4+2Y&7VU1Ep!~afxr}k1q3Um(M?0;G>*_vK8*+sUL2is(20XPkbHGz)GY3eTm;+us>0}NTFz8utGY35lHgk}*nS)+DWiwM` zWo8OW0m^3>_JUZWw=hn#`V@=;jPmQq_t99u>Fao|@0uOC3-mmX26}F$Ts)3C%E4yJ zLM!DUK>u}7+doRZxt}7Qq*@!Ih-(z*)7VQLU>{z=6S#!^xI#ZNKY$OPpdC~2<0joO zUqZmwr0^ZO@dHHsL|53)h~RhhFy)Y#73gJZkzm%N4=>o(SUMLfFPNkoLG+(*p y23}e)*D7(K*51Mu33!~6pzw|d7s^n7u diff --git a/bin/main/frc/robot/Constants.class b/bin/main/frc/robot/Constants.class deleted file mode 100644 index db02e988a2fa161b07e76e82c5e941fea207911e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmZ`$$w~u36s(tRVz!A{jEN_gg9|tx;BpBFLX2P}_nxuU31g3R_r&k=BzW)x{3!8F zkPv00;Z;`^UH$s?=hyoOfHQ14$PwE2I`DMt$JQIh%2=VSaZn&MXJRhANT>(z+Mmh5 z5=y6`3hg-|zke_#6o&DgtRRoI8j2_p+)=3HIC=7=z7>8X39V5ah-fNwnDQU7U>`$6 z=#Db3J|R>laiRlx5vBo+WmCs#KZM$)Qc@2iVT|NPTZEmAn7y0yMa#3C^ILGxB^+fP zoFvau8>^GRCR(l}^!{-iY!Y@eqh6$*uSU3&ze;s1jlGiT#0<8M-*b z94H>Xq5R514i&Dc4b)NPT3hUkjCE#tG`QyAqRBX5zRrFdeRLQ%7<-I;UIX^a3%`Tj EH}y}3s{jB1 diff --git a/bin/main/frc/robot/Main.class b/bin/main/frc/robot/Main.class deleted file mode 100644 index fb85994a333115fdbe7dbf19b4a1de34bc057ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1044 zcma)5%Wl&^6g`uqapIaLq@_?EZ7Btk0yQs*g@HvQA&}A{kt!Qj6K9f6>Ug5@xTv4S z3e*K3fcPfFwG-r&RuP-IGw0rO-}CeL*$)73@X|t#VX3cuSF5fv?mm~Hg#tr$$WOQ% z@NnRM><)!*7>ciDD9u}je7(_OC^S`1*vO;oU;#yjN=t^~ARcvvKIGj%Fw|Pg=Rt>S znY^c9!5qnm0<_LY^~mFhqBE@4Kew{zZKGv4@EV;OWqj2^4a=0lKu|&(^~S_7HZpMg zap)VVLbn}{$AJ{uvvCdAEv%BI=*8}rv2^=VM<%%ivO9D?B{lEyNI1BGH3mB}T$>bS z*sRZWp0>d) zggOm_c>gGf_L#x>5QaiG10F>pvhbAQ{)KK|)-wyw8P?~U(&v~o7|%f4Nt+7f=tlp7 zPK#bHNk(#E=Nn32Q?*TJq6W%Xq|=!gki3#&OQ;Z%kYABZ?aojIzGEeGU{jogS|U>B lq>P)mMR*>!>CE8{)>A90nXrd=geTY~#3r{c<@^F`e*g)6561ui diff --git a/bin/main/frc/robot/Robot.class b/bin/main/frc/robot/Robot.class deleted file mode 100644 index d4b71700a02a4bb1face54aebd98fe6a9663b3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2341 zcma)6+iufX6kVq&ackUrr=^85+)2`z8d?erEtgDsp)^1tB~UaHavYZ)aO}u-05QM8 zcZ@U=Efq*S@-TlfKQfwqY{z!1REaFvKF52lz4kt9`=9^5eg|+HFC}y_3~W2P>evj2Mzx{7uXA;qJFX|*OkR1TZt|K@^`jU@YOl10XIpm7Zny=zR@1C1L#Egg zIjibHgc?RJFbvjS`DqKbti#Q2Z-=`KLx+o^T6+D;*Qg!|KU2F!{*_XZ zS7xuw&Z`ZNo2t*4Un+T;lV6u{8e=lf;ev$o4Aaz2wXS(PbyKsbb1I#Vzux9nm0PdX z4f+9#`KXfH{HzBD|Vc@VjXCDCx@|o=#!mB?ZTjrhbsG^tTVSdegu$SDY`AAjl|thH2RKAlnQc zC|DQz)4FEqhDnNo?=eFN2+%#A;ZoOx(regI@I+vH18m+TxFP~#upb{LF4+x7H&(bf zOWB{%nK#-yjWBCs01Bq&x`r#^1^t-fVUFgXq%{XS_&?w*H6um8!7jR}BlI>bhMS%P z^o0hV?#F4hOi_%UBe_xZf5Bkx8%DOi;HO=T|4rLnn4o*VPc=pa<3w`;leDJDGeUrJ|XN>RR z-YyFCR`>x~JiSm DO(nx? diff --git a/bin/main/frc/robot/RobotContainer.class b/bin/main/frc/robot/RobotContainer.class deleted file mode 100644 index 402aec187e4d5e503b1c5c8a4f826c53ff843e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1939 zcmbtVTT>iG6#g2J3B#ChQwS?bKqR}1(wYkU)`#maTGAQ(AQfG!}-Di!$>*uq>W)rJGg=g3vV!#{zuI%%rY!> zYfaryT7+6Hx4WN;HfC_ugq)`w^1FqDF)+O4;5Cd|xW#~bDov=GmL6qA;k)%oXKTsAV}_N1G5WHiL0pZJ zxF#R@raaTHzI)C1rUvgCbd>|4lvEa;l3tgG9qKb&Zd<41$0Ffmn0^u?v=ig$G-a6F z+KD)=oj^oiU#IgBE|WGj4HL9Z(#;QK#c1Cvo@1)`3uX?7&oOt39Gw>q&vE?}H|V%@ zSbRZ;7s#Ds`4l%Z>E;;<#WTEDe2Mo@u|9Q=?$=-9qn}!_9?-f%^aW-qKNE8jIZR^> zbGVOr`myD(L(G1RYj{XnCQHf$+bGjMWGI?txk|G6#=4G2TNjHxhAcB=oNk(1oIimI}1tQVqAJ)}{>VCOK`FCcEkGrWfz` zyT0@2lh4l3)REB_pLE72{{tU&M*joH-`Pz=Q#!>NGm|~%`_B1pzwdH>`RDr|0Sw|R z6(I!&rksNA*m>L23wF6|SVdPK6D46+vJ1kQ7b+qOj*4PcU#OV+lS2Xt<@kW^7i6zL!2H(&zhF$J*VJyV$-1imzm_ag2=F46fuO+t)UaU6oeDWaTR+M zB>yvl(eo`#K7TRn#(t^iaVk!vljE&Wa8QGa7P)&uLu;@*tnseTJE~zTGG;BwQihhbTyZ8{u+0`P6QSM0%PvNwJcB5Dv6?0Y75oKX{ zu7bYAtw-V5&@>=HYtNXLxK=Iag)?U4OF}_s#x5A8alk2Q1VO&%}k;5CBUw2=_ zC0tg}K|2?Q{DQvW2-lSz!!nvwF~X!bEAkt0TG(abIZOHt+ZFxA7_Oi@h77K$xT;|9 zCS9)KI&LV~;R^41F;GGsX3&B0#JVUqGR6d|7=38`G+!OHJwxi0zTFIbdr`wUUSgZm z^yMYT&KV0FGn-p{poUf@wmA)x60t5KHfm1Kcth24MK}R=(R06@@_(`jUe@pmUgc=w z&5W4xaz3PK*@dY5rLb!-`WD)IwP=EA+%8cu!dn|_+#e&3CK zh;XEL(v^e!_R)z`*oiafX6f$65ccCT9%m*GV1hT!Q0`#hAfCaqr0A*-gyQdHNFjzY zfL%dAN{R5uv%gdKpx1D=hM~KROii~Jxc1K0V93z9?+N%~4L>gVhXVf08h%ppkI4V5{CtPmx{f%>xa7rso-dyy znUuVw&yys5pUZKTD&i|}yRcZpYw`+rvymF!k}!uMVZO%P0!R419>re7kwglo(Mx!b z@ufJ9i#UPXIEg9~@+Du%uX(ym$)5@EuY~w_g82u|;!o0lQA(yj3m~nh;5~9!HOcM> z+3(|n0C|j%8RAjLs>3Vzuq|BoE#&(a^DkUr0Sx(iy90qnYCG@|KBl@5KB1xzKE-ET N<%2$t&*|-+e*r-~vFQK+ diff --git a/bin/main/frc/robot/subsystems/Elevator.class b/bin/main/frc/robot/subsystems/Elevator.class deleted file mode 100644 index c809c89ee6be93057f520abac279daa16838dda4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4611 zcmb7I_jepu75<*usElo_2p2?RTbAQpxlHVsG$lr5SMtKDSdt}dAZE0BlEzxiEHkr` zZA$16dP(RVat<6?vP5e;fe<=`8hZItI0yLNY}IPj_J?^>-u>>q-@Wg?`}T$ZKJy%a zhwyI=H3GNKx(UN|rXAn#($n5G&zFmy5lzY^(|24AbpprbOxjpZS;nm8dcL|#TGLlf z8wqD|(X?lb@q%2R=}CdzNjd8m0EQf*2po)avf;|5K$Dg53@>H63&yy*4w+ZG1zKHe zZoX2kF=5&XXGRj@NC1)WU1_A|9cf!v?=j|0cV^k-oBrP6U>b31eREpiOuVYmhBu#{ zolVMVhmyv4*~5f6P2rs~@Ax^XtP$v{z_F#j?6?cmk(8b>C~fIliKy+n*C^fapk-VB zS=tZ^PYTra)ADB2qE*LE>}o`tKx2WJX6(T}4SNNQZCa{hKVC*Jfcw%`(vR6W|2!S{;eLUpg$a4ppS0w%z};Ih zZ#7ClQ@4%>@sL2XvMUEKFdy0qT5k5lwUpdqh{{%KS)g92qX)fYhLH;vA&XV0lI;za ztjhR)9XfVshzi`Xagow6C~&M)FZ&(a^G)0LI>*x~$F%oA%~eXgp@)Miq1|1OpVoh^jlI3~(s6P3iEYqGn7- zJsO%YfC(KJz>;<-8jnu)PK=CQjz$v2PD_)0|%aSWP7F3pW6tiS3 zHh8XTny9cZ>abND_mIabk<^e9IIP05$)?{72i$>ng2Aujz7ynbT1O+A)Td<~S8ITx1bfAvqFja!58zEY-i)^h94NZU_M?9!5?!+tPHhXG`vueC z5xiZ)+XPN-&oUkFz&i!%%~UE$XV2%-XEk%{d!|%Z<6_)5{j{h07`8XN;+8Fk(~Hy6 zs!D29Jb%gKQuR<42n^CB9BIL?@f!^<2!vK+uirH3_$_|NbmX#( zIO(7as5N_uaTs^fZbA-Nsx<5hY(4lxL|%=LP-s!oV^ zt!l3eM(!>gp^i(z$R?6wJtcV7spuMZ>X|%WAUV9S< zvN%#(o5iu`alF1Ri&GpkIFrQ#yvgG13i`U9MdV^_2Ip>Icm?MvdOm~k45l)8eHMwS z)!*m%eJ%qlgJkKubFuaY-nasvAN?$rGPs__Tc@6)fi-v+uLIc4YZ!Gr#qB^R+HnNO zcv3rqqj&&a>|&2$l;@&Jj+bx}7Ed}U+=V5M*Kr!};rZk-&VDyhbh=K5`R=_O1>T28 z^JEN>N=4>w<-^e|-mh#`W66-6!GwFcbKgh)?hgR>&`1j90oC1y@L@vMsI`%Yj^=r8 z&){QSS$ryk&)ve8YS4x!7TWO5g)F}HBtdfCHc$vWxs?zaHS!Cq-VtPb5Pua4UpnbIa$29*IepuNz_~x*j~qJ~#)t7D{@k;lJ=Tl(3&$A#iobIlz(4RW G?EgPh8)y&! diff --git a/bin/main/frc/robot/subsystems/Grabber.class b/bin/main/frc/robot/subsystems/Grabber.class deleted file mode 100644 index 75ac9b5bee19c298589183f513d88eefd3a5a4f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1978 zcmb7F>sAw26#foDha@8kS`bBu8a2VowANmuR&s%+&4nf*RC{5aOb#%T%w(N2!SXUd=_L;rEegEdw>%ad6@Ccg*#u(sdQ z_8^6n=PIAOzKWLHEkWVRw(Ym2=-&r1h4Tic8Sb8dobz7f#GYtG^E#KxeoL6RfDaf# zyGhwrI}M=}gLP7d#~~6Sn3&b6U1az;mi?dB@oEqZmrR_(=^!RCZ{i9T7%s1tmXpa$ zX)|A}6ib__Vqqn_x?WnYWQzsLa)cM#bGMxBelw^(BqoB0;F^J}4Dl1Hqx&2!2_^hI zHO$0yL>VsZc5cdiORRCpo5H8^Q*TE2?@Ym)K;-=s5c9_!Qvd>eS({y7MEK> z)M+3CHS@TVp|!vk7b`bNvHx}RB^v|B`*a9Nqz$BKCEm$1mTGe8*SXrMd0Z0PXfb^xn#f>#=u~Sv0us?1`RIB8&po z3=|m_-yYS{o2n+h(+P*kLsc|9+wu3wU)gI*TdX*`MP`p|@9D5f%(||SsRma{C%jmqZ^b(<^e_%ch9N^qb%>045rQb1kfXfG1Jiv`Z+}`+& z6vtrE^HK-u9L6OqvVS4Zpl=3VCOhuu yafX6k#KKUxk)Ee9lqildlu@Dc8YOuX>)3cQM=7r3dpf7^6hF{8i68MZ=Kce}(IV~u diff --git a/bin/main/frc/robot/subsystems/Intake.class b/bin/main/frc/robot/subsystems/Intake.class deleted file mode 100644 index 41d732bdeac946c0aedcea0f7499be3b8c450c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1523 zcmb7E>rN9v6#j-HOJN1MQxLfoY`LxC1+{=&0;aJS($*S(k?k^-g?6`@*@8Tf4`8E` zXyOC-P{y-MX=_MJ{IfH2_MGpV@0>a3_n#lX0Bm4eK^wz(UKpCNbGD<&a!y`IhZm(5 zwH*DFD`;m};zwoeyku&5Q%J|%70leps%F^5qHY~&>FcN+U2=wwV%&CY!7vpg4^8kh z58O1QCQG_F)za=au78S<@49K3&L)E|6wWfV@7hPa3qEwKP|&I1F2jS?APRaJ7V8pr zZA&`3<;Y;VT;gGAIcA^7_!%z*JuR7w5?3*ZA%?Eg9Z{CY z1ui9n)=J?`h)5SyjJVQ98J>iq{}~<5`oS=!;to3e=)rvz6L>(DXd<)ycJDBr%p_BX zyUE0U^v%1}b|#ukkjN$^hHd4|kF{D*dgvJOV+u10rWwL5lH=AnnBtNY_`OH)FA%ZMBc$LVMcu}JK;WjV@`thD@+a)7wUNJ>{yKjH zlvki770Xy*@L#2f-VVd(P!k!AX>`?8^Vr0@PFl-eD)`KB0A%xG?P_)1YUcw#&lc z`=*Q8eKj0bPV_UKL5*4#7rO;rN-h<=V3@q6dW6s*iZWfxhJtm5*%sl~O+`Vq&Q$Q4 zVW2LBYH&3I7)F{50ZdaT`Dh4Ig4}kZT^sFb=FrzqCxfhv*13gCbS?aZ`oUMhy-N&# zLtx=60u_u`Fj>LecPzgD;)QGU9rK_D(T*VuV3_)IggR;%L5$)N{a3F*@ffRgq9ITt zT=dRltAllT&JzuRtQy#cr{vy-XLwHQ4AISF4KKF>M7D-kwDuu_4O)A!i7f>F0yvGe AM*si- diff --git a/bin/main/frc/robot/subsystems/LED.class b/bin/main/frc/robot/subsystems/LED.class deleted file mode 100644 index 9c442607797beaa125537093571441f08f410a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmZ{fyH3ME5Jm4ePHapdfeO*l@e(W1@+f#!7EMt4wY?D&+1Y5<2Ju-`NECbkAB7kP zh!7H5X=d)soZY+cAFpo!&ae?7AZ$%suAI$mt$dUDCtsV&tMvLRLP$6?MWY_)tS0Py z-Bu-M(_@v}s?xJUjed{|?G2%K$}_Id37y@&F(JIPg-OuCN*`VH2!oVo=C-Lax`QA#pN?(V-JeqM|diR~Czl>_v@79_8UBCIdrgN2sfUvT&fq$N0z^#H?9Z+S@6 diff --git a/bin/main/frc/robot/subsystems/Swerve.class b/bin/main/frc/robot/subsystems/Swerve.class deleted file mode 100644 index dcf56685bfc35584e0e4932c4ab3742873c85d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10671 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 IaUB}}5A6^97XSbN diff --git a/src/main/java/frc/FSLib2025/math/LinearRegression.java b/src/main/java/frc/FSLib2025/math/LinearRegression.java index b10c7e3..58e5f4b 100644 --- a/src/main/java/frc/FSLib2025/math/LinearRegression.java +++ b/src/main/java/frc/FSLib2025/math/LinearRegression.java @@ -1,22 +1,23 @@ package frc.FSLib2025.math; public class LinearRegression { - + private double[][] data; - public LinearRegression (double[][] mapValues) { + public LinearRegression(double[][] mapValues) { data = mapValues; } - public double calculate (double xValues) { + public double calculate(double xValues) { int index = 0; for (double[] i : data) { - if(i[0] >= xValues) break; + if (i[0] >= xValues) + break; index++; } - double dx = xValues - data[index-1][0]; - double x = data[index][0] - data[index-1][0]; - return data[index-1][1] * (1-dx/x) + data[index][1] * dx/x; + double dx = xValues - data[index - 1][0]; + double x = data[index][0] - data[index - 1][0]; + return data[index - 1][1] * (1 - dx / x) + data[index][1] * dx / x; } } diff --git a/src/main/java/frc/FSLib2025/math/Maths.java b/src/main/java/frc/FSLib2025/math/Maths.java index ac3205d..a5a6796 100644 --- a/src/main/java/frc/FSLib2025/math/Maths.java +++ b/src/main/java/frc/FSLib2025/math/Maths.java @@ -1,16 +1,16 @@ package frc.FSLib2025.math; public class Maths { - - public static boolean isWithin (double value, double min, double max) { + + public static boolean isWithin(double value, double min, double max) { return Math.max(min, value) == Math.min(value, max); } - - public static double clamp (double value, double min, double max) { + + public static double clamp(double value, double min, double max) { return Math.min(Math.max(value, min), max); } - public static int clamp (int value, int min, int max) { + public static int clamp(int value, int min, int max) { return Math.min(Math.max(value, min), max); } diff --git a/src/main/java/frc/FSLib2025/swerve/OnboardModuleState.java b/src/main/java/frc/FSLib2025/swerve/OnboardModuleState.java index ebcb6dd..093a960 100644 --- a/src/main/java/frc/FSLib2025/swerve/OnboardModuleState.java +++ b/src/main/java/frc/FSLib2025/swerve/OnboardModuleState.java @@ -5,56 +5,56 @@ public class OnboardModuleState { - /** - * Minimize the change in heading the desired swerve module state would require - * by potentially - * reversing the direction the wheel spins. Customized from WPILib's version to - * include placing in - * appropriate scope for CTRE and REV onboard control as both controllers as of - * writing don't have - * support for continuous input. - * - * @param desiredState The desired state. - * @param currentAngle The current module angle. - */ - public static SwerveModuleState optimize(SwerveModuleState desiredState, Rotation2d currentAngle) { - double targetAngle = placeInAppropriate0To360Scope(currentAngle.getDegrees(), desiredState.angle.getDegrees()); - double targetSpeed = desiredState.speedMetersPerSecond; - double delta = targetAngle - currentAngle.getDegrees(); - if (Math.abs(delta) > 90) { - targetSpeed = -targetSpeed; - targetAngle = delta > 90 ? (targetAngle -= 180) : (targetAngle += 180); + /** + * Minimize the change in heading the desired swerve module state would require + * by potentially + * reversing the direction the wheel spins. Customized from WPILib's version to + * include placing in + * appropriate scope for CTRE and REV onboard control as both controllers as of + * writing don't have + * support for continuous input. + * + * @param desiredState The desired state. + * @param currentAngle The current module angle. + */ + public static SwerveModuleState optimize(SwerveModuleState desiredState, Rotation2d currentAngle) { + double targetAngle = placeInAppropriate0To360Scope(currentAngle.getDegrees(), desiredState.angle.getDegrees()); + double targetSpeed = desiredState.speedMetersPerSecond; + double delta = targetAngle - currentAngle.getDegrees(); + if (Math.abs(delta) > 90) { + targetSpeed = -targetSpeed; + targetAngle = delta > 90 ? (targetAngle -= 180) : (targetAngle += 180); + } + return new SwerveModuleState(targetSpeed, Rotation2d.fromDegrees(targetAngle)); } - return new SwerveModuleState(targetSpeed, Rotation2d.fromDegrees(targetAngle)); - } - /** - * @param scopeReference Current Angle - * @param newAngle Target Angle - * @return Closest angle within scope - */ - private static double placeInAppropriate0To360Scope(double scopeReference, double newAngle) { - double lowerBound; - double upperBound; - double lowerOffset = scopeReference % 360; - if (lowerOffset >= 0) { - lowerBound = scopeReference - lowerOffset; - upperBound = scopeReference + (360 - lowerOffset); - } else { - upperBound = scopeReference - lowerOffset; - lowerBound = scopeReference - (360 + lowerOffset); + /** + * @param scopeReference Current Angle + * @param newAngle Target Angle + * @return Closest angle within scope + */ + private static double placeInAppropriate0To360Scope(double scopeReference, double newAngle) { + double lowerBound; + double upperBound; + double lowerOffset = scopeReference % 360; + if (lowerOffset >= 0) { + lowerBound = scopeReference - lowerOffset; + upperBound = scopeReference + (360 - lowerOffset); + } else { + upperBound = scopeReference - lowerOffset; + lowerBound = scopeReference - (360 + lowerOffset); + } + while (newAngle < lowerBound) { + newAngle += 360; + } + while (newAngle > upperBound) { + newAngle -= 360; + } + if (newAngle - scopeReference > 180) { + newAngle -= 360; + } else if (newAngle - scopeReference < -180) { + newAngle += 360; + } + return newAngle; } - while (newAngle < lowerBound) { - newAngle += 360; - } - while (newAngle > upperBound) { - newAngle -= 360; - } - if (newAngle - scopeReference > 180) { - newAngle -= 360; - } else if (newAngle - scopeReference < -180) { - newAngle += 360; - } - return newAngle; - } } diff --git a/src/main/java/frc/FSLib2025/swerve/SwerveModuleConfig.java b/src/main/java/frc/FSLib2025/swerve/SwerveModuleConfig.java index 68b48d1..ffb97f6 100644 --- a/src/main/java/frc/FSLib2025/swerve/SwerveModuleConfig.java +++ b/src/main/java/frc/FSLib2025/swerve/SwerveModuleConfig.java @@ -8,8 +8,8 @@ public class SwerveModuleConfig { public int AngleMotorId; public int CancoderId; public Rotation2d AngleOffset; - - public SwerveModuleConfig (int driveMotorId, int angleMotorId, int cancoderId, Rotation2d angleOffset) { + + public SwerveModuleConfig(int driveMotorId, int angleMotorId, int cancoderId, Rotation2d angleOffset) { this.DriveMotorId = driveMotorId; this.AngleMotorId = angleMotorId; this.CancoderId = cancoderId; diff --git a/src/main/java/frc/FSLib2025/util/LocalADStarAK.java b/src/main/java/frc/FSLib2025/util/LocalADStarAK.java index d16c7b3..98984cb 100644 --- a/src/main/java/frc/FSLib2025/util/LocalADStarAK.java +++ b/src/main/java/frc/FSLib2025/util/LocalADStarAK.java @@ -16,134 +16,140 @@ import org.littletonrobotics.junction.inputs.LoggableInputs; public class LocalADStarAK implements Pathfinder { - private final ADStarIO io = new ADStarIO(); - - /** - * Get if a new path has been calculated since the last time a path was retrieved - * - * @return True if a new path is available - */ - @Override - public boolean isNewPathAvailable() { - if (!Logger.hasReplaySource()) { - io.updateIsNewPathAvailable(); - } + private final ADStarIO io = new ADStarIO(); + + /** + * Get if a new path has been calculated since the last time a path was + * retrieved + * + * @return True if a new path is available + */ + @Override + public boolean isNewPathAvailable() { + if (!Logger.hasReplaySource()) { + io.updateIsNewPathAvailable(); + } - Logger.processInputs("LocalADStarAK", io); - - return io.isNewPathAvailable; - } - - /** - * Get the most recently calculated path - * - * @param constraints The path constraints to use when creating the path - * @param goalEndState The goal end state to use when creating the path - * @return The PathPlannerPath created from the points calculated by the pathfinder - */ - @Override - public PathPlannerPath getCurrentPath(PathConstraints constraints, GoalEndState goalEndState) { - if (!Logger.hasReplaySource()) { - io.updateCurrentPathPoints(constraints, goalEndState); + Logger.processInputs("LocalADStarAK", io); + + return io.isNewPathAvailable; } - Logger.processInputs("LocalADStarAK", io); + /** + * Get the most recently calculated path + * + * @param constraints The path constraints to use when creating the path + * @param goalEndState The goal end state to use when creating the path + * @return The PathPlannerPath created from the points calculated by the + * pathfinder + */ + @Override + public PathPlannerPath getCurrentPath(PathConstraints constraints, GoalEndState goalEndState) { + if (!Logger.hasReplaySource()) { + io.updateCurrentPathPoints(constraints, goalEndState); + } - if (io.currentPathPoints.isEmpty()) { - return null; - } + Logger.processInputs("LocalADStarAK", io); - return PathPlannerPath.fromPathPoints(io.currentPathPoints, constraints, goalEndState); - } - - /** - * Set the start position to pathfind from - * - * @param startPosition Start position on the field. If this is within an obstacle it will be - * moved to the nearest non-obstacle node. - */ - @Override - public void setStartPosition(Translation2d startPosition) { - if (!Logger.hasReplaySource()) { - io.adStar.setStartPosition(startPosition); - } - } - - /** - * Set the goal position to pathfind to - * - * @param goalPosition Goal position on the field. f this is within an obstacle it will be moved - * to the nearest non-obstacle node. - */ - @Override - public void setGoalPosition(Translation2d goalPosition) { - if (!Logger.hasReplaySource()) { - io.adStar.setGoalPosition(goalPosition); - } - } - - /** - * Set the dynamic obstacles that should be avoided while pathfinding. - * - * @param obs A List of Translation2d pairs representing obstacles. Each Translation2d represents - * opposite corners of a bounding box. - * @param currentRobotPos The current position of the robot. This is needed to change the start - * position of the path to properly avoid obstacles - */ - @Override - public void setDynamicObstacles( - List> obs, Translation2d currentRobotPos) { - if (!Logger.hasReplaySource()) { - io.adStar.setDynamicObstacles(obs, currentRobotPos); - } - } + if (io.currentPathPoints.isEmpty()) { + return null; + } - private static class ADStarIO implements LoggableInputs { - public LocalADStar adStar = new LocalADStar(); - public boolean isNewPathAvailable = false; - public List currentPathPoints = Collections.emptyList(); + return PathPlannerPath.fromPathPoints(io.currentPathPoints, constraints, goalEndState); + } + /** + * Set the start position to pathfind from + * + * @param startPosition Start position on the field. If this is within an + * obstacle it will be + * moved to the nearest non-obstacle node. + */ @Override - public void toLog(LogTable table) { - table.put("IsNewPathAvailable", isNewPathAvailable); - - double[] pointsLogged = new double[currentPathPoints.size() * 2]; - int idx = 0; - for (PathPoint point : currentPathPoints) { - pointsLogged[idx] = point.position.getX(); - pointsLogged[idx + 1] = point.position.getY(); - idx += 2; - } - - table.put("CurrentPathPoints", pointsLogged); + public void setStartPosition(Translation2d startPosition) { + if (!Logger.hasReplaySource()) { + io.adStar.setStartPosition(startPosition); + } } + /** + * Set the goal position to pathfind to + * + * @param goalPosition Goal position on the field. f this is within an obstacle + * it will be moved + * to the nearest non-obstacle node. + */ @Override - public void fromLog(LogTable table) { - isNewPathAvailable = table.get("IsNewPathAvailable", false); - - double[] pointsLogged = table.get("CurrentPathPoints", new double[0]); - - List pathPoints = new ArrayList<>(); - for (int i = 0; i < pointsLogged.length; i += 2) { - pathPoints.add(new PathPoint(new Translation2d(pointsLogged[i], pointsLogged[i + 1]), null)); - } - - currentPathPoints = pathPoints; + public void setGoalPosition(Translation2d goalPosition) { + if (!Logger.hasReplaySource()) { + io.adStar.setGoalPosition(goalPosition); + } } - public void updateIsNewPathAvailable() { - isNewPathAvailable = adStar.isNewPathAvailable(); + /** + * Set the dynamic obstacles that should be avoided while pathfinding. + * + * @param obs A List of Translation2d pairs representing obstacles. + * Each Translation2d represents + * opposite corners of a bounding box. + * @param currentRobotPos The current position of the robot. This is needed to + * change the start + * position of the path to properly avoid obstacles + */ + @Override + public void setDynamicObstacles( + List> obs, Translation2d currentRobotPos) { + if (!Logger.hasReplaySource()) { + io.adStar.setDynamicObstacles(obs, currentRobotPos); + } } - public void updateCurrentPathPoints(PathConstraints constraints, GoalEndState goalEndState) { - PathPlannerPath currentPath = adStar.getCurrentPath(constraints, goalEndState); - - if (currentPath != null) { - currentPathPoints = currentPath.getAllPathPoints(); - } else { - currentPathPoints = Collections.emptyList(); - } + private static class ADStarIO implements LoggableInputs { + public LocalADStar adStar = new LocalADStar(); + public boolean isNewPathAvailable = false; + public List currentPathPoints = Collections.emptyList(); + + @Override + public void toLog(LogTable table) { + table.put("IsNewPathAvailable", isNewPathAvailable); + + double[] pointsLogged = new double[currentPathPoints.size() * 2]; + int idx = 0; + for (PathPoint point : currentPathPoints) { + pointsLogged[idx] = point.position.getX(); + pointsLogged[idx + 1] = point.position.getY(); + idx += 2; + } + + table.put("CurrentPathPoints", pointsLogged); + } + + @Override + public void fromLog(LogTable table) { + isNewPathAvailable = table.get("IsNewPathAvailable", false); + + double[] pointsLogged = table.get("CurrentPathPoints", new double[0]); + + List pathPoints = new ArrayList<>(); + for (int i = 0; i < pointsLogged.length; i += 2) { + pathPoints.add(new PathPoint(new Translation2d(pointsLogged[i], pointsLogged[i + 1]), null)); + } + + currentPathPoints = pathPoints; + } + + public void updateIsNewPathAvailable() { + isNewPathAvailable = adStar.isNewPathAvailable(); + } + + public void updateCurrentPathPoints(PathConstraints constraints, GoalEndState goalEndState) { + PathPlannerPath currentPath = adStar.getCurrentPath(constraints, goalEndState); + + if (currentPath != null) { + currentPathPoints = currentPath.getAllPathPoints(); + } else { + currentPathPoints = Collections.emptyList(); + } + } } - } } \ No newline at end of file diff --git a/src/main/java/frc/FSLib2025/vision/LimelightHelpers.java b/src/main/java/frc/FSLib2025/vision/LimelightHelpers.java index e66111f..e8a28fc 100644 --- a/src/main/java/frc/FSLib2025/vision/LimelightHelpers.java +++ b/src/main/java/frc/FSLib2025/vision/LimelightHelpers.java @@ -34,7 +34,6 @@ public class LimelightHelpers { private static final Map doubleArrayEntries = new ConcurrentHashMap<>(); - public static class LimelightTarget_Retro { @JsonProperty("t6c_ts") @@ -44,7 +43,7 @@ public static class LimelightTarget_Retro { private double[] robotPose_FieldSpace; @JsonProperty("t6r_ts") - private double[] robotPose_TargetSpace; + private double[] robotPose_TargetSpace; @JsonProperty("t6t_cs") private double[] targetPose_CameraSpace; @@ -52,45 +51,43 @@ public static class LimelightTarget_Retro { @JsonProperty("t6t_rs") private double[] targetPose_RobotSpace; - public Pose3d getCameraPose_TargetSpace() - { + public Pose3d getCameraPose_TargetSpace() { return toPose3D(cameraPose_TargetSpace); } - public Pose3d getRobotPose_FieldSpace() - { + + public Pose3d getRobotPose_FieldSpace() { return toPose3D(robotPose_FieldSpace); } - public Pose3d getRobotPose_TargetSpace() - { + + public Pose3d getRobotPose_TargetSpace() { return toPose3D(robotPose_TargetSpace); } - public Pose3d getTargetPose_CameraSpace() - { + + public Pose3d getTargetPose_CameraSpace() { return toPose3D(targetPose_CameraSpace); } - public Pose3d getTargetPose_RobotSpace() - { + + public Pose3d getTargetPose_RobotSpace() { return toPose3D(targetPose_RobotSpace); } - public Pose2d getCameraPose_TargetSpace2D() - { + public Pose2d getCameraPose_TargetSpace2D() { return toPose2D(cameraPose_TargetSpace); } - public Pose2d getRobotPose_FieldSpace2D() - { + + public Pose2d getRobotPose_FieldSpace2D() { return toPose2D(robotPose_FieldSpace); } - public Pose2d getRobotPose_TargetSpace2D() - { + + public Pose2d getRobotPose_TargetSpace2D() { return toPose2D(robotPose_TargetSpace); } - public Pose2d getTargetPose_CameraSpace2D() - { + + public Pose2d getTargetPose_CameraSpace2D() { return toPose2D(targetPose_CameraSpace); } - public Pose2d getTargetPose_RobotSpace2D() - { + + public Pose2d getTargetPose_RobotSpace2D() { return toPose2D(targetPose_RobotSpace); } @@ -145,48 +142,46 @@ public static class LimelightTarget_Fiducial { @JsonProperty("t6t_rs") private double[] targetPose_RobotSpace; - public Pose3d getCameraPose_TargetSpace() - { + public Pose3d getCameraPose_TargetSpace() { return toPose3D(cameraPose_TargetSpace); } - public Pose3d getRobotPose_FieldSpace() - { + + public Pose3d getRobotPose_FieldSpace() { return toPose3D(robotPose_FieldSpace); } - public Pose3d getRobotPose_TargetSpace() - { + + public Pose3d getRobotPose_TargetSpace() { return toPose3D(robotPose_TargetSpace); } - public Pose3d getTargetPose_CameraSpace() - { + + public Pose3d getTargetPose_CameraSpace() { return toPose3D(targetPose_CameraSpace); } - public Pose3d getTargetPose_RobotSpace() - { + + public Pose3d getTargetPose_RobotSpace() { return toPose3D(targetPose_RobotSpace); } - public Pose2d getCameraPose_TargetSpace2D() - { + public Pose2d getCameraPose_TargetSpace2D() { return toPose2D(cameraPose_TargetSpace); } - public Pose2d getRobotPose_FieldSpace2D() - { + + public Pose2d getRobotPose_FieldSpace2D() { return toPose2D(robotPose_FieldSpace); } - public Pose2d getRobotPose_TargetSpace2D() - { + + public Pose2d getRobotPose_TargetSpace2D() { return toPose2D(robotPose_TargetSpace); } - public Pose2d getTargetPose_CameraSpace2D() - { + + public Pose2d getTargetPose_CameraSpace2D() { return toPose2D(targetPose_CameraSpace); } - public Pose2d getTargetPose_RobotSpace2D() - { + + public Pose2d getTargetPose_RobotSpace2D() { return toPose2D(targetPose_RobotSpace); } - + @JsonProperty("ta") public double ta; @@ -204,7 +199,7 @@ public Pose2d getTargetPose_RobotSpace2D() @JsonProperty("ts") public double ts; - + public LimelightTarget_Fiducial() { cameraPose_TargetSpace = new double[6]; robotPose_FieldSpace = new double[6]; @@ -244,7 +239,7 @@ public static class LimelightTarget_Classifier { @JsonProperty("typ") public double ty_pixels; - public LimelightTarget_Classifier() { + public LimelightTarget_Classifier() { } } @@ -279,9 +274,9 @@ public LimelightTarget_Detector() { } public static class LimelightResults { - + public String error; - + @JsonProperty("pID") public double pipelineID; @@ -314,13 +309,13 @@ public static class LimelightResults { @JsonProperty("botpose_tagcount") public double botpose_tagcount; - + @JsonProperty("botpose_span") public double botpose_span; - + @JsonProperty("botpose_avgdist") public double botpose_avgdist; - + @JsonProperty("botpose_avgarea") public double botpose_avgarea; @@ -330,11 +325,11 @@ public static class LimelightResults { public Pose3d getBotPose3d() { return toPose3D(botpose); } - + public Pose3d getBotPose3d_wpiRed() { return toPose3D(botpose_wpired); } - + public Pose3d getBotPose3d_wpiBlue() { return toPose3D(botpose_wpiblue); } @@ -342,11 +337,11 @@ public Pose3d getBotPose3d_wpiBlue() { public Pose2d getBotPose2d() { return toPose2D(botpose); } - + public Pose2d getBotPose2d_wpiRed() { return toPose2D(botpose_wpired); } - + public Pose2d getBotPose2d_wpiBlue() { return toPose2D(botpose_wpiblue); } @@ -379,7 +374,6 @@ public LimelightResults() { } - } public static class RawFiducial { @@ -391,8 +385,8 @@ public static class RawFiducial { public double distToRobot = 0; public double ambiguity = 0; - - public RawFiducial(int id, double txnc, double tync, double ta, double distToCamera, double distToRobot, double ambiguity) { + public RawFiducial(int id, double txnc, double tync, double ta, double distToCamera, double distToRobot, + double ambiguity) { this.id = id; this.txnc = txnc; this.tync = tync; @@ -417,12 +411,11 @@ public static class RawDetection { public double corner3_X = 0; public double corner3_Y = 0; - - public RawDetection(int classId, double txnc, double tync, double ta, - double corner0_X, double corner0_Y, - double corner1_X, double corner1_Y, - double corner2_X, double corner2_Y, - double corner3_X, double corner3_Y ) { + public RawDetection(int classId, double txnc, double tync, double ta, + double corner0_X, double corner0_Y, + double corner1_X, double corner1_Y, + double corner2_X, double corner2_Y, + double corner3_X, double corner3_Y) { this.classId = classId; this.txnc = txnc; this.tync = tync; @@ -446,7 +439,7 @@ public static class PoseEstimate { public double tagSpan; public double avgTagDist; public double avgTagArea; - public RawFiducial[] rawFiducials; + public RawFiducial[] rawFiducials; /** * Makes a PoseEstimate object with default values @@ -459,12 +452,12 @@ public PoseEstimate() { this.tagSpan = 0; this.avgTagDist = 0; this.avgTagArea = 0; - this.rawFiducials = new RawFiducial[]{}; + this.rawFiducials = new RawFiducial[] {}; } - public PoseEstimate(Pose2d pose, double timestampSeconds, double latency, - int tagCount, double tagSpan, double avgTagDist, - double avgTagArea, RawFiducial[] rawFiducials) { + public PoseEstimate(Pose2d pose, double timestampSeconds, double latency, + int tagCount, double tagSpan, double avgTagDist, + double avgTagArea, RawFiducial[] rawFiducials) { this.pose = pose; this.timestampSeconds = timestampSeconds; @@ -492,22 +485,20 @@ static final String sanitizeName(String name) { return name; } - public static Pose3d toPose3D(double[] inData){ - if(inData.length < 6) - { - //System.err.println("Bad LL 3D Pose Data!"); + public static Pose3d toPose3D(double[] inData) { + if (inData.length < 6) { + // System.err.println("Bad LL 3D Pose Data!"); return new Pose3d(); } return new Pose3d( - new Translation3d(inData[0], inData[1], inData[2]), - new Rotation3d(Units.degreesToRadians(inData[3]), Units.degreesToRadians(inData[4]), - Units.degreesToRadians(inData[5]))); + new Translation3d(inData[0], inData[1], inData[2]), + new Rotation3d(Units.degreesToRadians(inData[3]), Units.degreesToRadians(inData[4]), + Units.degreesToRadians(inData[5]))); } - public static Pose2d toPose2D(double[] inData){ - if(inData.length < 6) - { - //System.err.println("Bad LL 2D Pose Data!"); + public static Pose2d toPose2D(double[] inData) { + if (inData.length < 6) { + // System.err.println("Bad LL 2D Pose Data!"); return new Pose2d(); } Translation2d tran2d = new Translation2d(inData[0], inData[1]); @@ -549,9 +540,8 @@ public static double[] pose2dToArray(Pose2d pose) { return result; } - private static double extractArrayEntry(double[] inData, int position){ - if(inData.length < position+1) - { + private static double extractArrayEntry(double[] inData, int position) { + if (inData.length < position + 1) { return 0; } return inData[position]; @@ -559,36 +549,36 @@ private static double extractArrayEntry(double[] inData, int position){ private static PoseEstimate getBotPoseEstimate(String limelightName, String entryName) { DoubleArrayEntry poseEntry = LimelightHelpers.getLimelightDoubleArrayEntry(limelightName, entryName); - + TimestampedDoubleArray tsValue = poseEntry.getAtomic(); double[] poseArray = tsValue.value; long timestamp = tsValue.timestamp; - + if (poseArray.length == 0) { // Handle the case where no data is available return null; // or some default PoseEstimate } - + var pose = toPose2D(poseArray); double latency = extractArrayEntry(poseArray, 6); - int tagCount = (int)extractArrayEntry(poseArray, 7); + int tagCount = (int) extractArrayEntry(poseArray, 7); double tagSpan = extractArrayEntry(poseArray, 8); double tagDist = extractArrayEntry(poseArray, 9); double tagArea = extractArrayEntry(poseArray, 10); - + // Convert server timestamp from microseconds to seconds and adjust for latency double adjustedTimestamp = (timestamp / 1000000.0) - (latency / 1000.0); - + RawFiducial[] rawFiducials = new RawFiducial[tagCount]; int valsPerFiducial = 7; int expectedTotalVals = 11 + valsPerFiducial * tagCount; - + if (poseArray.length != expectedTotalVals) { // Don't populate fiducials } else { - for(int i = 0; i < tagCount; i++) { + for (int i = 0; i < tagCount; i++) { int baseIndex = 11 + (i * valsPerFiducial); - int id = (int)poseArray[baseIndex]; + int id = (int) poseArray[baseIndex]; double txnc = poseArray[baseIndex + 1]; double tync = poseArray[baseIndex + 2]; double ta = poseArray[baseIndex + 3]; @@ -598,7 +588,7 @@ private static PoseEstimate getBotPoseEstimate(String limelightName, String entr rawFiducials[i] = new RawFiducial(id, txnc, tync, ta, distToCamera, distToRobot, ambiguity); } } - + return new PoseEstimate(pose, adjustedTimestamp, latency, tagCount, tagSpan, tagDist, tagArea, rawFiducials); } @@ -609,10 +599,10 @@ public static RawDetection[] getRawDetections(String limelightName) { if (rawDetectionArray.length % valsPerEntry != 0) { return new RawDetection[0]; } - + int numDetections = rawDetectionArray.length / valsPerEntry; RawDetection[] rawDetections = new RawDetection[numDetections]; - + for (int i = 0; i < numDetections; i++) { int baseIndex = i * valsPerEntry; // Starting index for this detection's data int classId = (int) extractArrayEntry(rawDetectionArray, baseIndex); @@ -627,10 +617,11 @@ public static RawDetection[] getRawDetections(String limelightName) { double corner2_Y = extractArrayEntry(rawDetectionArray, baseIndex + 9); double corner3_X = extractArrayEntry(rawDetectionArray, baseIndex + 10); double corner3_Y = extractArrayEntry(rawDetectionArray, baseIndex + 11); - - rawDetections[i] = new RawDetection(classId, txnc, tync, ta, corner0_X, corner0_Y, corner1_X, corner1_Y, corner2_X, corner2_Y, corner3_X, corner3_Y); + + rawDetections[i] = new RawDetection(classId, txnc, tync, ta, corner0_X, corner0_Y, corner1_X, corner1_Y, + corner2_X, corner2_Y, corner3_X, corner3_Y); } - + return rawDetections; } @@ -639,7 +630,7 @@ public static void printPoseEstimate(PoseEstimate pose) { System.out.println("No PoseEstimate available."); return; } - + System.out.printf("Pose Estimate Information:%n"); System.out.printf("Timestamp (Seconds): %.3f%n", pose.timestampSeconds); System.out.printf("Latency: %.3f ms%n", pose.latency); @@ -648,12 +639,12 @@ public static void printPoseEstimate(PoseEstimate pose) { System.out.printf("Average Tag Distance: %.2f meters%n", pose.avgTagDist); System.out.printf("Average Tag Area: %.2f%% of image%n", pose.avgTagArea); System.out.println(); - + if (pose.rawFiducials == null || pose.rawFiducials.length == 0) { System.out.println("No RawFiducials data available."); return; } - + System.out.println("Raw Fiducials Details:"); for (int i = 0; i < pose.rawFiducials.length; i++) { RawFiducial fiducial = pose.rawFiducials[i]; @@ -688,7 +679,7 @@ public static DoubleArrayEntry getLimelightDoubleArrayEntry(String tableName, St return table.getDoubleArrayTopic(entryName).getEntry(new double[0]); }); } - + public static double getLimelightNTDouble(String tableName, String entryName) { return getLimelightNTTableEntry(tableName, entryName).getDouble(0.0); } @@ -705,8 +696,6 @@ public static double[] getLimelightNTDoubleArray(String tableName, String entryN return getLimelightNTTableEntry(tableName, entryName).getDoubleArray(new double[0]); } - - public static String getLimelightNTString(String tableName, String entryName) { return getLimelightNTTableEntry(tableName, entryName).getString(""); } @@ -715,7 +704,6 @@ public static String[] getLimelightNTStringArray(String tableName, String entryN return getLimelightNTTableEntry(tableName, entryName).getStringArray(new String[0]); } - public static URL getLimelightURLString(String tableName, String request) { String urlString = "http://" + sanitizeName(tableName) + ".local:5807/" + request; URL url; @@ -745,42 +733,39 @@ public static double getTA(String limelightName) { public static double[] getT2DArray(String limelightName) { return getLimelightNTDoubleArray(limelightName, "t2d"); } - public static int getTargetCount(String limelightName) { - double[] t2d = getT2DArray(limelightName); - if(t2d.length == 17) - { - return (int)t2d[1]; - } - return 0; - } - - public static int getClassifierClassIndex (String limelightName) { - double[] t2d = getT2DArray(limelightName); - if(t2d.length == 17) - { - return (int)t2d[10]; - } - return 0; - } - public static int getDetectorClassIndex (String limelightName) { - double[] t2d = getT2DArray(limelightName); - if(t2d.length == 17) - { - return (int)t2d[11]; - } - return 0; - } - - public static String getClassifierClass (String limelightName) { + double[] t2d = getT2DArray(limelightName); + if (t2d.length == 17) { + return (int) t2d[1]; + } + return 0; + } + + public static int getClassifierClassIndex(String limelightName) { + double[] t2d = getT2DArray(limelightName); + if (t2d.length == 17) { + return (int) t2d[10]; + } + return 0; + } + + public static int getDetectorClassIndex(String limelightName) { + double[] t2d = getT2DArray(limelightName); + if (t2d.length == 17) { + return (int) t2d[11]; + } + return 0; + } + + public static String getClassifierClass(String limelightName) { return getLimelightNTString(limelightName, "tcclass"); } - public static String getDetectorClass (String limelightName) { + + public static String getDetectorClass(String limelightName) { return getLimelightNTString(limelightName, "tdclass"); } - public static double getLatency_Pipeline(String limelightName) { return getLimelightNTDouble(limelightName, "tl"); } @@ -935,7 +920,8 @@ public static Pose2d getBotPose2d_wpiBlue(String limelightName) { } /** - * Gets the Pose2d and timestamp for use with WPILib pose estimator (addVisionMeasurement) when you are on the BLUE + * Gets the Pose2d and timestamp for use with WPILib pose estimator + * (addVisionMeasurement) when you are on the BLUE * alliance * * @param limelightName @@ -946,7 +932,8 @@ public static PoseEstimate getBotPoseEstimate_wpiBlue(String limelightName) { } /** - * Gets the Pose2d and timestamp for use with WPILib pose estimator (addVisionMeasurement) when you are on the BLUE + * Gets the Pose2d and timestamp for use with WPILib pose estimator + * (addVisionMeasurement) when you are on the BLUE * alliance * * @param limelightName @@ -971,8 +958,10 @@ public static Pose2d getBotPose2d_wpiRed(String limelightName) { } /** - * Gets the Pose2d and timestamp for use with WPILib pose estimator (addVisionMeasurement) when you are on the RED + * Gets the Pose2d and timestamp for use with WPILib pose estimator + * (addVisionMeasurement) when you are on the RED * alliance + * * @param limelightName * @return */ @@ -981,8 +970,10 @@ public static PoseEstimate getBotPoseEstimate_wpiRed(String limelightName) { } /** - * Gets the Pose2d and timestamp for use with WPILib pose estimator (addVisionMeasurement) when you are on the RED + * Gets the Pose2d and timestamp for use with WPILib pose estimator + * (addVisionMeasurement) when you are on the RED * alliance + * * @param limelightName * @return */ @@ -1015,7 +1006,6 @@ public static void setPipelineIndex(String limelightName, int pipelineIndex) { setLimelightNTDouble(limelightName, "pipeline", pipelineIndex); } - public static void setPriorityTagID(String limelightName, int ID) { setLimelightNTDouble(limelightName, "priorityid", ID); } @@ -1052,12 +1042,12 @@ public static void setStreamMode_PiPSecondary(String limelightName) { setLimelightNTDouble(limelightName, "stream", 2); } - /** * Sets the crop window. The crop window in the UI must be completely open for * dynamic cropping to work. */ - public static void setCropWindow(String limelightName, double cropXMin, double cropXMax, double cropYMin, double cropYMax) { + public static void setCropWindow(String limelightName, double cropXMin, double cropXMax, double cropYMin, + double cropYMax) { double[] entries = new double[4]; entries[0] = cropXMin; entries[1] = cropXMax; @@ -1065,7 +1055,7 @@ public static void setCropWindow(String limelightName, double cropXMin, double c entries[3] = cropYMax; setLimelightNTDoubleArray(limelightName, "crop", entries); } - + /** * Sets 3D offset point for easy 3D targeting. */ @@ -1077,21 +1067,21 @@ public static void setFiducial3DOffset(String limelightName, double offsetX, dou setLimelightNTDoubleArray(limelightName, "fiducial_offset_set", entries); } - public static void SetRobotOrientation(String limelightName, double yaw, double yawRate, - double pitch, double pitchRate, - double roll, double rollRate) { + public static void SetRobotOrientation(String limelightName, double yaw, double yawRate, + double pitch, double pitchRate, + double roll, double rollRate) { SetRobotOrientation_INTERNAL(limelightName, yaw, yawRate, pitch, pitchRate, roll, rollRate, true); } - public static void SetRobotOrientation_NoFlush(String limelightName, double yaw, double yawRate, - double pitch, double pitchRate, - double roll, double rollRate) { + public static void SetRobotOrientation_NoFlush(String limelightName, double yaw, double yawRate, + double pitch, double pitchRate, + double roll, double rollRate) { SetRobotOrientation_INTERNAL(limelightName, yaw, yawRate, pitch, pitchRate, roll, rollRate, false); } - private static void SetRobotOrientation_INTERNAL(String limelightName, double yaw, double yawRate, - double pitch, double pitchRate, - double roll, double rollRate, boolean flush) { + private static void SetRobotOrientation_INTERNAL(String limelightName, double yaw, double yawRate, + double pitch, double pitchRate, + double roll, double rollRate, boolean flush) { double[] entries = new double[6]; entries[0] = yaw; @@ -1101,15 +1091,13 @@ private static void SetRobotOrientation_INTERNAL(String limelightName, double ya entries[4] = roll; entries[5] = rollRate; setLimelightNTDoubleArray(limelightName, "robot_orientation_set", entries); - if(flush) - { + if (flush) { Flush(); } } - - public static void SetFidcuial3DOffset(String limelightName, double x, double y, - double z) { + public static void SetFidcuial3DOffset(String limelightName, double x, double y, + double z) { double[] entries = new double[3]; entries[0] = x; @@ -1122,37 +1110,32 @@ public static void SetFiducialIDFiltersOverride(String limelightName, int[] vali double[] validIDsDouble = new double[validIDs.length]; for (int i = 0; i < validIDs.length; i++) { validIDsDouble[i] = validIDs[i]; - } + } setLimelightNTDoubleArray(limelightName, "fiducial_id_filters_set", validIDsDouble); } - public static void SetFiducialDownscalingOverride(String limelightName, float downscale) - { + public static void SetFiducialDownscalingOverride(String limelightName, float downscale) { int d = 0; // pipeline - if (downscale == 1.0) - { + if (downscale == 1.0) { d = 1; } - if (downscale == 1.5) - { + if (downscale == 1.5) { d = 2; } - if (downscale == 2) - { + if (downscale == 2) { d = 3; } - if (downscale == 3) - { + if (downscale == 3) { d = 4; } - if (downscale == 4) - { + if (downscale == 4) { d = 5; } setLimelightNTDouble(limelightName, "fiducial_downscale_set", d); } - - public static void setCameraPose_RobotSpace(String limelightName, double forward, double side, double up, double roll, double pitch, double yaw) { + + public static void setCameraPose_RobotSpace(String limelightName, double forward, double side, double up, + double roll, double pitch, double yaw) { double[] entries = new double[6]; entries[0] = forward; entries[1] = side; diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index efa081f..840f4cd 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -139,7 +139,7 @@ public static final class SuperstructureConstants { public static final int GRABBER_UP_MOTOR_ID = 0; public static final int GRABBER_LOW_MOTOR_ID = 0; public static final int GRABBER_ANGLE_MOTOR_ID = 0; - + // grabber cancoder constants public static final int GRABBER_CANCODER_ID = 0; diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 1260dcc..652d452 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -11,7 +11,7 @@ import frc.robot.subsystems.Swerve; public class RobotContainer { - + public CommandXboxController controller = new CommandXboxController(RobotConstants.DRIVE_CONTROLLER_PORT); private final Swerve swerve = new Swerve(); diff --git a/src/main/java/frc/robot/commands/TeleopSwerve.java b/src/main/java/frc/robot/commands/TeleopSwerve.java index e426f25..33d091a 100644 --- a/src/main/java/frc/robot/commands/TeleopSwerve.java +++ b/src/main/java/frc/robot/commands/TeleopSwerve.java @@ -51,7 +51,7 @@ public void execute() { // square the input to inprove driving experience xSpeed = Math.copySign(xSpeed * xSpeed, xSpeed); - ySpeed = Math.copySign(ySpeed * ySpeed, ySpeed); + ySpeed = Math.copySign(ySpeed * ySpeed, ySpeed); rotSpeed = Math.copySign(rotSpeed * rotSpeed, rotSpeed); swerve.drive( diff --git a/src/main/java/frc/robot/subsystems/Elevator.java b/src/main/java/frc/robot/subsystems/Elevator.java index 58a7f2c..7b86440 100644 --- a/src/main/java/frc/robot/subsystems/Elevator.java +++ b/src/main/java/frc/robot/subsystems/Elevator.java @@ -34,9 +34,9 @@ public class Elevator extends SubsystemBase { // shuffleboard ShuffleboardTab tab = Shuffleboard.getTab("Elevator"); GenericEntry elevatorHeight = tab.add("Elevator Height", 0) - .withPosition(0, 0).withSize(2, 1) - .withWidget(BuiltInWidgets.kTextView) - .getEntry(); + .withPosition(0, 0).withSize(2, 1) + .withWidget(BuiltInWidgets.kTextView) + .getEntry(); public Elevator() { leftElevatorMotor = new SparkMax(SuperstructureConstants.ELEVATOR_LEFT_MOTOR_ID, MotorType.kBrushless); diff --git a/src/main/java/frc/robot/subsystems/Grabber.java b/src/main/java/frc/robot/subsystems/Grabber.java index 9d43883..92b6c32 100644 --- a/src/main/java/frc/robot/subsystems/Grabber.java +++ b/src/main/java/frc/robot/subsystems/Grabber.java @@ -42,17 +42,17 @@ public class Grabber extends SubsystemBase { // shuffleboard ShuffleboardTab tab = Shuffleboard.getTab("Grabber"); GenericEntry upMotorSpeed = tab.add("Up Motor Speed (RPM)", 0) - .withPosition(0, 0).withSize(2, 1) - .withWidget(BuiltInWidgets.kTextView) - .getEntry(); + .withPosition(0, 0).withSize(2, 1) + .withWidget(BuiltInWidgets.kTextView) + .getEntry(); GenericEntry lowMotorSpeed = tab.add("Low Motor Speed (RPM)", 0) - .withPosition(1, 0).withSize(2, 1) - .withWidget(BuiltInWidgets.kTextView) - .getEntry(); + .withPosition(1, 0).withSize(2, 1) + .withWidget(BuiltInWidgets.kTextView) + .getEntry(); GenericEntry angle = tab.add("Grabber Angle (degrees)", 0) - .withPosition(2, 0) - .withWidget(BuiltInWidgets.kTextView) - .getEntry(); + .withPosition(2, 0) + .withWidget(BuiltInWidgets.kTextView) + .getEntry(); public Grabber() { upMotor = new SparkMax(SuperstructureConstants.GRABBER_UP_MOTOR_ID, MotorType.kBrushless); diff --git a/src/main/java/frc/robot/subsystems/Intake.java b/src/main/java/frc/robot/subsystems/Intake.java index c6d8336..294f1f4 100644 --- a/src/main/java/frc/robot/subsystems/Intake.java +++ b/src/main/java/frc/robot/subsystems/Intake.java @@ -20,71 +20,71 @@ import frc.robot.Constants.SuperstructureConstants; public class Intake extends SubsystemBase { - /* - * a simple intake with a row of jelly wheels - * can pick up ALGAE from the floor - * it can help the robot climb - * when folded into the chassis with DEEP CAGE - * - * control jelly wheels by NEO 550 - * control its angle by NEO Brushless (gear ratio : 61.875) - */ - - // motor for jelly wheels - private final SparkMax intakeMotor; - - // motor for angle - private final SparkMax angleMotor; - - // cancoder - private final CANcoder cancoder; - - // shuffleboard - ShuffleboardTab tab = Shuffleboard.getTab("Intake"); - GenericEntry intakeSpeed = tab.add("Intake Speed (RPM)", 0) - .withPosition(0, 0).withSize(2, 1) - .withWidget(BuiltInWidgets.kTextView) - .getEntry(); - GenericEntry intakeAngle = tab.add("Intake Angle (degrees)", 0) - .withPosition(1, 0).withSize(2, 1) - .withWidget(BuiltInWidgets.kTextView) - .getEntry(); - - public Intake() { - intakeMotor = new SparkMax(SuperstructureConstants.INTAKE_MOTOR_ID, MotorType.kBrushless); - intakeMotor.configure(SuperstructureConstants.INTAKE_MOTOR_CONFIGURATION, ResetMode.kResetSafeParameters, - PersistMode.kNoPersistParameters); - angleMotor = new SparkMax(SuperstructureConstants.INTAKE_ANGLE_MOTOR_ID, MotorType.kBrushless); - angleMotor.configure(SuperstructureConstants.INTAKE_ANGLE_MOTOR_CONFIGURATION, ResetMode.kResetSafeParameters, - PersistMode.kNoPersistParameters); - - cancoder = new CANcoder(SuperstructureConstants.INTAKE_CANCODER_ID, RobotConstants.CANBUS_NAME); - cancoder.getConfigurator().apply(SuperstructureConstants.INTAKE_CANCODER_CONFIGURATION); - } - - public void setIntakeVolt(double volts) { - intakeMotor.setVoltage(volts); - } - - public void setIntakeSpeed(double speed) { - intakeMotor.set(speed); - } - - public void setAngleMotorVolt(double volts) { - angleMotor.setVoltage(volts); - } - - public double getIntakeSpeed() { - return intakeMotor.getEncoder().getVelocity(); - } - - public double getAngle() { - return Rotation2d.fromRotations(cancoder.getAbsolutePosition().getValueAsDouble()).getDegrees(); - } - - @Override - public void periodic() { - intakeSpeed.setDouble(getIntakeSpeed()); - intakeAngle.setDouble(getAngle()); - } + /* + * a simple intake with a row of jelly wheels + * can pick up ALGAE from the floor + * it can help the robot climb + * when folded into the chassis with DEEP CAGE + * + * control jelly wheels by NEO 550 + * control its angle by NEO Brushless (gear ratio : 61.875) + */ + + // motor for jelly wheels + private final SparkMax intakeMotor; + + // motor for angle + private final SparkMax angleMotor; + + // cancoder + private final CANcoder cancoder; + + // shuffleboard + ShuffleboardTab tab = Shuffleboard.getTab("Intake"); + GenericEntry intakeSpeed = tab.add("Intake Speed (RPM)", 0) + .withPosition(0, 0).withSize(2, 1) + .withWidget(BuiltInWidgets.kTextView) + .getEntry(); + GenericEntry intakeAngle = tab.add("Intake Angle (degrees)", 0) + .withPosition(1, 0).withSize(2, 1) + .withWidget(BuiltInWidgets.kTextView) + .getEntry(); + + public Intake() { + intakeMotor = new SparkMax(SuperstructureConstants.INTAKE_MOTOR_ID, MotorType.kBrushless); + intakeMotor.configure(SuperstructureConstants.INTAKE_MOTOR_CONFIGURATION, ResetMode.kResetSafeParameters, + PersistMode.kNoPersistParameters); + angleMotor = new SparkMax(SuperstructureConstants.INTAKE_ANGLE_MOTOR_ID, MotorType.kBrushless); + angleMotor.configure(SuperstructureConstants.INTAKE_ANGLE_MOTOR_CONFIGURATION, ResetMode.kResetSafeParameters, + PersistMode.kNoPersistParameters); + + cancoder = new CANcoder(SuperstructureConstants.INTAKE_CANCODER_ID, RobotConstants.CANBUS_NAME); + cancoder.getConfigurator().apply(SuperstructureConstants.INTAKE_CANCODER_CONFIGURATION); + } + + public void setIntakeVolt(double volts) { + intakeMotor.setVoltage(volts); + } + + public void setIntakeSpeed(double speed) { + intakeMotor.set(speed); + } + + public void setAngleMotorVolt(double volts) { + angleMotor.setVoltage(volts); + } + + public double getIntakeSpeed() { + return intakeMotor.getEncoder().getVelocity(); + } + + public double getAngle() { + return Rotation2d.fromRotations(cancoder.getAbsolutePosition().getValueAsDouble()).getDegrees(); + } + + @Override + public void periodic() { + intakeSpeed.setDouble(getIntakeSpeed()); + intakeAngle.setDouble(getAngle()); + } } diff --git a/src/main/java/frc/robot/subsystems/LED.java b/src/main/java/frc/robot/subsystems/LED.java index 5cd10dc..79019c2 100644 --- a/src/main/java/frc/robot/subsystems/LED.java +++ b/src/main/java/frc/robot/subsystems/LED.java @@ -7,11 +7,12 @@ import edu.wpi.first.wpilibj2.command.SubsystemBase; public class LED extends SubsystemBase { - /** Creates a new LED. */ - public LED() {} + /** Creates a new LED. */ + public LED() { + } - @Override - public void periodic() { - // This method will be called once per scheduler run - } + @Override + public void periodic() { + // This method will be called once per scheduler run + } } diff --git a/src/main/java/frc/robot/subsystems/SwerveModule.java b/src/main/java/frc/robot/subsystems/SwerveModule.java index 1343af6..5a8ea78 100644 --- a/src/main/java/frc/robot/subsystems/SwerveModule.java +++ b/src/main/java/frc/robot/subsystems/SwerveModule.java @@ -45,7 +45,8 @@ public SwerveModule(int moduleNumber, SwerveModuleConstants moduleConstants) { lastAngle = new Rotation2d(); steerMotor = new SparkMax(moduleConstants.SteerMotorId, MotorType.kBrushless); - steerMotor.configure(SwerveConstants.STEER_MOTOR_CONFIGURATION, ResetMode.kResetSafeParameters, PersistMode.kNoPersistParameters); + steerMotor.configure(SwerveConstants.STEER_MOTOR_CONFIGURATION, ResetMode.kResetSafeParameters, + PersistMode.kNoPersistParameters); driveMotor = new TalonFX(moduleConstants.DriveMotorId, RobotConstants.CANBUS_NAME); driveMotor.getConfigurator().apply(SwerveConstants.DRIVE_MOTOR_CONFIGURATION);