ef880b7 Merge pull request #116 from commaai/buy_panda 9311f0d update readme graphics 4150684 add javascript and bump pandacan version ace4a22 Ford safety (#115) git-subtree-dir: panda git-subtree-split: ef880b76356a992509d809d3369b5954636969f3pull/252/head
							parent
							
								
									bb2587664a
								
							
						
					
					
						commit
						dcacbf606a
					
				
				 6 changed files with 124 additions and 5 deletions
			
			
		| @ -0,0 +1,110 @@ | ||||
| // board enforces
 | ||||
| //   in-state
 | ||||
| //      accel set/resume
 | ||||
| //   out-state
 | ||||
| //      cancel button
 | ||||
| //      accel rising edge
 | ||||
| //      brake rising edge
 | ||||
| //      brake > 0mph
 | ||||
| 
 | ||||
| int ford_brake_prev = 0; | ||||
| int ford_gas_prev = 0; | ||||
| int ford_is_moving = 0; | ||||
| 
 | ||||
| static void ford_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) { | ||||
| 
 | ||||
|   if ((to_push->RIR>>21) == 0x217) { | ||||
|     // wheel speeds are 14 bits every 16
 | ||||
|     ford_is_moving = 0xFCFF & (to_push->RDLR | (to_push->RDLR >> 16) | | ||||
|                                to_push->RDHR | (to_push->RDHR >> 16)); | ||||
|   } | ||||
| 
 | ||||
|   // state machine to enter and exit controls
 | ||||
|   if ((to_push->RIR>>21) == 0x83) { | ||||
|     int cancel = ((to_push->RDLR >> 8) & 0x1); | ||||
|     int set_or_resume = (to_push->RDLR >> 28) & 0x3; | ||||
|     if (cancel) { | ||||
|       controls_allowed = 0; | ||||
|     } else if (set_or_resume) { | ||||
|       controls_allowed = 1; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // exit controls on rising edge of brake press or on brake press when
 | ||||
|   // speed > 0
 | ||||
|   if ((to_push->RIR>>21) == 0x165) { | ||||
|     int brake = to_push->RDLR & 0x20; | ||||
|     if (brake && (!(ford_brake_prev) || ford_is_moving)) { | ||||
|       controls_allowed = 0; | ||||
|     } | ||||
|     ford_brake_prev = brake; | ||||
|   } | ||||
| 
 | ||||
|   // exit controls on rising edge of gas press
 | ||||
|   if ((to_push->RIR>>21) == 0x204) { | ||||
|     int gas = to_push->RDLR & 0xFF03; | ||||
|     if (gas && !(ford_gas_prev)) { | ||||
|       controls_allowed = 0; | ||||
|     } | ||||
|     ford_gas_prev = gas; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // all commands: just steering
 | ||||
| // if controls_allowed and no pedals pressed
 | ||||
| //     allow all commands up to limit
 | ||||
| // else
 | ||||
| //     block all commands that produce actuation
 | ||||
| 
 | ||||
| static int ford_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) { | ||||
| 
 | ||||
|   // disallow actuator commands if gas or brake (with vehicle moving) are pressed
 | ||||
|   // and the the latching controls_allowed flag is True
 | ||||
|   int pedal_pressed = ford_gas_prev || (ford_brake_prev && ford_is_moving); | ||||
|   int current_controls_allowed = controls_allowed && !(pedal_pressed); | ||||
| 
 | ||||
|   // STEER: safety check
 | ||||
|   if ((to_send->RIR>>21) == 0x3CA) { | ||||
|     if (current_controls_allowed) { | ||||
|       // all messages are fine here
 | ||||
|     } else { | ||||
|       // bits 7-4 need to be 0xF to disallow lkas commands
 | ||||
|       if (((to_send->RDLR >> 4) & 0xF) != 0xF) return 0; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // FORCE CANCEL: safety check only relevant when spamming the cancel button
 | ||||
|   // ensuring that set and resume aren't sent
 | ||||
|   if ((to_send->RIR>>21) == 0x83) { | ||||
|     if ((to_send->RDLR >> 28) & 0x3) return 0; | ||||
|   } | ||||
| 
 | ||||
|   // 1 allows the message through
 | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| static int ford_tx_lin_hook(int lin_num, uint8_t *data, int len) { | ||||
|   // TODO: add safety if using LIN
 | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| static void ford_init(int16_t param) { | ||||
|   controls_allowed = 0; | ||||
| } | ||||
| 
 | ||||
| static int ford_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) { | ||||
|   return -1; | ||||
| } | ||||
| 
 | ||||
| static int ford_ign_hook() { | ||||
|   return -1; | ||||
| } | ||||
| 
 | ||||
| const safety_hooks ford_hooks = { | ||||
|   .init = ford_init, | ||||
|   .rx = ford_rx_hook, | ||||
|   .tx = ford_tx_hook, | ||||
|   .tx_lin = ford_tx_lin_hook, | ||||
|   .ignition = ford_ign_hook, | ||||
|   .fwd = ford_fwd_hook, | ||||
| }; | ||||
| Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB | 
					Loading…
					
					
				
		Reference in new issue