per.c
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <mc1322x.h>
00037 #include <board.h>
00038 #include <stdio.h>
00039
00040 #include "tests.h"
00041 #include "config.h"
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #define SESSION_REQ_TIMEOUT 10000
00053
00054 enum STATES {
00055 SCANNING,
00056 MAX_STATE
00057 };
00058
00059 typedef uint32_t ptype_t;
00060 enum PACKET_TYPE {
00061 PACKET_SESS_REQ,
00062 MAX_PACKET_TYPE
00063 };
00064
00065
00066 ptype_t get_packet_type(packet_t * p __attribute__((unused))) {
00067 return MAX_PACKET_TYPE;
00068 }
00069
00070 typedef uint32_t session_id_t;
00071
00072
00073
00074
00075 uint32_t get_time(void) {
00076 static volatile int32_t cur_time = 0;
00077 cur_time++;
00078 return cur_time;
00079 }
00080
00081
00082 #define random_short_addr() (*MACA_RANDOM & ones(sizeof(uint16_t)*8))
00083
00084 void build_session_req(volatile packet_t *p) {
00085 static uint8_t count = 0;
00086 p->length = 4; p->offset = 0;
00087 p->data[0] = 0xff;
00088 p->data[1] = 0x01;
00089 p->data[2] = 0x02;
00090 p->data[3] = count++;
00091 return;
00092 }
00093
00094 void session_req(uint16_t addr __attribute__((unused))) {
00095 static volatile int time = 0;
00096 volatile packet_t *p;
00097
00098 if((get_time() - time) > SESSION_REQ_TIMEOUT) {
00099 time = get_time();
00100 if((p = get_free_packet())) {
00101 build_session_req(p);
00102 tx_packet(p);
00103 }
00104 }
00105 return;
00106 }
00107
00108 session_id_t open_session(uint16_t addr __attribute((unused))) { return 0; }
00109
00110 void main(void) {
00111 uint32_t state;
00112 volatile packet_t *p;
00113 session_id_t sesid;
00114 ptype_t type;
00115 uint16_t addr, my_addr;
00116
00117
00118 pack_XTAL_CNTL(CTUNE_4PF, CTUNE, FTUNE, IBIAS);
00119
00120 uart_init(INC, MOD, SAMP);
00121
00122 vreg_init();
00123
00124 maca_init();
00125
00126 set_power(0x0f);
00127 set_channel(0);
00128
00129
00130 my_addr = random_short_addr();
00131
00132
00133 *GPIO_FUNC_SEL2 = (0x01 << ((44-16*2)*2));
00134 gpio_pad_dir_set( 1ULL << 44 );
00135
00136 print_welcome("Packet error test");
00137
00138 state = SCANNING;
00139 while(1) {
00140
00141 switch(state) {
00142 case SCANNING:
00143 if((p = rx_packet())) {
00144
00145 printf("Recv: ");
00146 print_packet(p);
00147 type = get_packet_type((packet_t *) p);
00148 addr = 0;
00149 free_packet(p);
00150
00151 if(addr == my_addr) {
00152 my_addr = random_short_addr();
00153 printf("DUP addr received, changing to new addr 0x%x02\n\r",my_addr);
00154 }
00155
00156
00157 if(type == PACKET_SESS_REQ) {
00158
00159 sesid = open_session(addr);
00160 }
00161 } else {
00162 session_req(my_addr);
00163 }
00164 break;
00165 default:
00166 break;
00167 }
00168
00169
00170 }
00171
00172 }
00173