00001 #ifndef __pic_packet_h 00002 #define __pic_packet_h 00003 00004 #include "pic_utils.h" 00005 #include "pic_serial.h" 00006 #include "pic_tick.h" 00007 #include "pic_serial.h" 00008 #include "pic_tick.h" 00009 00010 #include "config.h" 00011 00012 #include <memory.h> 00013 00014 #ifdef PKT_USE_24L01 00015 #include "pic_rf_24l01.h" 00016 #else 00017 #include "pic_rf_2401a.h" 00018 #endif 00019 00020 #ifdef PKT_DEBUG_HIGH 00021 #ifndef PKT_DEBUG 00022 #define PKT_DEBUG 00023 #endif 00024 #endif 00025 // You'll need to define this routine in your own code: 00026 //void pkt_process_payload(uns16 source_addr, uns16 pkt_id, uns8 *payload) {} 00027 00028 // Put this in your config.h: 00029 00030 // Config defines 00031 /* 00032 #define PKT_TX_QUEUE_SIZE 3 00033 #define PKT_SEEN_LIST_SIZE 4 00034 #define PKT_SEND_MAX_TRIES 2 00035 #define PKT_RESEND_TICK_DELAY 500 00036 00037 #define PKT_USE_2401A 00038 //#define PKT_USE_24L01 00039 00040 00041 */ 00042 00043 00044 // Status results 00045 00046 #define PKT_STATUS_SEEN_BEFORE 1 00047 #define PKT_STATUS_I_AM_SENDER 2 00048 #define PKT_STATUS_PKT_IS_FOR_ME 3 00049 #define PKT_STATUS_PKT_IS_ACK_FOR_ME 4 00050 #define PKT_STATUS_PKT_IS_FACK_FOR_ME 5 00051 #define PKT_STATUS_DIRECT_SEND 6 00052 #define PKT_STATUS_PREVIOUS_ROUTED_VIA_ME 7 00053 #define PKT_STATUS_ROUTING_FULL 8 00054 #define PKT_STATUS_NEED_TO_REBROADCAST 9 00055 #define PKT_STATUS_QUEUED 10 00056 #define PKT_STATUS_TX_QUEUE_FULL 11 00057 #define PKT_STATUS_CHECK_FAIL 12 00058 00059 // flags 00060 00061 #define PKT_FLAG_NO_RESEND 0 00062 #define PKT_FLAG_RESEND 1 00063 #define PKT_FLAG_DELETED 0xff 00064 00065 // magic config address 00066 #define PKT_CONFIG_ADDR 0xfffe 00067 00068 #define PKT_PACKET_SIZE 21 00069 00070 #define RF_RX_BUFFER_SIZE PKT_PACKET_SIZE 00071 // Since we need to send address byte as well 00072 #define RF_TX_BUFFER_SIZE PKT_PACKET_SIZE + 1 00073 00074 00075 struct _rf_packet_det { // 21 bytes 00076 uns16 source_addr; 00077 uns16 pkt_id; 00078 uns16 dest_addr; 00079 uns16 r1_addr; 00080 uns16 r2_addr; 00081 uns16 r3_addr; 00082 uns8 payload[8]; 00083 uns8 check_byte; 00084 }; 00085 00086 typedef struct _rf_packet_det rf_packet_det; 00087 00088 union _rf_packet { 00089 rf_packet_det d; 00090 char a[PKT_PACKET_SIZE]; 00091 }; 00092 00093 typedef union _rf_packet rf_packet; 00094 00095 00096 00097 00098 struct _sending_item { 00099 rf_packet packet; 00100 uns16 tick_sent; 00101 uns8 sent_count; 00102 uns8 flag; // 0 don't resend / 1 resend / 0xff deleted 00103 }; 00104 00105 typedef struct _sending_item sending_item; 00106 00107 struct _seen_packet { 00108 uns16 pkt_id; 00109 uns16 source_addr; 00110 }; 00111 00112 typedef struct _seen_packet seen_packet; 00113 00114 00115 00116 uns8 pkt_load_rx(rf_packet* pkt); 00117 uns8 pkt_rx_avail(); 00118 uns8 pkt_queue_packet(rf_packet *packet, uns8 resend); 00119 void pkt_send_packet(rf_packet *packet); 00120 void pkt_process_tx_queue(); 00121 void pkt_init(uns16 my_addr); 00122 uns8 pkt_send(uns16 dest_addr, uns8 *payload, uns8 resend); 00123 uns8 pkt_print_packet(rf_packet *my_packet); 00124 void pkt_calc_check_byte(rf_packet *packet); 00125 uns8 pkt_check_check_byte(rf_packet *packet); // 1= ok 0= bad 00126 void pkt_process_payload(uns16 source_addr, uns16 pkt_id, uns8 *payload); 00127 00128 #ifdef PKT_USE_24L01 00129 inline void pkt_send_packet(rf_packet *packet) { 00130 00131 //uns8 tx_buffer[PKT_PACKET_SIZE + 3]; // +3 for RF address (fixed) 00132 uns8 count; 00133 00134 #ifdef PKT_DEBUG 00135 print_str(" <S>"); 00136 #endif 00137 #ifdef PKT_DEBUG_HIGH 00138 pkt_print_packet(packet); 00139 #endif 00140 //tx_buffer[0] = 0b11100111; // address 00141 //tx_buffer[1] = 0b11100111; // address 00142 //tx_buffer[2] = 0b11100111; // address 00143 //for (count = 0; count < PKT_PACKET_SIZE; count++) { 00144 // tx_buffer[count+3] = packet->a[count]; 00145 //} 00146 //pic_rf_transmit(tx_buffer, PKT_PACKET_SIZE + 3); 00147 pic_rf_transmit((uns8 *)packet, PKT_PACKET_SIZE); 00148 } 00149 00150 #else 00151 inline void pkt_send_packet(rf_packet *packet) { 00152 00153 uns8 tx_buffer[PKT_PACKET_SIZE + 3]; // +3 for RF address (fixed) 00154 uns8 count; 00155 00156 #ifdef PKT_DEBUG 00157 serial_print_str(" <S>"); 00158 #endif 00159 #ifdef PKT_DEBUG_HIGH 00160 pkt_print_packet(packet); 00161 #endif 00162 tx_buffer[0] = 0b11100111; // address 00163 tx_buffer[1] = 0b11100111; // address 00164 tx_buffer[2] = 0b11100111; // address 00165 for (count = 0; count < PKT_PACKET_SIZE; count++) { 00166 tx_buffer[count+3] = packet->a[count]; 00167 } 00168 pic_rf_transmit(tx_buffer, PKT_PACKET_SIZE + 3); 00169 //pic_rf_transmit((uns8 *)packet, PKT_PACKET_SIZE); 00170 } 00171 00172 00173 #endif 00174 00175 #endif