# 1 "twi.cpp" # 1 "" # 1 "" # 1 "twi.cpp" # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 1 3 # 94 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/sfr_defs.h" 1 3 # 126 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/sfr_defs.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/inttypes.h" 1 3 # 37 "c:/winavr-20080610/lib/gcc/../../avr/include/inttypes.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 1 3 # 121 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int int8_t __attribute__((__mode__(__QI__))); typedef unsigned int uint8_t __attribute__((__mode__(__QI__))); typedef int int16_t __attribute__ ((__mode__ (__HI__))); typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__))); typedef int int32_t __attribute__ ((__mode__ (__SI__))); typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__))); typedef int int64_t __attribute__((__mode__(__DI__))); typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); # 142 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int16_t intptr_t; typedef uint16_t uintptr_t; # 159 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int8_t int_least8_t; typedef uint8_t uint_least8_t; typedef int16_t int_least16_t; typedef uint16_t uint_least16_t; typedef int32_t int_least32_t; typedef uint32_t uint_least32_t; typedef int64_t int_least64_t; typedef uint64_t uint_least64_t; # 213 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int8_t int_fast8_t; typedef uint8_t uint_fast8_t; typedef int16_t int_fast16_t; typedef uint16_t uint_fast16_t; typedef int32_t int_fast32_t; typedef uint32_t uint_fast32_t; typedef int64_t int_fast64_t; typedef uint64_t uint_fast64_t; # 273 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int64_t intmax_t; typedef uint64_t uintmax_t; # 38 "c:/winavr-20080610/lib/gcc/../../avr/include/inttypes.h" 2 3 # 77 "c:/winavr-20080610/lib/gcc/../../avr/include/inttypes.h" 3 typedef int32_t int_farptr_t; typedef uint32_t uint_farptr_t; # 127 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/sfr_defs.h" 2 3 # 95 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 127 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/iom128.h" 1 3 # 128 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 317 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/portpins.h" 1 3 # 318 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/common.h" 1 3 # 320 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/version.h" 1 3 # 322 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/fuse.h" 1 3 # 214 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/fuse.h" 3 typedef struct { unsigned char low; unsigned char high; unsigned char extended; } __fuse_t; # 325 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/lock.h" 1 3 # 328 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 2 "twi.cpp" 2 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/interrupt.h" 1 3 # 3 "twi.cpp" 2 # 1 "twi.h" 1 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/util/twi.h" 1 3 # 5 "twi.h" 2 void Twi_Receive(void* data_ptr, void* packet_length); namespace TWI{ enum Modes {SLAVE, MSTR_START_SENT, MSTR_ERR, MSTR_ADDR_SENT, MSTR_DATA_SENT, MSTR_STOP_SENT, SLAVE_ACK, SLAVE_DATA}; enum CRC_Check {UNCHECKED,ERROR,GOOD}; struct TWI_Packet{ uint8_t address_r_w; uint8_t packet_length; uint8_t packet[10]; uint8_t crc; CRC_Check check; }; void Init(void* unused1, void* unused2); void Send(uint8_t address, uint8_t* pckt, uint8_t pckt_length); extern volatile Modes current_mode; extern volatile uint8_t cur_data_ptr; extern volatile TWI_Packet packet; extern volatile uint8_t tmp_crc; extern uint8_t slave_addr; void inline SetSlaveAddress(uint8_t addr){slave_addr = addr;} }; # 4 "twi.cpp" 2 # 1 "task.h" 1 # 11 "task.h" namespace TaskManager{ enum TASK_TYPE{ SINGLE_RUN, MULTI_RUN, }; enum PRIORITY{ HIGH = 0, MEDIUM = 50, LOW = 150, }; struct Task{ void (*function)(void*,void*); void* arg0; void* arg1; TASK_TYPE type; uint16_t interval; uint32_t next_run; uint8_t priority; bool active; uint8_t pri_level; }; extern volatile uint8_t cur_tasks; extern volatile uint8_t cpu_usage; extern volatile Task tasks[12]; extern volatile uint8_t cur_priority[3]; extern void AddTask(void (*function)(void*,void*), void* arg0, void* arg1,TASK_TYPE type,uint16_t interval,PRIORITY pri); extern uint8_t ExecuteNextTask(void); extern void DeleteTask(void (*function)(void*,void*)); extern void Init(void); }; # 5 "twi.cpp" 2 namespace TWI{ volatile uint8_t cur_data_ptr = 0; volatile Modes current_mode; volatile TWI_Packet packet; volatile uint8_t tmp_crc; uint8_t slave_addr; void Init(void* unused1, void* unused2){ (*(volatile uint8_t *)(0x72)) = (slave_addr<<1) | 0x01; (*(volatile uint8_t *)(0x73)) = 0xff; (*(volatile uint8_t *)(0x74)) = (1<<6) | (1<<2) | (1<<0) | (1<<7); TWI::current_mode = SLAVE; cur_data_ptr = 0; tmp_crc = 0xff; packet.check = UNCHECKED; } void Send(uint8_t address, uint8_t* pckt, uint8_t pckt_length){ if(current_mode!=SLAVE && current_mode!=MSTR_ERR) return; packet.crc = 0xff; for(int8_t i = 0; i < pckt_length; i++){ packet.packet[i] = pckt[i]; packet.crc ^= pckt[i]; } cur_data_ptr = 0; packet.packet_length = pckt_length; packet.address_r_w = (address << 1) & 0xfe; (*(volatile uint8_t *)(0x70)) = 32; (*(volatile uint8_t *)(0x71)) &= ~((1<<1) | (1<<0)); (*(volatile uint8_t *)(0x73)) = 0xff; (*(volatile uint8_t *)(0x74)) = (1<<7)|(1<<5)|(1<<2)|(1<<0); TWI::current_mode = MSTR_START_SENT; } }; extern "C" void __vector_33 (void) __attribute__ ((signal,used, externally_visible)) ; void __vector_33 (void){ if(TWI::current_mode==TWI::SLAVE || TWI::current_mode==TWI::SLAVE_ACK || TWI::current_mode==TWI::SLAVE_DATA){ switch(((*(volatile uint8_t *)(0x71)) & ((1 << (7))|(1 << (6))|(1 << (5))|(1 << (4))| (1 << (3))))){ case 0x90: case 0x80: if(TWI::current_mode==TWI::SLAVE_ACK){ TWI::packet.packet_length = (*(volatile uint8_t *)(0x73)); TWI::tmp_crc = 0xff; TWI::current_mode = TWI::SLAVE_DATA; } else if(TWI::current_mode==TWI::SLAVE_DATA){ if(TWI::cur_data_ptr