From 12a81979a8e53b482f45b888faa1c8ed79d23ada Mon Sep 17 00:00:00 2001 From: Igor Misic Date: Thu, 19 May 2022 15:27:08 +0200 Subject: [PATCH] px4io: replace safety_off state with safety button event (#19558) internal PX4IO safety_off state is removed and replaced with a normal safety button event. From this 'commit' commander is taking care of the PX4IO safety. --- .../extras/cubepilot_io-v2_default.bin | Bin 39728 -> 39700 bytes .../extras/cubepilot_io-v2_default.bin | Bin 39728 -> 39700 bytes .../durandal-v1/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../pix32v5/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../mro/x21-777/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../px4/fmu-v2/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../px4/fmu-v3/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../fmu-v4pro/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../px4/fmu-v5/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../px4/fmu-v5x/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes .../px4/fmu-v6x/extras/px4_io-v2_default.bin | Bin 39952 -> 39920 bytes msg/px4io_status.msg | 2 +- src/drivers/drv_pwm_output.h | 6 - src/drivers/pca9685_pwm_out/main.cpp | 2 - src/drivers/pwm_out/PWMOut.cpp | 2 - src/drivers/px4io/px4io.cpp | 134 ++++-------------- src/drivers/uavcan/uavcan_main.cpp | 2 - src/modules/commander/commander_params.c | 2 +- src/modules/commander/esc_calibration.cpp | 10 -- src/modules/px4iofirmware/CMakeLists.txt | 2 +- src/modules/px4iofirmware/mixer.cpp | 6 +- src/modules/px4iofirmware/protocol.h | 13 +- src/modules/px4iofirmware/px4io.cpp | 10 +- src/modules/px4iofirmware/px4io.h | 6 +- src/modules/px4iofirmware/registers.c | 19 ++- .../{safety.cpp => safety_button.cpp} | 43 ++---- 26 files changed, 69 insertions(+), 190 deletions(-) rename src/modules/px4iofirmware/{safety.cpp => safety_button.cpp} (79%) diff --git a/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin b/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin index fc9066700fbd65dc8c497a04666ced228cbc4148..c75ca85285ec0cafc4b54bea788887dbd1187089 100755 GIT binary patch delta 4249 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 diff --git a/boards/cubepilot/cubeyellow/extras/cubepilot_io-v2_default.bin b/boards/cubepilot/cubeyellow/extras/cubepilot_io-v2_default.bin index fc9066700fbd65dc8c497a04666ced228cbc4148..c75ca85285ec0cafc4b54bea788887dbd1187089 100755 GIT binary patch delta 4249 zcmZ8l4OA3YmVU3Qe~Le8KoIDl-IOSZKOkyIh@kMP3B6IX2gEQOkD;V2J71js&LXiO>WZ2`}i@PvxB{^(1{I6r@;8tfF z8?Kpfr4ey`fZKq-Hah<^H^*RR&!?&_giOJ zd=17&NS*#Ae3N{oKaRh5Rz0&r%{)Hs{K5Dy7+-Ok`7^=zymM%ljDdcf^DM)7PCMi0 zPSb?#Y(^Xf(g8b*Ge1#jw7*AO;Ixxj_=G9yndJyZtZqr!7oq z;%<~=9r?{xh9DkI?;Aq=i30W*BiR*=;kcQVB7NAHH+lwn%CM z@Uf6LdJr^qFqdN)JqqGZ50VDGNcwsVNy`9{W1-Dhs&I!lY7C9-sgCfI5skaS@lRm$ z$jeAumEhxyWLA*$B!HwFV^}Kp_v*<9i{se>zm{|_o?crmHfj@YVrhfzI-l!Vkstg`WOK;-Skkz=m6d5B4Ie8gZN6=bZJih+F`B4; zngNY>f@gX0Eyy)0&)knC)=%Ywxm-_uZq7GYnm)FqaEV1{UsAj+nZIp~m)3;F*=N~9 zy?8X#tNz(4y%l=VD~)z|ePox_7=8V=$r5kJbK`Aax=aPwzA#1X(U1&T)TGErlk|eZHW1Lv!=8)y>V#o8NLAJ-QeENZXRe^4aDi?E#q^JL2jR z?`jX-%o`P=PURjPNP)`d$M(Cvc)~`gq;SMYX+8(o@FR{qy-FXdde9|KZ5xlNy30}H z0)6$c%OK3#!$^7FjihC%-tuBV*EvmzHdVO1G6HEe0AU?z#4;ruhoQJp5660-5 z>*nr>i;zhL_yVFpz*m8H0mjym3FRxXk8CW@#xIbT^6B_la--Zh>x3Ke279~^CwS%a z?o@E)U{h`CR;e5H(1p}t9qXrw>XqTkL+*({UM`Y}ddWeP)No;FV{%V=R-3Vr^=Wr@EspF~zaA{80uTjmuX!%mV*~^evx~ z^p1N0SS;{hKGl{x{0t=3J(y_<$p3X2_0Uv8X=)^*BFYkNN1U!hUleTM?YxA+5=+Gj zZx1%)Jsk-!!Z6~-=dxj>*D|+gRqDEV`x=;0jnB*_Z&Xx9TvOD7D0~kcu~8cW-Spqd z-3rU}uNAGuD8$;d1z3{CG?rMX1k_Xiw5I9(XMPt7mIiI6U z2N{*xK~5okD^vJ+fiH&;W{j1fnV?jQJUo{?Nyk<@_;+yzUxy@~#H~u25|CMiF`5hf zav)GGVk19pgZQEX-r<*jB&${}goqng<-pm!w<;SyCJC#Jcr(dfof7SU*pi>dO`l6Y z$hXO^)y7&8}=7 zXczZjzD4YP;)vQ@7zHzjg@9ZhW?JNfKMkSve{kVxPM2T) z!jESM4WtU?X6yg6%z{%EP-k_XfZC)|RA+;NO8(wnE#6m5O;M6A{3Oia0W@n(Kg{Fm zP7K|%$c>H96&z5I&M()e_;bx_gI_-9r>0BWvbOW%?m{}5+3dhtFSn?OH! z#`$ISY)s8Z*A(CxBzx_8t-+fnc;tKJ!diWV0uBaYPc##o=q-Phe82X3FxA>28d&yk z>n`F(vUdIYgkSt2Zq|@wRSTiQnbt`HGHyy_o5$oVGPM39Ml(hZ+aIW@zfEM@hU}*y zkV_j*)h7DrZQzzC1D^(t2R;ZK11&HbIMSChdI5NXuW0xXa4_gYfi=E@VKp!VtOE9X z3y1Z<9&gTQJn*O&UN7P8(k)kl2g-j33l4Y)W~?JuO5E~dpS5;ecrb2^VKN_#DStPv zi3RBe&`|#KxF!yy4A4;ik8zC#q#2;0{Q0;>3z88ul%3-m9Z0dDp?q#!69G~lVF2x%B7k-&+DUaCXlkq_ zQHV9C8hVG&B9HtBzfpk0`)YK7TYi(Yyq*$D=ytl=Lb1uQ~3cv?@QuR)#oGuvm06qs?2E;cZ?nOWqU_anI;9CImA>w8`)o<3| z`P2nnPM1`Gx*c#CKwbTV%D{Vor@@!0Z-J@%AaY?_94;gOxy>B?0LE7V{eaAlFd@(A zlRqO#Z&hH4)V|e*Z#&c9u4Lk<2{qjVQPSj*01?I@MKLj%80zT1(Pf3E8n&x-sJln#9tDDBA^J%FgJ$mv~Z z>iOJ>ceX=wyY8oDbpR>yVJ{u``sqqK7M-u`Okwj2U>kbC>DD8V?yl@(+2~5uBANnC zi#`e&^fWA*9!;C3NYkcaW&)Nw`)WgQ1f8ZT>WW5Q;2d)BIF6=AlcAQ>8#STc21!zV zrTQ8jk-hcT@rR^zcQkG$>v!klH_3(FQ}8y@w>ujzB4K-ya4yN%Q;fHhx;-B!o%9(5 z=3}qC#jlzia`)a46RB=goj}LDa>|%$GINJ%_R7V?x_1`5UGCcZT=Y%%48bU1&^~r+ zThqF!^aHuRSC4-nuDwQFPJ;I7BLFKssPP;5mR1kmSUNk8}7c wX*glwl21W*gSWyR44211cTVI(4Sg2|V9SuNb-cfn@ff&RTCh*82GN z*=L`9_P%$YeJ(VA!gPJYU~M;k0pney3dhSOVMv7#QnlL~u><3;NIshfzu#cz;jir7 zY#{#(;e+)miSIyWhWy0F*e^LJe<8SSH&AY+)ihVR)#6W+Yw~%3`x7p+7 zKOGd-(t$V%qyV;;=A4%VY1$AM-)3hPFOuU=$znbpe`;UDM`NJv&qoE}r^vq2d3c!o zt~9CM>ro^l^_il8nCWJOdqcL><`?Nm${$uT#hHj|Wlesgk`t-|snT zU_z7k8eOmMU;R1?FC)_cr)@D#NT+4;PN41coGR40g02L9ayOGgts;tTYG|3;U^mOxz>nQR(K3n zqK^^Ya0kOi6>cQ>14#JGBo;RLyB=^XX z^5fFz`i;frLau*pq5MWoP))=UTH(+f5GJTIqCH(<)OA(U@tZ!QNG+ zLy(=afFHm@n4ii`I<9|@?&mkKkU3daTxOVVDJ$LiOw#a+s#r_9CBLAsV3(@fH$HyB zCp^XraP~P}b3ampN77_eM*nG8YlySp`EjN{I<-aEvUqj_oh5doy58>0E?!_zSYjJ*};;IKMD~Gpo zZ!a8{W12pT zzwSnd1L7V(7WPcO!3Q5vkeaf1xfV()MUGU<$icEK`4$*yb>V0mxmuQhZxLtNJlsyA z%U5Qf*5e0-cqHaxk8BnmZYk6bV&Tz5o1v}v(kO$8Eud=cDG;JwH|Dh5gp(vo}eR{4tO1skO zqYDLw^;wNhlwR*DJ^%LtdOjoq#$K@}u*7K;0vUtk$K|p35RtEV9{)EfU!lhDklGb# z5noS8R7iN;+u=q?3Q`?8zalrRW5OsP?vK2dN5T~%uF&H)lD{&(KIcO5SQPS#ApuRP zrX-~}$NnLlhLl@o+ijV8NNEX9Q{Vp3rgT}inr%-HC4WoNy641M!D&j?Qdd~Go{UYq7B=GxS|n^OyuAyb;(NaEQ?QE<~6!>%QN{| z7DPgemuP%qyccOg^l_l^iSxV~3#~kjiRs$bH*E>hN&sI$6bN_#xDgPsnRr*N!((Li z>O8!F99umTr<4BG>h#}wkVa*R<70WBc-oT&uB>dDN!lg!p?WK@fZty zoAg#B$+mhHfW=($T}4y^4Knme&~!fqfF{8KW|N3D%7k*a#uBV55HO^Pg<=?C7;#gh z0+PQb7ILawQyKBKTguz`+isN6Dhq-Bc$s{;#xQfhEi0?Z?;`}q-A$4&Du7lsSSQI6EtA9Rmzt3V~qnWtjev$O0YQ0)73Hk4%?REn0{EP zRBk)-))Bt7XL&bH=LWOtvbr6%Bq=+jQoji4IQ(WCguA_7DX3(tiy{a7Vh`l@g1({{ zz9m9%7MGR`>>gxNBkzAciV9CTacZa2FWUV$T|Su0uhcL7f0kKwtPlt;=xu?@q*8qE zaW`sz!F#}Kwi%2{K@px?#|(b<5QSF_z&x((#VV93=sj4yu;{sMesPCirk|!g z_&7b)_j)z(E%5sxE_u5CniHj+9Vq9^pw~LxSRGWf4%}wN)NQ(oSC9xQWs?8+B3_tg9diW&?wQ$uG={f^6-GleF8ncm~l_ zZHK1lSNHz)k$4{_Fwc^6z#<^GLlVneCVq)5-PC?=$WR@`~lYl=`!gH8pupLLhB5C+nw8(5~(g6~L!} zLxG!sIcRWEz>|F189JPvro_tVFt zM=S*o&7k=XEI8o1Fk^IGEc1xk31j_~aAV3C!{kCRrhIiu69dvSprL$mN)roGDrhMG zZb}mb(hSg0J~yS2fusZt<@cvF3Xp<9L;2*CCITc3nrT!ZzP=Goi{N875k}(N!A z!vWqHRpb#jkwY)%D(46KMikm5V>Sr(axe9C%6{+VyNvuIh@XWb)#vulw>xqEA7FR| z5CeNs^=nW$mtg!Q;0wTIzyg?C3wRxH25<#121q=OxMKTgZ7t5GF6eT)WGAS<2HXKq zSHbY75p~lJV;#t2z|?&zIkGbr^W?*w`lt~Y4*-S%ITynC0`-J=mdJOl!G9y>UETP; zJ?dALOe{5_rVS7!-Hw`9%3-1vdN&44=XnHhl znj%e`hN%UZ?A`StID$@76?H`;FSB2_YH%z~k0wJcsW)muy$M9Vr&4-@j!4a(YthYq zNn+65IeaFMTLNNpK$0lE;}%a4!`?!;T#xKc!kbC=Ui!iHaBnJpmP9v{;$~9a@ImTZ z6Dpqhz$co)L&)8GqfDfmve!3HJ=zxV&Ck=9pvVlr8t$S_brSr zIQAb42{g`(39dA!*CU>`Z{4?8g0=RKn&Kr1*LNVUuoiK8Kq;UcuoAEskZ=Ft&@m2o xlGj@d+>(>fZQ=h0q^fy3`A5qRE)*1p|D)J-e8-f93O}(3I?;yblJ`$+{Wp7fd#nHe diff --git a/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin b/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin index 25a00e2357d781ece9c0d41447c3f4a52c6d19f6..47e85b6bd08c4d3d9b31d298e01285e1ee28e44c 100755 GIT binary patch delta 4392 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 delta 4572 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 delta 4572 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 delta 4572 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 delta 4572 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 delta 4572 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 delta 4572 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 delta 4572 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 delta 4572 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 delta 4572 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 #include #include +#include #include #include @@ -196,7 +197,8 @@ private: uint16_t _last_written_arming_c{0}; ///< the last written arming state reg uORB::Subscription _t_actuator_armed{ORB_ID(actuator_armed)}; ///< system armed control topic - uORB::Subscription _t_vehicle_command{ORB_ID(vehicle_command)}; ///< vehicle command topic + uORB::Subscription _t_vehicle_command{ORB_ID(vehicle_command)}; ///< vehicle command topic + uORB::Subscription _t_vehicle_status{ORB_ID(vehicle_status)}; ///< vehicle status topic uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s}; @@ -443,15 +445,14 @@ int PX4IO::init() // the startup script to be able to load a new IO // firmware - // If IO has already safety off it won't accept going into bootloader mode, - // therefore we need to set safety on first. - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_FORCE_SAFETY_ON, PX4IO_FORCE_SAFETY_MAGIC); - // Now the reboot into bootloader mode should succeed. io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_REBOOT_BL, PX4IO_REBOOT_BL_MAGIC); return -1; } + /* Set safety_off to false when FMU boot*/ + io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_SAFETY_OFF, 0); + if (_max_rc_input > input_rc_s::RC_INPUT_MAX_CHANNELS) { _max_rc_input = input_rc_s::RC_INPUT_MAX_CHANNELS; } @@ -476,14 +477,6 @@ int PX4IO::init() return ret; } - /* set safety to off if circuit breaker enabled */ - if (circuit_breaker_enabled("CBRK_IO_SAFETY", CBRK_IO_SAFETY_KEY)) { - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_FORCE_SAFETY_OFF, PX4IO_FORCE_SAFETY_MAGIC); - - } else { - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_FORCE_SAFETY_ON, PX4IO_FORCE_SAFETY_MAGIC); - } - /* try to claim the generic PWM output device node as well - it's OK if we fail at this */ if (_param_sys_hitl.get() <= 0 && _param_sys_use_io.get() == 1) { _class_instance = register_class_devname(PWM_OUTPUT_BASE_DEVICE_PATH); @@ -621,11 +614,6 @@ void PX4IO::Run() update_params(); - /* Check if the IO safety circuit breaker has been updated */ - bool circuit_breaker_io_safety_enabled = circuit_breaker_enabled("CBRK_IO_SAFETY", CBRK_IO_SAFETY_KEY); - /* Bypass IO safety switch logic by setting FORCE_SAFETY_OFF */ - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_FORCE_SAFETY_OFF, circuit_breaker_io_safety_enabled); - /* Check if the flight termination circuit breaker has been updated */ bool disable_flighttermination = circuit_breaker_enabled("CBRK_FLIGHTTERM", CBRK_FLIGHTTERM_KEY); /* Tell IO that it can terminate the flight if FMU is not responding or if a failure has been reported by the FailureDetector logic */ @@ -974,15 +962,12 @@ int PX4IO::io_handle_status(uint16_t status) */ /* check for IO reset - force it back to armed if necessary */ - if (_status & PX4IO_P_STATUS_FLAGS_SAFETY_OFF && !(status & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) - && !(status & PX4IO_P_STATUS_FLAGS_ARM_SYNC)) { + if (!(status & PX4IO_P_STATUS_FLAGS_ARM_SYNC)) { /* set the arming flag */ - ret = io_reg_modify(PX4IO_PAGE_STATUS, PX4IO_P_STATUS_FLAGS, 0, - PX4IO_P_STATUS_FLAGS_SAFETY_OFF | PX4IO_P_STATUS_FLAGS_ARM_SYNC); + ret = io_reg_modify(PX4IO_PAGE_STATUS, PX4IO_P_STATUS_FLAGS, 0, PX4IO_P_STATUS_FLAGS_ARM_SYNC); /* set new status */ _status = status; - _status &= PX4IO_P_STATUS_FLAGS_SAFETY_OFF; } else if (!(_status & PX4IO_P_STATUS_FLAGS_ARM_SYNC)) { @@ -999,18 +984,26 @@ int PX4IO::io_handle_status(uint16_t status) } /** - * Get and handle the safety status + * Get and handle the safety button status */ - const bool safety_off = status & PX4IO_P_STATUS_FLAGS_SAFETY_OFF; + const bool safety_button_pressed = status & PX4IO_P_STATUS_FLAGS_SAFETY_BUTTON_EVENT; - /* px4io board will change safety_off from false to true and stay like that until the vehicle is rebooted - * where safety will change back to false. Here we are triggering the safety button event once. - * TODO: change px4io firmware to act on the event. This will enable the "force safety on disarming" feature. */ - if (_previous_safety_off != safety_off) { + if (safety_button_pressed) { + io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_SAFETY_BUTTON_ACK, 0); _button_publisher.safetyButtonTriggerEvent(); } - _previous_safety_off = safety_off; + /** + * Inform PX4IO board about safety_off state for LED control + */ + vehicle_status_s vehicle_status; + + if (_t_vehicle_status.update(&vehicle_status)) { + if (_previous_safety_off != vehicle_status.safety_off) { + io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_SAFETY_OFF, vehicle_status.safety_off); + _previous_safety_off = vehicle_status.safety_off; + } + } return ret; } @@ -1033,37 +1026,17 @@ int PX4IO::dsm_bind_ioctl(int dsmMode) return -EINVAL; } - // Check if safety was off - bool safety_off = (_status & PX4IO_P_STATUS_FLAGS_SAFETY_OFF); - int ret = -1; - - // Put safety on - if (safety_off) { - // re-enable safety - ret = io_reg_modify(PX4IO_PAGE_STATUS, PX4IO_P_STATUS_FLAGS, PX4IO_P_STATUS_FLAGS_SAFETY_OFF, 0); - - // set new status - _status &= ~(PX4IO_P_STATUS_FLAGS_SAFETY_OFF); - } - PX4_INFO("Binding DSM%s RX", (dsmMode == DSM2_BIND_PULSES) ? "2" : ((dsmMode == DSMX_BIND_PULSES) ? "-X" : "-X8")); - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_power_down); + int ret = OK; + ret |= io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_power_down); px4_usleep(500000); - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_set_rx_out); - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_power_up); + ret |= io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_set_rx_out); + ret |= io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_power_up); px4_usleep(72000); - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_send_pulses | (dsmMode << 4)); + ret |= io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_send_pulses | (dsmMode << 4)); px4_usleep(50000); - io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_reinit_uart); - ret = OK; - - // Put safety back off - if (safety_off) { - ret = io_reg_modify(PX4IO_PAGE_STATUS, PX4IO_P_STATUS_FLAGS, 0, - PX4IO_P_STATUS_FLAGS_SAFETY_OFF); - _status |= PX4IO_P_STATUS_FLAGS_SAFETY_OFF; - } + ret |= io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_DSM, dsm_bind_reinit_uart); if (ret != OK) { PX4_INFO("Binding DSM failed"); @@ -1133,7 +1106,7 @@ int PX4IO::io_get_status() status.status_arm_sync = STATUS_FLAGS & PX4IO_P_STATUS_FLAGS_ARM_SYNC; status.status_init_ok = STATUS_FLAGS & PX4IO_P_STATUS_FLAGS_INIT_OK; status.status_failsafe = STATUS_FLAGS & PX4IO_P_STATUS_FLAGS_FAILSAFE; - status.status_safety_off = STATUS_FLAGS & PX4IO_P_STATUS_FLAGS_SAFETY_OFF; + status.status_safety_button_event = STATUS_FLAGS & PX4IO_P_STATUS_FLAGS_SAFETY_BUTTON_EVENT; // PX4IO_P_STATUS_ALARMS status.alarm_rc_lost = STATUS_ALARMS & PX4IO_P_STATUS_ALARMS_RC_LOST; @@ -1644,18 +1617,6 @@ int PX4IO::ioctl(file *filep, int cmd, unsigned long arg) *(unsigned *)arg = _max_actuators; break; - case PWM_SERVO_SET_FORCE_SAFETY_OFF: - PX4_DEBUG("PWM_SERVO_SET_FORCE_SAFETY_OFF"); - /* force safety swith off */ - ret = io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_FORCE_SAFETY_OFF, PX4IO_FORCE_SAFETY_MAGIC); - break; - - case PWM_SERVO_SET_FORCE_SAFETY_ON: - PX4_DEBUG("PWM_SERVO_SET_FORCE_SAFETY_ON"); - /* force safety switch on */ - ret = io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_FORCE_SAFETY_ON, PX4IO_FORCE_SAFETY_MAGIC); - break; - case DSM_BIND_START: /* bind a DSM receiver */ ret = dsm_bind_ioctl(arg); @@ -1725,16 +1686,6 @@ int PX4IO::ioctl(file *filep, int cmd, unsigned long arg) } - // re-enable safety - ret = io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_FORCE_SAFETY_ON, PX4IO_FORCE_SAFETY_MAGIC); - - if (ret != PX4_OK) { - PX4_WARN("IO refused to re-enable safety"); - } - - // set new status - _status &= ~(PX4IO_P_STATUS_FLAGS_SAFETY_OFF); - /* reboot into bootloader - arg must be PX4IO_REBOOT_BL_MAGIC */ usleep(1); ret = io_reg_set(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_REBOOT_BL, arg); @@ -2058,29 +2009,6 @@ int PX4IO::custom_command(int argc, char *argv[]) return 1; } - - if (!strcmp(verb, "safety_off")) { - int ret = get_instance()->ioctl(NULL, PWM_SERVO_SET_FORCE_SAFETY_OFF, 0); - - if (ret != OK) { - PX4_ERR("failed to disable safety (%i)", ret); - return 1; - } - - return 0; - } - - if (!strcmp(verb, "safety_on")) { - int ret = get_instance()->ioctl(NULL, PWM_SERVO_SET_FORCE_SAFETY_ON, 0); - - if (ret != OK) { - PX4_ERR("failed to enable safety (%i)", ret); - return 1; - } - - return 0; - } - if (!strcmp(verb, "debug")) { if (argc <= 1) { PX4_ERR("usage: px4io debug LEVEL"); @@ -2162,8 +2090,6 @@ Output driver communicating with the IO co-processor. PRINT_MODULE_USAGE_ARG("", "Firmware file", false); PRINT_MODULE_USAGE_COMMAND_DESCR("update", "Update IO firmware"); PRINT_MODULE_USAGE_ARG("", "Firmware file", true); - PRINT_MODULE_USAGE_COMMAND_DESCR("safety_off", "Turn off safety (force)"); - PRINT_MODULE_USAGE_COMMAND_DESCR("safety_on", "Turn on safety (force)"); PRINT_MODULE_USAGE_COMMAND_DESCR("debug", "set IO debug level"); PRINT_MODULE_USAGE_ARG("", "0=disabled, 9=max verbosity", false); PRINT_MODULE_USAGE_COMMAND_DESCR("bind", "DSM bind"); diff --git a/src/drivers/uavcan/uavcan_main.cpp b/src/drivers/uavcan/uavcan_main.cpp index e1bfc231b0..cc87e8e070 100644 --- a/src/drivers/uavcan/uavcan_main.cpp +++ b/src/drivers/uavcan/uavcan_main.cpp @@ -951,8 +951,6 @@ UavcanNode::ioctl(file *filp, int cmd, unsigned long arg) switch (cmd) { case PWM_SERVO_SET_ARM_OK: case PWM_SERVO_CLEAR_ARM_OK: - case PWM_SERVO_SET_FORCE_SAFETY_OFF: - // these are no-ops, as no safety switch break; case MIXERIOCRESET: diff --git a/src/modules/commander/commander_params.c b/src/modules/commander/commander_params.c index f1bb34c84c..c22c489987 100644 --- a/src/modules/commander/commander_params.c +++ b/src/modules/commander/commander_params.c @@ -927,7 +927,7 @@ PARAM_DEFINE_INT32(COM_PREARM_MODE, 0); /** * Enable force safety * - * Force safety when the vehicle disarms. Not supported when safety button used over PX4IO board. + * Force safety when the vehicle disarms * * @boolean * @group Commander diff --git a/src/modules/commander/esc_calibration.cpp b/src/modules/commander/esc_calibration.cpp index 1f43cc6a4d..865017ac27 100644 --- a/src/modules/commander/esc_calibration.cpp +++ b/src/modules/commander/esc_calibration.cpp @@ -187,13 +187,6 @@ static int do_esc_calibration_ioctl(orb_advert_t *mavlink_log_pub) goto Out; } - /* tell IO to switch off safety without using the safety switch */ - if (px4_ioctl(fd, PWM_SERVO_SET_FORCE_SAFETY_OFF, 0) != PX4_OK) { - calibration_log_critical(mavlink_log_pub, CAL_QGC_FAILED_MSG, "Unable to force safety off"); - return_code = PX4_ERROR; - goto Out; - } - calibration_log_info(mavlink_log_pub, "[cal] Connect battery now"); timeout_start = hrt_absolute_time(); @@ -233,9 +226,6 @@ static int do_esc_calibration_ioctl(orb_advert_t *mavlink_log_pub) Out: if (fd != -1) { - if (px4_ioctl(fd, PWM_SERVO_SET_FORCE_SAFETY_ON, 0) != PX4_OK) { - calibration_log_info(mavlink_log_pub, CAL_QGC_FAILED_MSG, "Safety switch still off"); - } if (px4_ioctl(fd, PWM_SERVO_DISARM, 0) != PX4_OK) { calibration_log_info(mavlink_log_pub, CAL_QGC_FAILED_MSG, "Servos still armed"); diff --git a/src/modules/px4iofirmware/CMakeLists.txt b/src/modules/px4iofirmware/CMakeLists.txt index 6e4bcdee66..3df90ffdac 100644 --- a/src/modules/px4iofirmware/CMakeLists.txt +++ b/src/modules/px4iofirmware/CMakeLists.txt @@ -39,7 +39,7 @@ add_library(px4iofirmware mixer.cpp px4io.cpp registers.c - safety.cpp + safety_button.cpp serial.cpp ) diff --git a/src/modules/px4iofirmware/mixer.cpp b/src/modules/px4iofirmware/mixer.cpp index 2e0e5bb14f..9fc40dcbde 100644 --- a/src/modules/px4iofirmware/mixer.cpp +++ b/src/modules/px4iofirmware/mixer.cpp @@ -134,13 +134,11 @@ mixer_tick() * FMU or from the mixer. * */ - should_arm = (r_status_flags & PX4IO_P_STATUS_FLAGS_INIT_OK) /* IO initialised without error */ - && (r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) /* and IO is armed */ + should_arm = (r_status_flags & PX4IO_P_STATUS_FLAGS_INIT_OK) /* IO initialised without error */ && (r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_ARMED) /* and FMU is armed */ ; - should_arm_nothrottle = ((r_status_flags & PX4IO_P_STATUS_FLAGS_INIT_OK) /* IO initialised without error */ - && (r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) /* and IO is armed */ + should_arm_nothrottle = ((r_status_flags & PX4IO_P_STATUS_FLAGS_INIT_OK) /* IO initialised without error */ && ((r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_PREARMED) /* and FMU is prearmed */ || (r_status_flags & PX4IO_P_STATUS_FLAGS_RAW_PWM) /* or direct PWM is set */ )); diff --git a/src/modules/px4iofirmware/protocol.h b/src/modules/px4iofirmware/protocol.h index 73c82dae9d..a0389d78b4 100644 --- a/src/modules/px4iofirmware/protocol.h +++ b/src/modules/px4iofirmware/protocol.h @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2012-2017 PX4 Development Team. All rights reserved. + * Copyright (c) 2012-2022 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -114,6 +114,7 @@ #define PX4IO_P_STATUS_FLAGS_FMU_INITIALIZED (1 << 11) /* FMU was initialized and OK once */ #define PX4IO_P_STATUS_FLAGS_RC_ST24 (1 << 12) /* ST24 input is valid */ #define PX4IO_P_STATUS_FLAGS_RC_SUMD (1 << 13) /* SUMD input is valid */ +#define PX4IO_P_STATUS_FLAGS_SAFETY_BUTTON_EVENT (1 << 14) /* px4io safety button was pressed for longer than 1 second */ #define PX4IO_P_STATUS_ALARMS 3 /* alarm flags - alarms latch, write 1 to a bit to clear it */ #define PX4IO_P_STATUS_ALARMS_RC_LOST (1 << 0) /* timed out waiting for RC input */ @@ -184,12 +185,8 @@ enum { /* DSM bind states */ #define PX4IO_P_SETUP_CRC 11 /* get CRC of IO firmware */ /* storage space of 12 occupied by CRC */ -#define PX4IO_P_SETUP_FORCE_SAFETY_OFF 12 /* force safety switch into - 'armed' (PWM enabled) state - this is a non-data write and - hence index 12 can safely be used. */ - -#define PX4IO_P_SETUP_FORCE_SAFETY_ON 14 /* force safety switch into 'disarmed' (PWM disabled state) */ -#define PX4IO_FORCE_SAFETY_MAGIC 22027 /* required argument for force safety (random) */ +#define PX4IO_P_SETUP_SAFETY_BUTTON_ACK 14 /**< ACK from FMU when it gets safety button pressed status */ +#define PX4IO_P_SETUP_SAFETY_OFF 15 /**< FMU inform PX4IO about safety_off for LED indication*/ #define PX4IO_P_SETUP_SBUS_RATE 16 /**< frame rate of SBUS1 output in Hz */ #define PX4IO_P_SETUP_THERMAL 17 /**< thermal management */ #define PX4IO_P_SETUP_ENABLE_FLIGHTTERMINATION 18 /**< flight termination; false if the circuit breaker (CBRK_FLIGHTTERM) is set */ @@ -212,7 +209,7 @@ enum { /* DSM bind states */ #define PX4IO_PAGE_TEST 127 #define PX4IO_P_TEST_LED 0 /**< set the amber LED on/off */ -/* PWM disarmed values that are active, even when SAFETY_SAFE */ +/* PWM disarmed values that are active */ #define PX4IO_PAGE_DISARMED_PWM 109 /* 0..CONFIG_ACTUATOR_COUNT-1 */ /** diff --git a/src/modules/px4iofirmware/px4io.cpp b/src/modules/px4iofirmware/px4io.cpp index 74f6637f46..69527d7bf2 100644 --- a/src/modules/px4iofirmware/px4io.cpp +++ b/src/modules/px4iofirmware/px4io.cpp @@ -154,8 +154,7 @@ show_debug_messages(void) static void update_mem_usage(void) { - if (/* IO armed */ (r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) - /* and FMU is armed */ && (r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_ARMED)) { + if (/* FMU is armed */ (r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_ARMED)) { return; } @@ -183,8 +182,7 @@ ring_blink(void) { #if defined(LED_GREEN) - if (/* IO armed */ (r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) - /* and FMU is armed */ && (r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_ARMED)) { + if (/* FMU is armed */ (r_setup_arming & PX4IO_P_SETUP_ARMING_FMU_ARMED)) { LED_GREEN(true); return; } @@ -314,8 +312,8 @@ extern "C" __EXPORT int user_start(int argc, char *argv[]) ENABLE_SBUS_OUT(false); #endif - /* start the safety switch handler */ - safety_init(); + /* start the safety button handler */ + safety_button_init(); /* initialise the control inputs */ controls_init(); diff --git a/src/modules/px4iofirmware/px4io.h b/src/modules/px4iofirmware/px4io.h index c8872c8aa0..99cba83e67 100644 --- a/src/modules/px4iofirmware/px4io.h +++ b/src/modules/px4iofirmware/px4io.h @@ -131,8 +131,6 @@ extern struct sys_state_s system_state; # define ADC_VSERVO 4 # define ADC_RSSI 5 -#define BUTTON_SAFETY px4_arch_gpioread(GPIO_BTN_SAFETY) - #define PX4_CRITICAL_SECTION(cmd) { irqstate_t flags = px4_enter_critical_section(); cmd; px4_leave_critical_section(flags); } void atomic_modify_or(volatile uint16_t *target, uint16_t modification); @@ -145,9 +143,9 @@ void atomic_modify_and(volatile uint16_t *target, uint16_t modification); extern void mixer_tick(void); /** - * Safety switch/LED. + * Safety button/LED. */ -extern void safety_init(void); +extern void safety_button_init(void); extern void failsafe_led_init(void); /** diff --git a/src/modules/px4iofirmware/registers.c b/src/modules/px4iofirmware/registers.c index dfe0a6f8ec..1bf9b98763 100644 --- a/src/modules/px4iofirmware/registers.c +++ b/src/modules/px4iofirmware/registers.c @@ -413,7 +413,7 @@ registers_set_one(uint8_t page, uint8_t offset, uint16_t value) break; case PX4IO_P_SETUP_REBOOT_BL: - if (r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) { + if (r_status_flags & PX4IO_P_STATUS_FLAGS_OUTPUTS_ARMED) { // don't allow reboot while armed break; } @@ -433,22 +433,19 @@ registers_set_one(uint8_t page, uint8_t offset, uint16_t value) dsm_bind(value & 0x0f, (value >> 4) & 0xF); break; - case PX4IO_P_SETUP_FORCE_SAFETY_ON: - if (value == PX4IO_FORCE_SAFETY_MAGIC) { - r_status_flags &= ~PX4IO_P_STATUS_FLAGS_SAFETY_OFF; - - } else { - return -1; - } + case PX4IO_P_SETUP_SAFETY_BUTTON_ACK: + // clear safety button pressed flag so it can be used again + r_status_flags &= ~PX4IO_P_STATUS_FLAGS_SAFETY_BUTTON_EVENT; break; - case PX4IO_P_SETUP_FORCE_SAFETY_OFF: - if (value == PX4IO_FORCE_SAFETY_MAGIC) { + case PX4IO_P_SETUP_SAFETY_OFF: + + if (value) { r_status_flags |= PX4IO_P_STATUS_FLAGS_SAFETY_OFF; } else { - return -1; + r_status_flags &= ~PX4IO_P_STATUS_FLAGS_SAFETY_OFF; } break; diff --git a/src/modules/px4iofirmware/safety.cpp b/src/modules/px4iofirmware/safety_button.cpp similarity index 79% rename from src/modules/px4iofirmware/safety.cpp rename to src/modules/px4iofirmware/safety_button.cpp index 1a5eedb7d7..6d4672d5f2 100644 --- a/src/modules/px4iofirmware/safety.cpp +++ b/src/modules/px4iofirmware/safety_button.cpp @@ -32,7 +32,7 @@ ****************************************************************************/ /** - * @file safety.cpp + * @file safety_button.cpp * Safety button logic. * * @author Lorenz Meier @@ -46,7 +46,7 @@ #include "px4io.h" -static struct hrt_call arming_call; +static struct hrt_call safety_button_call; static struct hrt_call failsafe_call; /* @@ -59,30 +59,23 @@ static unsigned counter = 0; * Define the various LED flash sequences for each system state. */ #define LED_PATTERN_FMU_OK_TO_ARM 0x0003 /**< slow blinking */ -#define LED_PATTERN_FMU_REFUSE_TO_ARM 0x5555 /**< fast blinking */ +#define LED_PATTERN_FMU_REFUSE_TO_ARM 0x5555 /**< fast blinking */ #define LED_PATTERN_IO_ARMED 0x5050 /**< long off, then double blink */ #define LED_PATTERN_FMU_ARMED 0x5500 /**< long off, then quad blink */ #define LED_PATTERN_IO_FMU_ARMED 0xffff /**< constantly on */ static unsigned blink_counter = 0; -/* - * IMPORTANT: The arming state machine critically - * depends on using the same threshold - * for arming and disarming. Since disarming - * is quite deadly for the system, a similar - * length can be justified. - */ -#define ARM_COUNTER_THRESHOLD 10 +#define SAFETY_SWITCH_THRESHOLD 10 -static void safety_check_button(void *arg); +static void safety_button_check(void *arg); static void failsafe_blink(void *arg); void -safety_init(void) +safety_button_init(void) { /* arrange for the button handler to be called at 10Hz */ - hrt_call_every(&arming_call, 1000, 100000, safety_check_button, NULL); + hrt_call_every(&safety_button_call, 1000, 100000, safety_button_check, NULL); } void @@ -93,26 +86,20 @@ failsafe_led_init(void) } static void -safety_check_button(void *arg) +safety_button_check(void *arg) { - const bool safety_button_pressed = BUTTON_SAFETY; + const bool safety_button_pressed = px4_arch_gpioread(GPIO_BTN_SAFETY); - /* Keep safety button pressed for one second to turn off safety - * - * Note that safety cannot be turned on again by button because a button - * hardware problem could accidentally disable it in flight. + /* Keep safety button pressed for one second to trigger safety button event. + * The logic to prevent turning on safety again is in the commander. */ - if (safety_button_pressed && !(r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_OFF) && - (r_setup_arming & PX4IO_P_SETUP_ARMING_IO_ARM_OK)) { - if (counter <= ARM_COUNTER_THRESHOLD) { - counter++; + if (safety_button_pressed && !(r_status_flags & PX4IO_P_STATUS_FLAGS_SAFETY_BUTTON_EVENT)) { - } + counter++; - if (counter == ARM_COUNTER_THRESHOLD) { - // switch safety off -> ready to arm state - atomic_modify_or(&r_status_flags, PX4IO_P_STATUS_FLAGS_SAFETY_OFF); + if (counter >= SAFETY_SWITCH_THRESHOLD) { + atomic_modify_or(&r_status_flags, PX4IO_P_STATUS_FLAGS_SAFETY_BUTTON_EVENT); } } else {