Beispiel #1
0
void canix_SFP_HMS_handler(const canix_frame *frame)
{
	canix_frame answer;

	answer.src = canix_selfaddr();
	answer.dst = frame->src;
	answer.proto = HCAN_PROTO_SFP;
	answer.data[0] = HCAN_SRV_HMS;


	switch (frame->data[1])
	{
		case HCAN_HMS_PING_REQUEST :
			answer.data[1] = HCAN_HMS_PING_REPLAY;
			answer.size = 2;
			canix_frame_send(&answer);
			break;
		case HCAN_HMS_DEVICE_STATE_REQUEST :
			answer.data[1] = HCAN_HMS_DEVICE_STATE_REPLAY;
			answer.data[2] = HCAN_HMS_DEV_STATE_APPLICATION;
			answer.size = 3;
			canix_frame_send(&answer);
			break;
		case HCAN_HMS_DEVICE_RESET :
			canix_reset();
			break;
		case HCAN_HMS_DEVICE_TYPE_REQUEST :
			answer.data[1] = HCAN_HMS_DEVICE_TYPE_REPLAY;
#if defined (__AVR_ATmega8__)
			answer.data[2] = 0;
#elif defined (__AVR_ATmega32__)
			answer.data[2] = 1;
#elif defined (__AVR_ATmega644__)
			answer.data[2] = 2;
#endif
			answer.data[3] = eeprom_read_byte((uint8_t *)EEPR_BOARD_TYPE);
			answer.size = 4;
			canix_frame_send(&answer);
			break;
		case HCAN_HMS_INTERNAL_EEPROM_WRITE :
			{
				// only write to eeprom, if the value changed !
				uint8_t read = 
					eeprom_read_byte((uint8_t *)(frame->data[2] |
								(frame->data[3] << 8)));

				if (read != frame->data[4])
					eeprom_write_byte((uint8_t *)(frame->data[2] |
								(frame->data[3] << 8)), frame->data[4]);

				answer.data[1] = HCAN_HMS_INTERNAL_EEPROM_WRITE_ACK;
				answer.size = 2;
				canix_frame_send(&answer);
			}
			break;
		case HCAN_HMS_INTERNAL_EEPROM_READ_REQUEST :
			answer.data[1] = HCAN_HMS_INTERNAL_EEPROM_READ_REPLAY;
			answer.data[2] = eeprom_read_byte((uint8_t *)(frame->data[2] |
						(frame->data[3] << 8)));
			answer.size = 3;
			canix_frame_send(&answer);
			break;
		case HCAN_HMS_INTERNAL_EEPROM_READ_BULK_REQUEST :
			{
				uint16_t address;
				address = frame->data[2] | (frame->data[3] << 8);
				answer.data[1] = HCAN_HMS_INTERNAL_EEPROM_READ_BULK_REPLAY;
				answer.data[2] = eeprom_read_byte((uint8_t*) (address + 0));
				answer.data[3] = eeprom_read_byte((uint8_t*) (address + 1));
				answer.data[4] = eeprom_read_byte((uint8_t*) (address + 2));
				answer.data[5] = eeprom_read_byte((uint8_t*) (address + 3));
				answer.data[6] = eeprom_read_byte((uint8_t*) (address + 4));
				answer.data[7] = eeprom_read_byte((uint8_t*) (address + 5));
				answer.size = 8;
				canix_frame_send(&answer);
			}
			break;
		case HCAN_HMS_UPTIME_QUERY :
			answer.size = 6;
			answer.data[1] = HCAN_HMS_UPTIME_REPLAY;
			answer.data[2] = canix_rtc_clock.uptime_sec >> 24;
			answer.data[3] = canix_rtc_clock.uptime_sec >> 16;
			answer.data[4] = canix_rtc_clock.uptime_sec >> 8;
			answer.data[5] = canix_rtc_clock.uptime_sec;
			canix_frame_send(&answer);
			break;
		case HCAN_HMS_SYSLOG_LEVEL_SET :
#ifdef CANIX_SYSLOG
			canix_set_syslog_level(frame->data[2]);
			eeprom_write_byte((uint8_t *)EEPR_DEBUG_LEVEL, frame->data[2]);
#endif
			break;
		case HCAN_HMS_BUILD_VERSION_QUERY :
			answer.data[1] = HCAN_HMS_BUILD_VERSION_REPLAY;
			answer.data[2] = 
#include <buildver> 
				>> 8;
			answer.data[3] = 
#include <buildver>
				;
			answer.size = 4;
			canix_frame_send(&answer);
			break;
		case HCAN_HMS_CAN_EC_QUERY :
			{
				uint16_t ec = can_error_counters();
				answer.data[1] = HCAN_HMS_CAN_EC_REPLAY;
				answer.data[2] = ec >> 8;
				answer.data[3] = ec;
				answer.size = 4;
				canix_frame_send(&answer);
			}
			break;
		case HCAN_HMS_RX_RECEIVED_QUERY :
			{
				answer.data[1] = HCAN_HMS_RX_RECEIVED_REPLAY;
				answer.data[2] = canix_rx_received >> 24;
				answer.data[3] = canix_rx_received >> 16;
				answer.data[4] = canix_rx_received >> 8;
				answer.data[5] = canix_rx_received;
				answer.size = 6;
				canix_frame_send(&answer);
			}
			break;
		case HCAN_HMS_RX_LOST_QUERY :
			{
				answer.data[1] = HCAN_HMS_RX_LOST_REPLAY;
				answer.data[2] = canix_rx_lost >> 24;
				answer.data[3] = canix_rx_lost >> 16;
				answer.data[4] = canix_rx_lost >> 8;
				answer.data[5] = canix_rx_lost;
				answer.size = 6;
				canix_frame_send(&answer);
			}
			break;
		case HCAN_HMS_TX_SENT_QUERY :
			{
				answer.data[1] = HCAN_HMS_TX_SENT_REPLAY;
				answer.data[2] = canix_tx_sent >> 24;
				answer.data[3] = canix_tx_sent >> 16;
				answer.data[4] = canix_tx_sent >> 8;
				answer.data[5] = canix_tx_sent;
				answer.size = 6;
				canix_frame_send(&answer);
			}
			break;
		case HCAN_HMS_TX_DROPPED_QUERY :
			{
				answer.data[1] = HCAN_HMS_TX_DROPPED_REPLAY;
				answer.data[2] = canix_tx_dropped >> 24;
				answer.data[3] = canix_tx_dropped >> 16;
				answer.data[4] = canix_tx_dropped >> 8;
				answer.data[5] = canix_tx_dropped;
				answer.size = 6;
				canix_frame_send(&answer);
			}
			break;
		case HCAN_HMS_RX_TX_STATS_RESET : 
			{
				canix_rx_received = 0;
				canix_rx_lost = 0;
				canix_tx_sent = 0;
				canix_tx_dropped = 0;
			}
			break;
	}
}
Beispiel #2
0
uint8_t canix_init(void)
{
	uint8_t i;
	uint8_t res;

	// RTC init
	canix_rtc_init();

	// init callbacks
	for (i = 0; i < MAX_FRAME_CALLBACKS; i++)
		frame_callback_entry[i].callback = (canix_frame_callback) 0;
	for (i = 0; i < MAX_IDLE_CALLBACKS; i++)
		idle_callback[i] = (canix_idle_callback) 0;
	for (i = 0; i < MAX_RTC_CALLBACKS; i++)
		rtc_callback[i] = (canix_rtc_callback) 0;

#ifdef CANIX_LED_SETUP1
	canix_led_init_ports();
#endif
#ifdef CANIX_LED_SETUP2
	canix_led_init_ports();
#endif

	// Eingangsbuffer leeren
	for (i = 0; i < CANIX_QUEUE_SIZE; i++)
		canix_rx_queue[i].used = 0;

	spi_init();
	res = can_open_interface();

#ifdef CANIX_HMS
	// HMS Stuff
	canix_reg_frame_callback(canix_SFP_HMS_handler, canix_selfaddr(),
			HCAN_PROTO_SFP, HCAN_SRV_HMS);
	canix_reg_frame_callback(canix_SFP_HMS_handler, HCAN_MULTICAST_INFO,
			HCAN_PROTO_SFP, HCAN_SRV_HMS);
#endif

#ifdef CANIX_RTS
	// RTS Stuff (Real Time Service, just passive receiving)
	canix_reg_frame_callback(canix_SFP_RTS_handler, HCAN_MULTICAST_INFO,
			HCAN_PROTO_SFP, HCAN_SRV_RTS);
	canix_reg_frame_callback(canix_SFP_RTS_handler, canix_selfaddr(),
			HCAN_PROTO_SFP, HCAN_SRV_RTS);
#endif

#ifdef CANIX_SYSLOG
	// enable syslog debug messages
	canix_set_syslog_level(eeprom_read_byte((uint8_t *)EEPR_DEBUG_LEVEL));
#endif

	sei();

#ifdef CANIX_EDS
	eds_init();

	canix_reg_frame_callback(eds_can_callback, canix_selfaddr(), 
			HCAN_PROTO_SFP, HCAN_SRV_EDS);
#endif

	return res;
}