b058c14 add build step for legacy board to CI 866dd85 Fix README (#133) c2a0853 Hyundai safety: 593 also needs ot be modified 594863c Hyundai: added initial safety files which just fwd bus 0 to 2 and viceversa, except for lkas msgs 905a935 fixed pedal and legacy board builds: no float support 0a480ec moved interpolate function to safety header d7bd473 Merge pull request #131 from appleguru/master c0b1ef2 Example to get wifi password from panda over USB using python library 01c0383 Merge pull request #128 from appleguru/gmlan_gpio f9a46e3 Match safety order from master aafbe05 GMLAN GPIO Rebase 37df290 rename to gmlan_alt git-subtree-dir: panda git-subtree-split: b058c145709a93d56fbe764701962e7d97344ecfpull/330/head
							parent
							
								
									76494ab0be
								
							
						
					
					
						commit
						c812915765
					
				
				 10 changed files with 386 additions and 242 deletions
			
			
		| @ -1,203 +0,0 @@ | ||||
| #define MAX_BITS_CAN_PACKET (200) | ||||
| 
 | ||||
| // returns out_len
 | ||||
| int do_bitstuff(char *out, char *in, int in_len) { | ||||
|   int last_bit = -1; | ||||
|   int bit_cnt = 0; | ||||
|   int j = 0; | ||||
|   for (int i = 0; i < in_len; i++) { | ||||
|     char bit = in[i]; | ||||
|     out[j++] = bit; | ||||
| 
 | ||||
|     // do the stuffing
 | ||||
|     if (bit == last_bit) { | ||||
|       bit_cnt++; | ||||
|       if (bit_cnt == 5) { | ||||
|         // 5 in a row the same, do stuff
 | ||||
|         last_bit = !bit; | ||||
|         out[j++] = last_bit; | ||||
|         bit_cnt = 1; | ||||
|       } | ||||
|     } else { | ||||
|       // this is a new bit
 | ||||
|       last_bit = bit; | ||||
|       bit_cnt = 1; | ||||
|     } | ||||
|   } | ||||
|   return j; | ||||
| } | ||||
| 
 | ||||
| int append_crc(char *in, int in_len) { | ||||
|   int crc = 0; | ||||
|   for (int i = 0; i < in_len; i++) { | ||||
|     crc <<= 1; | ||||
|     if (in[i] ^ ((crc>>15)&1)) { | ||||
|       crc = crc ^ 0x4599; | ||||
|     } | ||||
|     crc &= 0x7fff; | ||||
|   } | ||||
|   for (int i = 14; i >= 0; i--) { | ||||
|     in[in_len++] = (crc>>i)&1; | ||||
|   } | ||||
|   return in_len; | ||||
| } | ||||
| 
 | ||||
| int append_bits(char *in, int in_len, char *app, int app_len) { | ||||
|   for (int i = 0; i < app_len; i++) { | ||||
|     in[in_len++] = app[i]; | ||||
|   } | ||||
|   return in_len; | ||||
| } | ||||
| 
 | ||||
| int append_int(char *in, int in_len, int val, int val_len) { | ||||
|   for (int i = val_len-1; i >= 0; i--) { | ||||
|     in[in_len++] = (val&(1<<i)) != 0; | ||||
|   } | ||||
|   return in_len; | ||||
| } | ||||
| 
 | ||||
| int get_bit_message(char *out, CAN_FIFOMailBox_TypeDef *to_bang) { | ||||
|   char pkt[MAX_BITS_CAN_PACKET]; | ||||
|   char footer[] = { | ||||
|     1,  // CRC delimiter
 | ||||
|     1,  // ACK
 | ||||
|     1,  // ACK delimiter
 | ||||
|     1,1,1,1,1,1,1, // EOF
 | ||||
|     1,1,1, // IFS
 | ||||
|   }; | ||||
| 
 | ||||
|   int len = 0; | ||||
| 
 | ||||
|   // test packet
 | ||||
|   int dlc_len = to_bang->RDTR & 0xF; | ||||
|   len = append_int(pkt, len, 0, 1);    // Start-of-frame
 | ||||
|   
 | ||||
|   if (to_bang->RIR & 4) { | ||||
|     // extended identifier
 | ||||
|     len = append_int(pkt, len, to_bang->RIR >> 21, 11);  // Identifier
 | ||||
|     len = append_int(pkt, len, 3, 2);    // SRR+IDE
 | ||||
|     len = append_int(pkt, len, (to_bang->RIR >> 3) & ((1<<18)-1), 18);  // Identifier
 | ||||
|     len = append_int(pkt, len, 0, 3);    // RTR+r1+r0
 | ||||
|   } else { | ||||
|     // standard identifier
 | ||||
|     len = append_int(pkt, len, to_bang->RIR >> 21, 11);  // Identifier
 | ||||
|     len = append_int(pkt, len, 0, 3);    // RTR+IDE+reserved
 | ||||
|   } | ||||
| 
 | ||||
|   len = append_int(pkt, len, dlc_len, 4);    // Data length code
 | ||||
| 
 | ||||
|   // append data
 | ||||
|   for (int i = 0; i < dlc_len; i++) { | ||||
|     unsigned char dat = ((unsigned char *)(&(to_bang->RDLR)))[i]; | ||||
|     len = append_int(pkt, len, dat, 8); | ||||
|   } | ||||
| 
 | ||||
|   // append crc
 | ||||
|   len = append_crc(pkt, len); | ||||
| 
 | ||||
|   // do bitstuffing
 | ||||
|   len = do_bitstuff(out, pkt, len); | ||||
| 
 | ||||
|   // append footer
 | ||||
|   len = append_bits(out, len, footer, sizeof(footer)); | ||||
|   return len; | ||||
| } | ||||
| 
 | ||||
| // hardware stuff below this line
 | ||||
| 
 | ||||
| #ifdef PANDA | ||||
| 
 | ||||
| void set_bitbanged_gmlan(int val) { | ||||
|   if (val) { | ||||
|     GPIOB->ODR |= (1 << 13); | ||||
|   } else { | ||||
|     GPIOB->ODR &= ~(1 << 13); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| char pkt_stuffed[MAX_BITS_CAN_PACKET]; | ||||
| int gmlan_sending = -1; | ||||
| int gmlan_sendmax = -1; | ||||
| 
 | ||||
| int gmlan_silent_count = 0; | ||||
| int gmlan_fail_count = 0; | ||||
| #define REQUIRED_SILENT_TIME 10 | ||||
| #define MAX_FAIL_COUNT 10 | ||||
| 
 | ||||
| void TIM4_IRQHandler(void) { | ||||
|   if (TIM4->SR & TIM_SR_UIF && gmlan_sendmax != -1) { | ||||
|     int read = get_gpio_input(GPIOB, 12); | ||||
|     if (gmlan_silent_count < REQUIRED_SILENT_TIME) { | ||||
|       if (read == 0) { | ||||
|         gmlan_silent_count = 0; | ||||
|       } else { | ||||
|         gmlan_silent_count++; | ||||
|       } | ||||
|     } else if (gmlan_silent_count == REQUIRED_SILENT_TIME) { | ||||
|       int retry = 0; | ||||
|       // in send loop
 | ||||
|       if (gmlan_sending > 0 &&  // not first bit
 | ||||
|          (read == 0 && pkt_stuffed[gmlan_sending-1] == 1) &&  // bus wrongly dominant
 | ||||
|          gmlan_sending != (gmlan_sendmax-11)) {    //not ack bit
 | ||||
|         puts("GMLAN ERR: bus driven at "); | ||||
|         puth(gmlan_sending); | ||||
|         puts("\n"); | ||||
|         retry = 1; | ||||
|       } else if (read == 1 && gmlan_sending == (gmlan_sendmax-11)) {    // recessive during ACK
 | ||||
|         puts("GMLAN ERR: didn't recv ACK\n"); | ||||
|         retry = 1; | ||||
|       } | ||||
|       if (retry) { | ||||
|         // reset sender (retry after 7 silent)
 | ||||
|         set_bitbanged_gmlan(1); // recessive
 | ||||
|         gmlan_silent_count = 0; | ||||
|         gmlan_sending = 0; | ||||
|         gmlan_fail_count++; | ||||
|         if (gmlan_fail_count == MAX_FAIL_COUNT) { | ||||
|           puts("GMLAN ERR: giving up send\n"); | ||||
|         } | ||||
|       } else { | ||||
|         set_bitbanged_gmlan(pkt_stuffed[gmlan_sending]); | ||||
|         gmlan_sending++; | ||||
|       } | ||||
|     } | ||||
|     if (gmlan_sending == gmlan_sendmax || gmlan_fail_count == MAX_FAIL_COUNT) { | ||||
|       set_bitbanged_gmlan(1); // recessive
 | ||||
|       set_gpio_mode(GPIOB, 13, MODE_INPUT); | ||||
|       TIM4->DIER = 0;  // no update interrupt
 | ||||
|       TIM4->CR1 = 0;   // disable timer
 | ||||
|       gmlan_sendmax = -1;   // exit
 | ||||
|     } | ||||
|   } | ||||
|   TIM4->SR = 0; | ||||
| } | ||||
| 
 | ||||
| void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { | ||||
|   // TODO: make failure less silent
 | ||||
|   if (gmlan_sendmax != -1) return; | ||||
| 
 | ||||
|   int len = get_bit_message(pkt_stuffed, to_bang); | ||||
|   gmlan_fail_count = 0; | ||||
|   gmlan_silent_count = 0; | ||||
|   gmlan_sending = 0; | ||||
|   gmlan_sendmax = len; | ||||
| 
 | ||||
|   // setup for bitbang loop
 | ||||
|   set_bitbanged_gmlan(1); // recessive
 | ||||
|   set_gpio_mode(GPIOB, 13, MODE_OUTPUT); | ||||
| 
 | ||||
|   // setup
 | ||||
|   TIM4->PSC = 48-1;          // tick on 1 us
 | ||||
|   TIM4->CR1 = TIM_CR1_CEN;   // enable
 | ||||
|   TIM4->ARR = 30-1;          // 33.3 kbps
 | ||||
| 
 | ||||
|   // in case it's disabled
 | ||||
|   NVIC_EnableIRQ(TIM4_IRQn); | ||||
| 
 | ||||
|   // run the interrupt
 | ||||
|   TIM4->DIER = TIM_DIER_UIE; // update interrupt
 | ||||
|   TIM4->SR = 0; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| @ -0,0 +1,276 @@ | ||||
| #define GMLAN_TICKS_PER_SECOND 33300 //1sec @ 33.3kbps
 | ||||
| #define GMLAN_TICKS_PER_TIMEOUT_TICKLE 500 //15ms @ 33.3kbps
 | ||||
| #define GMLAN_HIGH 0 //0 is high on bus (dominant)
 | ||||
| #define GMLAN_LOW 1 //1 is low on bus
 | ||||
| 
 | ||||
| #define DISABLED -1 | ||||
| #define BITBANG 0 | ||||
| #define GPIO_SWITCH 1 | ||||
| 
 | ||||
| #define MAX_BITS_CAN_PACKET (200) | ||||
| 
 | ||||
| int gmlan_alt_mode = DISABLED; 
 | ||||
| 
 | ||||
| // returns out_len
 | ||||
| int do_bitstuff(char *out, char *in, int in_len) { | ||||
|   int last_bit = -1; | ||||
|   int bit_cnt = 0; | ||||
|   int j = 0; | ||||
|   for (int i = 0; i < in_len; i++) { | ||||
|     char bit = in[i]; | ||||
|     out[j++] = bit; | ||||
| 
 | ||||
|     // do the stuffing
 | ||||
|     if (bit == last_bit) { | ||||
|       bit_cnt++; | ||||
|       if (bit_cnt == 5) { | ||||
|         // 5 in a row the same, do stuff
 | ||||
|         last_bit = !bit; | ||||
|         out[j++] = last_bit; | ||||
|         bit_cnt = 1; | ||||
|       } | ||||
|     } else { | ||||
|       // this is a new bit
 | ||||
|       last_bit = bit; | ||||
|       bit_cnt = 1; | ||||
|     } | ||||
|   } | ||||
|   return j; | ||||
| } | ||||
| 
 | ||||
| int append_crc(char *in, int in_len) { | ||||
|   int crc = 0; | ||||
|   for (int i = 0; i < in_len; i++) { | ||||
|     crc <<= 1; | ||||
|     if (in[i] ^ ((crc>>15)&1)) { | ||||
|       crc = crc ^ 0x4599; | ||||
|     } | ||||
|     crc &= 0x7fff; | ||||
|   } | ||||
|   for (int i = 14; i >= 0; i--) { | ||||
|     in[in_len++] = (crc>>i)&1; | ||||
|   } | ||||
|   return in_len; | ||||
| } | ||||
| 
 | ||||
| int append_bits(char *in, int in_len, char *app, int app_len) { | ||||
|   for (int i = 0; i < app_len; i++) { | ||||
|     in[in_len++] = app[i]; | ||||
|   } | ||||
|   return in_len; | ||||
| } | ||||
| 
 | ||||
| int append_int(char *in, int in_len, int val, int val_len) { | ||||
|   for (int i = val_len-1; i >= 0; i--) { | ||||
|     in[in_len++] = (val&(1<<i)) != 0; | ||||
|   } | ||||
|   return in_len; | ||||
| } | ||||
| 
 | ||||
| int get_bit_message(char *out, CAN_FIFOMailBox_TypeDef *to_bang) { | ||||
|   char pkt[MAX_BITS_CAN_PACKET]; | ||||
|   char footer[] = { | ||||
|     1,  // CRC delimiter
 | ||||
|     1,  // ACK
 | ||||
|     1,  // ACK delimiter
 | ||||
|     1,1,1,1,1,1,1, // EOF
 | ||||
|     1,1,1, // IFS
 | ||||
|   }; | ||||
| 
 | ||||
|   int len = 0; | ||||
| 
 | ||||
|   // test packet
 | ||||
|   int dlc_len = to_bang->RDTR & 0xF; | ||||
|   len = append_int(pkt, len, 0, 1);    // Start-of-frame
 | ||||
|   
 | ||||
|   if (to_bang->RIR & 4) { | ||||
|     // extended identifier
 | ||||
|     len = append_int(pkt, len, to_bang->RIR >> 21, 11);  // Identifier
 | ||||
|     len = append_int(pkt, len, 3, 2);    // SRR+IDE
 | ||||
|     len = append_int(pkt, len, (to_bang->RIR >> 3) & ((1<<18)-1), 18);  // Identifier
 | ||||
|     len = append_int(pkt, len, 0, 3);    // RTR+r1+r0
 | ||||
|   } else { | ||||
|     // standard identifier
 | ||||
|     len = append_int(pkt, len, to_bang->RIR >> 21, 11);  // Identifier
 | ||||
|     len = append_int(pkt, len, 0, 3);    // RTR+IDE+reserved
 | ||||
|   } | ||||
| 
 | ||||
|   len = append_int(pkt, len, dlc_len, 4);    // Data length code
 | ||||
| 
 | ||||
|   // append data
 | ||||
|   for (int i = 0; i < dlc_len; i++) { | ||||
|     unsigned char dat = ((unsigned char *)(&(to_bang->RDLR)))[i]; | ||||
|     len = append_int(pkt, len, dat, 8); | ||||
|   } | ||||
| 
 | ||||
|   // append crc
 | ||||
|   len = append_crc(pkt, len); | ||||
| 
 | ||||
|   // do bitstuffing
 | ||||
|   len = do_bitstuff(out, pkt, len); | ||||
| 
 | ||||
|   // append footer
 | ||||
|   len = append_bits(out, len, footer, sizeof(footer)); | ||||
|   return len; | ||||
| } | ||||
| 
 | ||||
| #ifdef PANDA | ||||
| 
 | ||||
| void setup_timer4() { | ||||
|   // setup
 | ||||
|   TIM4->PSC = 48-1;          // tick on 1 us
 | ||||
|   TIM4->CR1 = TIM_CR1_CEN;   // enable
 | ||||
|   TIM4->ARR = 30-1;          // 33.3 kbps
 | ||||
| 
 | ||||
|   // in case it's disabled
 | ||||
|   NVIC_EnableIRQ(TIM4_IRQn); | ||||
| 
 | ||||
|   // run the interrupt
 | ||||
|   TIM4->DIER = TIM_DIER_UIE; // update interrupt
 | ||||
|   TIM4->SR = 0; | ||||
| } | ||||
| 
 | ||||
| int gmlan_timeout_counter = GMLAN_TICKS_PER_TIMEOUT_TICKLE; //GMLAN transceiver times out every 17ms held high; tickle every 15ms
 | ||||
| int can_timeout_counter = GMLAN_TICKS_PER_SECOND; //1 second
 | ||||
| 
 | ||||
| int inverted_bit_to_send = GMLAN_HIGH; 
 | ||||
| int gmlan_switch_below_timeout = -1; | ||||
| int gmlan_switch_timeout_enable = 0; | ||||
| 
 | ||||
| void gmlan_switch_init(int timeout_enable) { | ||||
|   gmlan_switch_timeout_enable = timeout_enable; | ||||
|   gmlan_alt_mode = GPIO_SWITCH; | ||||
|   gmlan_switch_below_timeout = 1; | ||||
|   set_gpio_mode(GPIOB, 13, MODE_OUTPUT); | ||||
|   
 | ||||
|   setup_timer4(); | ||||
|   
 | ||||
|   inverted_bit_to_send = GMLAN_LOW; //We got initialized, set the output low
 | ||||
| } | ||||
| 
 | ||||
| void set_gmlan_digital_output(int to_set) { | ||||
|   inverted_bit_to_send = to_set; | ||||
|   /*
 | ||||
|   puts("Writing "); | ||||
|   puth(inverted_bit_to_send); | ||||
|   puts("\n"); | ||||
|   */ | ||||
| } | ||||
| 
 | ||||
| void reset_gmlan_switch_timeout(void) { | ||||
|   can_timeout_counter = GMLAN_TICKS_PER_SECOND; | ||||
|   gmlan_switch_below_timeout = 1; | ||||
|   gmlan_alt_mode = GPIO_SWITCH; | ||||
| } | ||||
| 
 | ||||
| void set_bitbanged_gmlan(int val) { | ||||
|   if (val) { | ||||
|     GPIOB->ODR |= (1 << 13); | ||||
|   } else { | ||||
|     GPIOB->ODR &= ~(1 << 13); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| char pkt_stuffed[MAX_BITS_CAN_PACKET]; | ||||
| int gmlan_sending = -1; | ||||
| int gmlan_sendmax = -1; | ||||
| 
 | ||||
| int gmlan_silent_count = 0; | ||||
| int gmlan_fail_count = 0; | ||||
| #define REQUIRED_SILENT_TIME 10 | ||||
| #define MAX_FAIL_COUNT 10 | ||||
| 
 | ||||
| void TIM4_IRQHandler(void) { | ||||
|   if (gmlan_alt_mode == BITBANG) { | ||||
|     if (TIM4->SR & TIM_SR_UIF && gmlan_sendmax != -1) { | ||||
|       int read = get_gpio_input(GPIOB, 12); | ||||
|       if (gmlan_silent_count < REQUIRED_SILENT_TIME) { | ||||
|         if (read == 0) { | ||||
|           gmlan_silent_count = 0; | ||||
|         } else { | ||||
|           gmlan_silent_count++; | ||||
|         } | ||||
|       } else if (gmlan_silent_count == REQUIRED_SILENT_TIME) { | ||||
|         int retry = 0; | ||||
|         // in send loop
 | ||||
|         if (gmlan_sending > 0 &&  // not first bit
 | ||||
|            (read == 0 && pkt_stuffed[gmlan_sending-1] == 1) &&  // bus wrongly dominant
 | ||||
|            gmlan_sending != (gmlan_sendmax-11)) {    //not ack bit
 | ||||
|           puts("GMLAN ERR: bus driven at "); | ||||
|           puth(gmlan_sending); | ||||
|           puts("\n"); | ||||
|           retry = 1; | ||||
|         } else if (read == 1 && gmlan_sending == (gmlan_sendmax-11)) {    // recessive during ACK
 | ||||
|           puts("GMLAN ERR: didn't recv ACK\n"); | ||||
|           retry = 1; | ||||
|         } | ||||
|         if (retry) { | ||||
|           // reset sender (retry after 7 silent)
 | ||||
|           set_bitbanged_gmlan(1); // recessive
 | ||||
|           gmlan_silent_count = 0; | ||||
|           gmlan_sending = 0; | ||||
|           gmlan_fail_count++; | ||||
|           if (gmlan_fail_count == MAX_FAIL_COUNT) { | ||||
|             puts("GMLAN ERR: giving up send\n"); | ||||
|           } | ||||
|         } else { | ||||
|           set_bitbanged_gmlan(pkt_stuffed[gmlan_sending]); | ||||
|           gmlan_sending++; | ||||
|         } | ||||
|       } | ||||
|       if (gmlan_sending == gmlan_sendmax || gmlan_fail_count == MAX_FAIL_COUNT) { | ||||
|         set_bitbanged_gmlan(1); // recessive
 | ||||
|         set_gpio_mode(GPIOB, 13, MODE_INPUT); | ||||
|         TIM4->DIER = 0;  // no update interrupt
 | ||||
|         TIM4->CR1 = 0;   // disable timer
 | ||||
|         gmlan_sendmax = -1;   // exit
 | ||||
|       } | ||||
|     } | ||||
|     TIM4->SR = 0; | ||||
|   } //bit bang mode
 | ||||
| 
 | ||||
|   else if (gmlan_alt_mode == GPIO_SWITCH) { | ||||
|     if (TIM4->SR & TIM_SR_UIF && gmlan_switch_below_timeout != -1) { | ||||
|       if (can_timeout_counter == 0 && gmlan_switch_timeout_enable) { | ||||
|         //it has been more than 1 second since timeout was reset; disable timer and restore the GMLAN output
 | ||||
|         set_gpio_output(GPIOB, 13, GMLAN_LOW); | ||||
|         gmlan_switch_below_timeout = -1; | ||||
|         gmlan_timeout_counter = GMLAN_TICKS_PER_TIMEOUT_TICKLE; | ||||
|         gmlan_alt_mode = DISABLED; | ||||
|       } | ||||
|       else { | ||||
|         can_timeout_counter--; | ||||
|         if (gmlan_timeout_counter == 0) { | ||||
|           //Send a 1 (bus low) every 15ms to reset the GMLAN transceivers timeout
 | ||||
|           gmlan_timeout_counter = GMLAN_TICKS_PER_TIMEOUT_TICKLE; | ||||
|           set_gpio_output(GPIOB, 13, GMLAN_LOW); | ||||
|         } | ||||
|         else { | ||||
|           set_gpio_output(GPIOB, 13, inverted_bit_to_send); | ||||
|           gmlan_timeout_counter--; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     TIM4->SR = 0; | ||||
|   } //gmlan switch mode
 | ||||
| } | ||||
| 
 | ||||
| void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) { | ||||
|   gmlan_alt_mode = BITBANG; | ||||
|   // TODO: make failure less silent
 | ||||
|   if (gmlan_sendmax != -1) return; | ||||
| 
 | ||||
|   int len = get_bit_message(pkt_stuffed, to_bang); | ||||
|   gmlan_fail_count = 0; | ||||
|   gmlan_silent_count = 0; | ||||
|   gmlan_sending = 0; | ||||
|   gmlan_sendmax = len; | ||||
| 
 | ||||
|   // setup for bitbang loop
 | ||||
|   set_bitbanged_gmlan(1); // recessive
 | ||||
|   set_gpio_mode(GPIOB, 13, MODE_OUTPUT); | ||||
| 
 | ||||
|   setup_timer4(); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,36 @@ | ||||
| int hyundai_giraffe_switch_1 = 0;          // is giraffe switch 1 high?
 | ||||
| 
 | ||||
| 
 | ||||
| static void hyundai_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) { | ||||
| 
 | ||||
|   int bus = (to_push->RDTR >> 4) & 0xF; | ||||
|   // 832 is lkas cmd. If it is on bus 0, then giraffe switch 1 is high and we want stock
 | ||||
|   if ((to_push->RIR>>21) == 832 && (bus == 0)) { | ||||
|     hyundai_giraffe_switch_1 = 1; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| static void hyundai_init(int16_t param) { | ||||
|   controls_allowed = 0; | ||||
|   hyundai_giraffe_switch_1 = 0; | ||||
| } | ||||
| 
 | ||||
| static int hyundai_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) { | ||||
| 
 | ||||
|   // forward camera to car and viceversa, excpet for lkas11 and mdps12
 | ||||
|   if ((bus_num == 0 || bus_num == 2) && !hyundai_giraffe_switch_1) { | ||||
|     int addr = to_fwd->RIR>>21; | ||||
|     bool is_lkas_msg = (addr == 832 && bus_num == 2) || (addr == 593 && bus_num == 0); | ||||
|     return is_lkas_msg? -1 : (uint8_t)(~bus_num & 0x2); | ||||
|   } | ||||
|   return -1; | ||||
| } | ||||
| 
 | ||||
| const safety_hooks hyundai_hooks = { | ||||
|   .init = hyundai_init, | ||||
|   .rx = hyundai_rx_hook, | ||||
|   .tx = nooutput_tx_hook, | ||||
|   .tx_lin = nooutput_tx_lin_hook, | ||||
|   .ignition = default_ign_hook, | ||||
|   .fwd = hyundai_fwd_hook, | ||||
| }; | ||||
| @ -0,0 +1,20 @@ | ||||
| #!/usr/bin/env python | ||||
| from panda import Panda | ||||
| 
 | ||||
| def get_panda_password(): | ||||
|    | ||||
|   try: | ||||
|     print("Trying to connect to Panda over USB...") | ||||
|     p = Panda() | ||||
|      | ||||
|   except AssertionError: | ||||
|     print("USB connection failed") | ||||
|     sys.exit(0) | ||||
| 
 | ||||
|   wifi = p.get_serial() | ||||
|   #print('[%s]' % ', '.join(map(str, wifi))) | ||||
|   print("SSID: " + wifi[0]) | ||||
|   print("Password: " + wifi[1]) | ||||
|    | ||||
| if __name__ == "__main__": | ||||
|   get_panda_password() | ||||
					Loading…
					
					
				
		Reference in new issue