void sns_irTransmit_HandleMessage(StdCan_Msg_t *rxMsg) { if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_IRTRANSMIT && rxMsg->Header.ModuleId == sns_irTransmit_ID) { switch (rxMsg->Header.Command) { case CAN_MODULE_CMD_PHYSICAL_IR: if (sns_irTransmit_state == sns_irTransmit_STATE_IDLE && rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED) { sns_irTransmit_proto.protocol = rxMsg->Data[1]; sns_irTransmit_proto.data = rxMsg->Data[2]; sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8; sns_irTransmit_proto.data |= rxMsg->Data[3]; sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8; sns_irTransmit_proto.data |= rxMsg->Data[4]; sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8; sns_irTransmit_proto.data |= rxMsg->Data[5]; sns_irTransmit_state = sns_irTransmit_STATE_START_TRANSMIT; } else if (sns_irTransmit_state != sns_irTransmit_STATE_IDLE && rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_RELEASED) { sns_irTransmit_stop = 1; } break; } } }
void sns_BusVoltage_HandleMessage(StdCan_Msg_t *rxMsg) { if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_BUSVOLTAGE && rxMsg->Header.ModuleId == sns_BusVoltage_ID) { switch (rxMsg->Header.Command) { case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL: if (rxMsg->Length > 0) { sns_BusVoltage_ReportInterval = rxMsg->Data[0]; Timer_SetTimeout(sns_BusVoltage_TIMER, sns_BusVoltage_ReportInterval*1000 , TimerTypeFreeRunning, 0); } StdCan_Msg_t txMsg; StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_BUSVOLTAGE; txMsg.Header.ModuleId = sns_BusVoltage_ID; txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL; txMsg.Length = 1; txMsg.Data[0] = sns_BusVoltage_ReportInterval; StdCan_Put(&txMsg); break; } } }
void chn_ChnMaster_HandleMessage(StdCan_Msg_t *rxMsg) { uint8_t i,j; uint16_t channel_id; uint16_t value; if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_CHN) { if( (rxMsg->Id & (1L<<24)) == 0 ) { /* Value */ channel_id = (rxMsg->Id >> 8) & 0xFFFF; for( j=0; j<(rxMsg->Length&~1); j+=2 ) { value = (rxMsg->Data[j]<<8) | rxMsg->Data[j+1]; for( i=0; i<chn_ChnMaster_listenCount; i++ ) { if( chn_ChnMaster_listeners[i].channel_id == channel_id ) { (*chn_ChnMaster_listeners[i].update_func)( channel_id, value ); } } channel_id++; } } else { /* Metadata */ } } }
void act_protectedOutput_HandleMessage(StdCan_Msg_t *rxMsg) { if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT && StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_PROTECTEDOUTPUT && rxMsg->Header.ModuleId == act_protectedOutput_ID) { switch (rxMsg->Header.Command) { case CAN_MODULE_CMD_PHYSICAL_SETPIN: /* * This message is used to activate/deactivate * an output channel. */ if (rxMsg->Length == 2) { uint8_t channel = rxMsg->Data[0]; if (channel >= 0 && channel < act_protectedOutput_CH_COUNT) { chTargetState[channel] = rxMsg->Data[1]; readDiagPin(); #if act_protectedOutput_FORCED_RETRIES == 1 updateOutput(1); #else updateOutput(0); #endif #if act_protectedOutput_EEPROM_ENABLED == 1 // output states changed, store to EE after this timer delay Timer_SetTimeout(act_protectedOutput_STORE_VALUE_TIMEOUT, act_protectedOutput_STORE_VALUE_TIMEOUT_TIME_S*1000, TimerTypeOneShot, 0); #endif } StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); rxMsg->Length = 2; while (StdCan_Put(rxMsg) != StdCan_Ret_OK); } break; } } }
void act_linearAct_HandleMessage(StdCan_Msg_t *rxMsg) { uint16_t i; if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT && StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_LINEARACT && rxMsg->Header.ModuleId == act_linearAct_ID) { switch (rxMsg->Header.Command) { case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL: act_linearAct_ReportInterval = rxMsg->Data[0]; Timer_SetTimeout(act_linearAct_TIMER_report, act_linearAct_ReportInterval*1000 , TimerTypeFreeRunning, 0); break; case CAN_MODULE_CMD_LINEARACT_POSITION: if (rxMsg->Length >= 3) { // remain forward compatible by allowing longer messages, but not shorter if (rxMsg->Data[2] != 0) { Timer_SetTimeout(act_linearAct_TIMER_report, 750 , TimerTypeFreeRunning, 0); linearAct_setPosition(((uint16_t)rxMsg->Data[0] << 8) + rxMsg->Data[1]); } else { // Data[2] signals moving speed, where zero stands for stop and also triggers transmission of limits linearAct_stop(); // wait until complete stop (with timeout) i = 0; do { if (direction == 0) break; _delay_ms(10); i++; } while (i < 200); linearAct_sendPosition(0); linearAct_sendLimits(0); } } break; case CAN_MODULE_CMD_LINEARACT_LIMITS: if (rxMsg->Length == 8) { min = (rxMsg->Data[0] << 8) + rxMsg->Data[1]; low = (rxMsg->Data[2] << 8) + rxMsg->Data[3]; high = (rxMsg->Data[4] << 8) + rxMsg->Data[5]; max = (rxMsg->Data[6] << 8) + rxMsg->Data[7]; // pulses are already saved. eeprom_write_word_crc(EEDATA16.pulses_ee, 1200, WITHOUT_CRC); eeprom_write_word_crc(EEDATA16.min_ee, min, WITHOUT_CRC); eeprom_write_word_crc(EEDATA16.low_ee, low, WITHOUT_CRC); eeprom_write_word_crc(EEDATA16.high_ee, high, WITHOUT_CRC); eeprom_write_word_crc(EEDATA16.max_ee, max, WITHOUT_CRC); EEDATA_UPDATE_CRC; } break; case CAN_MODULE_CMD_LINEARACT_CALIBRATION: // set limits to absolute maximum to allow full movement min = 0; low = 0; high = 0xFFFF; max = 0xFFFF; if (rxMsg->Length >= 2) { // optional: set start position. Note! This will definitly ruin the old calibration. pulses = (rxMsg->Data[0] << 8) + rxMsg->Data[1]; } break; default: break; } } }
void sns_counter_HandleMessage(StdCan_Msg_t *rxMsg) { if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_COUNTER && rxMsg->Header.ModuleId == sns_counter_ID) { StdCan_Msg_t txMsg; StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_COUNTER; txMsg.Header.ModuleId = sns_counter_ID; switch (rxMsg->Header.Command) { case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL: if (rxMsg->Length > 0) { sns_counter_ReportInterval = rxMsg->Data[0]; Timer_SetTimeout(sns_counter_SEND_TIMER, sns_counter_ReportInterval*1000 , TimerTypeFreeRunning, 0); } txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL; txMsg.Length = 1; txMsg.Data[0] = sns_counter_ReportInterval; StdCan_Put(&txMsg); break; case CAN_MODULE_CMD_COUNTER_SETCOUNTER: if (rxMsg->Length != 5) break; if ( #ifdef sns_counter_CH0 (rxMsg->Data[0] != 0) && #endif #ifdef sns_counter_CH1 (rxMsg->Data[0] != 1) && #endif #ifdef sns_counter_CH2 (rxMsg->Data[0] != 2) && #endif #ifdef sns_counter_CH3 (rxMsg->Data[0] != 3) && #endif #ifdef sns_counter_CH4 (rxMsg->Data[0] != 4) && #endif #ifdef sns_counter_CH5 (rxMsg->Data[0] != 5) && #endif #ifdef sns_counter_CH6 (rxMsg->Data[0] != 6) && #endif #ifdef sns_counter_CH7 (rxMsg->Data[0] != 7) && #endif 1) break; Count[rxMsg->Data[0]] = rxMsg->Data[4]; Count[rxMsg->Data[0]] += ((uint32_t)rxMsg->Data[3])<<8; Count[rxMsg->Data[0]] += ((uint32_t)rxMsg->Data[2])<<16; Count[rxMsg->Data[0]] += ((uint32_t)rxMsg->Data[1])<<24; txMsg.Header.Command = CAN_MODULE_CMD_COUNTER_SETCOUNTER; txMsg.Length = 5; txMsg.Data[0] = rxMsg->Data[0]; // CH txMsg.Data[4] = (uint8_t)Count[rxMsg->Data[0]] & 0xff; txMsg.Data[3] = (uint8_t)(Count[rxMsg->Data[0]] >> 8) & 0xff; txMsg.Data[2] = (uint8_t)(Count[rxMsg->Data[0]] >> 16) & 0xff; txMsg.Data[1] = (uint8_t)(Count[rxMsg->Data[0]] >> 24) & 0xff; StdCan_Put(&txMsg); break; } }
void act_hd44780_Process(void) { #if act_hd44780_USE_AUTO_BL == 1 if (autoMode == CAN_MODULE_ENUM_HD44789_LCD_BACKLIGHT_AUTOLIGHT_ON) { #if (act_hd44780_TYPE==0) if ( OCR0A == 0) { #else if ( OCR0B == 0) { #endif } else { uint16_t Voltage = (0x3ff & ADC_Get(act_hd44780_LIGHTSENSOR_AD)); #if (act_hd44780_TYPE==0) OCR0A = Voltage/4; if (OCR0A == 0) { OCR0A = 1; } #else OCR0B = Voltage/4; if (OCR0B == 0) { OCR0B = 1; } #endif } } #endif #if (act_hd44780_TYPE==0) if (OCR0A==0 && (TCCR0A & ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00))) == ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00))) { TCCR0A &= ~((1<<COM0A1)|(1<<WGM01)|(1<<WGM00)); } if (OCR0A!=0 && (TCCR0A & ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00))) != ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00))) { TCCR0A |= (1<<COM0A1)|(1<<WGM01)|(1<<WGM00); } #endif } void act_hd44780_HandleMessage(StdCan_Msg_t *rxMsg) { StdCan_Msg_t txMsg; uint8_t n = 0; if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT && StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_HD44789 && rxMsg->Header.ModuleId == act_hd44780_ID) { switch (rxMsg->Header.Command) { case CAN_MODULE_CMD_HD44789_LCD_CLEAR: lcd_clrscr(); break; case CAN_MODULE_CMD_HD44789_LCD_CURSOR: lcd_gotoxy(rxMsg->Data[0], rxMsg->Data[1]); break; case CAN_MODULE_CMD_HD44789_LCD_TEXTAT: lcd_gotoxy(rxMsg->Data[0], rxMsg->Data[1]); for (n = 2; n < rxMsg->Length; n++) { lcd_putc((char)rxMsg->Data[n]); } break; /* case CAN_MODULE_CMD_HD44789_LCD_CLEARROW: lcd_gotoxy(0, rxMsg->Data[0]); for (n = 0; n < act_hd44780_WIDTH; n++) { lcd_putc(' '); } break; */ case CAN_MODULE_CMD_HD44789_LCD_TEXT: for (n = 0; n < rxMsg->Length; n++) { lcd_putc((char)rxMsg->Data[n]); } break; case CAN_MODULE_CMD_HD44789_LCD_SIZE: StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_HD44789; txMsg.Header.ModuleId = act_hd44780_ID; txMsg.Header.Command = CAN_MODULE_CMD_HD44789_LCD_SIZE; txMsg.Length = 2; txMsg.Data[0] = act_hd44780_WIDTH; txMsg.Data[1] = act_hd44780_HEIGHT; while (StdCan_Put(&txMsg) != StdCan_Ret_OK); break; case CAN_MODULE_CMD_HD44789_LCD_BACKLIGHT: if (rxMsg->Length > 0) { #if (act_hd44780_TYPE==0) OCR0A = rxMsg->Data[0]; #else OCR0B = rxMsg->Data[0]; #endif #if act_hd44780_USE_AUTO_BL == 1 if (rxMsg->Length == 2) { autoMode = rxMsg->Data[0]; } #endif } StdCan_Msg_t txMsg; StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_HD44789; txMsg.Header.ModuleId = act_hd44780_ID; txMsg.Header.Command = CAN_MODULE_CMD_HD44789_LCD_BACKLIGHT; txMsg.Length = 1; #if (act_hd44780_TYPE==0) txMsg.Data[0] = OCR0A; #else txMsg.Data[0] = OCR0B; #endif #if act_hd44780_USE_AUTO_BL == 1 txMsg.Data[1] = autoMode; txMsg.Length = 2; #endif while (StdCan_Put(&txMsg) != StdCan_Ret_OK); break; } } }
void act_output_HandleMessage(StdCan_Msg_t *rxMsg) { if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT && StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_OUTPUT && rxMsg->Header.ModuleId == act_output_ID) { uint8_t index = 0; uint8_t value = 0; switch (rxMsg->Header.Command) { case CAN_MODULE_CMD_PHYSICAL_SETPIN: index = 0; if (rxMsg->Length == 2) { #ifdef act_output_CH0 if (rxMsg->Data[0] == 0) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH0PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH0); #else Pca95xx_set_statement(chnValue[index],act_output_CH0); #endif } index++; #endif #ifdef act_output_CH1 if (rxMsg->Data[0] == 1) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH1PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH1); #else Pca95xx_set_statement(chnValue[index],act_output_CH1); #endif } index++; #endif #ifdef act_output_CH2 if (rxMsg->Data[0] == 2) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH2PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH2); #else Pca95xx_set_statement(chnValue[index],act_output_CH2); #endif } index++; #endif #ifdef act_output_CH3 if (rxMsg->Data[0] == 3) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH3PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH3); #else Pca95xx_set_statement(chnValue[index],act_output_CH3); #endif } index++; #endif #ifdef act_output_CH4 if (rxMsg->Data[0] == 4) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH4PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH4); #else Pca95xx_set_statement(chnValue[index],act_output_CH4); #endif } index++; #endif #ifdef act_output_CH5 if (rxMsg->Data[0] == 5) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH5PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH5); #else Pca95xx_set_statement(chnValue[index],act_output_CH5); #endif } index++; #endif #ifdef act_output_CH6 if (rxMsg->Data[0] == 6) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH6PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH6); #else Pca95xx_set_statement(chnValue[index],act_output_CH6); #endif } index++; #endif #ifdef act_output_CH7 if (rxMsg->Data[0] == 7) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH7PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH7); #else Pca95xx_set_statement(chnValue[index],act_output_CH7); #endif } index++; #endif #ifdef act_output_CH8 if (rxMsg->Data[0] == 8) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH8PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH8); #else Pca95xx_set_statement(chnValue[index],act_output_CH8); #endif } index++; #endif #ifdef act_output_CH9 if (rxMsg->Data[0] == 9) { chnValue[index] = rxMsg->Data[1]; #if act_output_CH9PCA95xxIO==0 gpio_set_statement(chnValue[index],act_output_CH9); #else Pca95xx_set_statement(chnValue[index],act_output_CH9); #endif } index++; #endif Timer_SetTimeout(act_output_STORE_VALUE_TIMEOUT, act_output_STORE_VALUE_TIMEOUT_TIME_S*1000, TimerTypeOneShot, 0); StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); rxMsg->Length = 2; while (StdCan_Put(rxMsg) != StdCan_Ret_OK); } else { index = 0; #ifdef act_output_CH0 if (rxMsg->Data[0] == 0) {value = chnValue[index];} index++; #endif #ifdef act_output_CH1 if (rxMsg->Data[0] == 1) {value = chnValue[index];} index++; #endif #ifdef act_output_CH2 if (rxMsg->Data[0] == 2) {value = chnValue[index];} index++; #endif #ifdef act_output_CH3 if (rxMsg->Data[0] == 3) {value = chnValue[index];} index++; #endif #ifdef act_output_CH4 if (rxMsg->Data[0] == 4) {value = chnValue[index];} index++; #endif #ifdef act_output_CH5 if (rxMsg->Data[0] == 5) {value = chnValue[index];} index++; #endif #ifdef act_output_CH6 if (rxMsg->Data[0] == 6) {value = chnValue[index];} index++; #endif #ifdef act_output_CH7 if (rxMsg->Data[0] == 7) {value = chnValue[index];} index++; #endif #ifdef act_output_CH8 if (rxMsg->Data[0] == 8) {value = chnValue[index];} index++; #endif #ifdef act_output_CH9 if (rxMsg->Data[0] == 9) {value = chnValue[index];} index++; #endif rxMsg->Data[1] = value; StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER); rxMsg->Length = 2; while (StdCan_Put(rxMsg) != StdCan_Ret_OK); } break; } } }