www.pudn.com > Usb_Project.rar > relay.c
#include "relay.h" #include "RF_USB_MAC.h" #include#include "relay_file.h" extern unsigned char blank_deviceID[6]; extern unsigned char blank_frame[RF_MAC_FRM_LEN]; unsigned char assign_relay_deviceID[] = {0xF0, 0, 0, 0, 0, 1}; unsigned char current_relay_deviceID[] = {0xF0, 0, 0, 0, 0, 1}; unsigned short current_group_address = 0x2100; unsigned short current_next_prev_hop = 0xFFFF; unsigned short current_chan_baud = 0xFFFF; signed short numof_ftp_recs = -2; unsigned short continuity_test; extern unsigned int selected_mode; int _RF_USB_send_relay_frame(unsigned char * frame, unsigned int flen) { PrintTime("\n-> Decoded TX Time:"); PrintHexBuffer((unsigned char *)&frame[0], flen); LogTime("\n-> Decoded TX Time:"); LogHexBuffer((unsigned char *)&frame[0], flen); RF_USB_send_frame(frame, flen); return 0; } static void RF_preset_config_frame(unsigned char * frame) { struct relay_cfg_hdr * _cfg_ptr = (struct relay_cfg_hdr *)&frame[0]; struct rf_mac_hdr *_hptr = (struct rf_mac_hdr *)&frame[RF_MAC_FRM_HEAD]; memset((unsigned char *)&frame[0], 0, RF_MAC_FRM_DATA_LEN); } static void RF_preset_local_frame(unsigned char * frame) { struct relay_cfg_hdr * _cfg_ptr = (struct relay_cfg_hdr *)&frame[0]; struct rf_mac_hdr *_hptr = (struct rf_mac_hdr *)&frame[RF_MAC_FRM_HEAD]; RF_preset_config_frame(frame); _hptr->grp = 255; _hptr->dst = 255; _hptr->src = 0; _hptr->cmd = FRM_CMD_RELAY_CFG; _cfg_ptr->relay_cmd = 0; } int _RF_USB_Relay_poll(unsigned short group_address) { struct relay_cfg_hdr * _cfg_ptr = (struct relay_cfg_hdr *)&blank_frame[0]; struct rf_mac_hdr *_hptr = (struct rf_mac_hdr *)&blank_frame[RF_MAC_FRM_HEAD]; RF_preset_local_frame(blank_frame); memset(_cfg_ptr->data, 0xFF, sizeof(_cfg_ptr->data)); memset(_cfg_ptr->id, 0xFF, sizeof(_cfg_ptr->id)); _hptr->grp = 255; _hptr->dst = (unsigned char)group_address; _hptr->src = 0; _hptr->relay = (unsigned char)(group_address>>8); _hptr->cmd = FRM_CMD_RELAY_CFG; _RF_USB_send_relay_frame(blank_frame, RF_MAC_FRM_DATA_LEN); return 0; } int _RF_USB_recv_frame_cmd11(unsigned char * frame, unsigned int flen) { struct rf_mac_hdr * _hptr; struct relay_cfg_hdr * _cfg_ptr; struct relay_cfg_hdr * _rpt_ptr; _hptr = (struct rf_mac_hdr *)&frame[RF_MAC_FRM_HEAD]; _rpt_ptr = (struct relay_cfg_hdr *)frame; _cfg_ptr = (struct relay_cfg_hdr *)blank_frame; PrintTime("\n<- Decoded RX Time:"); PrintHexBuffer((unsigned char *)&frame[0], flen); LogTime("\n<- Decoded RX Time:"); LogHexBuffer((unsigned char *)&frame[0], flen); //from rfd if(_hptr->cmd == FRM_CMD_RELAY_CFG) { if(_memcmp(_rpt_ptr->id, blank_deviceID, sizeof(blank_deviceID)) == 0) { //device ID if(selected_mode == 101) { RF_preset_local_frame(blank_frame); _memcpy(_cfg_ptr->id, assign_relay_deviceID, sizeof(assign_relay_deviceID)); _RF_USB_send_relay_frame(blank_frame, RF_MAC_FRM_DATA_LEN); } } else { if(_memcmp(_cfg_ptr->id, assign_relay_deviceID, sizeof(assign_relay_deviceID)) == 0) { _device_ID_inc(assign_relay_deviceID); } //this is the current ID _memcpy(current_relay_deviceID, _rpt_ptr->id, sizeof(current_relay_deviceID)); //zeroing if(selected_mode == 102) { RF_preset_local_frame(blank_frame); _memcpy(_cfg_ptr->id, current_relay_deviceID, sizeof(current_relay_deviceID)); _cfg_ptr->relay_cmd = 0xFF; _RF_USB_send_relay_frame(blank_frame, RF_MAC_FRM_DATA_LEN); } else if(selected_mode == 103) { //group address RF_preset_local_frame(blank_frame); _memcpy(_cfg_ptr->id, current_relay_deviceID, sizeof(current_relay_deviceID)); _memcpy(&_cfg_ptr->data[2], (unsigned char *)¤t_group_address, sizeof(current_group_address)); _cfg_ptr->relay_cmd = 0x02; _RF_USB_send_relay_frame(blank_frame, RF_MAC_FRM_DATA_LEN); selected_mode = 0; } else if(selected_mode == 104) { //prev_next hop RF_preset_local_frame(blank_frame); _memcpy(_cfg_ptr->id, current_relay_deviceID, sizeof(current_relay_deviceID)); _memcpy(&_cfg_ptr->data[4], (unsigned char *)¤t_next_prev_hop, sizeof(current_next_prev_hop)); _cfg_ptr->relay_cmd = 0x04; _RF_USB_send_relay_frame(blank_frame, RF_MAC_FRM_DATA_LEN); } else if(selected_mode == 105) { relay_ftp_xfer(current_group_address>>8, 0xFE, numof_ftp_recs); } else if(selected_mode == 106) { //arrived if((_hptr->relay == 0) && (_hptr->dst == 0)) { if(_hptr->cmd == FRM_CMD_GROUP_TRACE) { _RF_USB_send_relay_frame(frame, RF_MAC_FRM_DATA_LEN); } } } else if(selected_mode == 107) { continuity_test ++; _RF_USB_Relay_poll(current_group_address); } } } else if(_hptr->cmd == FRM_CMD_RELAY_FTP) { struct relay_ftp * _ftptr; _ftptr = (struct relay_ftp *)frame; printf("\n LIVE_TIME %ld CUR_POS %d", _ftptr->live_time, _ftptr->live_entry_pos); } else if(_hptr->cmd == FRM_CMD_RELAY_FTP_XFER) { } return 0; } static void RF_send_gtrace_frame(unsigned char * frame) { struct relay_cfg_hdr * _cfg_ptr = (struct relay_cfg_hdr *)&frame[0]; struct rf_mac_hdr *_hptr = (struct rf_mac_hdr *)&frame[RF_MAC_FRM_HEAD]; RF_preset_config_frame(frame); _hptr->grp = current_group_address>>8; _hptr->dst = (unsigned char)current_group_address; _hptr->src = 0; _hptr->cmd = FRM_CMD_GROUP_TRACE_ASK; _RF_USB_send_relay_frame(blank_frame, RF_MAC_FRM_DATA_LEN); } int RelaySeleModeDone(void) { if(selected_mode > 100) { switch(selected_mode) { case 106: //traceing RF_send_gtrace_frame(blank_frame); break; case 107: continuity_test = 0; _RF_USB_Relay_poll(current_group_address); break; case 109: _RF_USB_Relay_poll(current_group_address); break; default: _RF_USB_Relay_poll(0xFFFF); break; } } return 0; } extern char line[250]; int RelaySeleModeMenu(void) { int cmd = 0; printf("1. Device Numbering [startNo]\n"); printf("2. Zeroing\n"); printf("3. Group address\n"); printf("4. Next Prev hop\n"); printf("5. FTP download\n"); printf("6. Group Tracing\n"); printf("7. Continuity test\n"); printf("8. Not available\n"); printf("9. Localcast searching\n"); fgets(line, sizeof(line), stdin); sscanf(line, "%ld", &cmd); selected_mode = cmd+100; printf("Selected Mode %d\n", selected_mode); switch(cmd) { case 0: break; case 1: // printf(" %d\n",); break; case 4: // printf(" %d\n",); break; case 3: case 5: case 6: case 7: default: printf("Default Group Address %X\n [Press Enter to use default]- ", current_group_address); line[0]='0'; line[1]='x'; fgets(&line[2], sizeof(line), stdin); if((line[2] != 0x13)&&(line[2] != 0)) { sscanf(line, "%X", ¤t_group_address); } break; } switch(cmd) { case 5: printf("Number of Entries to get %d\n [Press Enter to use default]- ", numof_ftp_recs); fgets(&line[0], sizeof(line), stdin); if((line[0] != 0x13)&&(line[0] != 0)) { sscanf(line, "%d", &numof_ftp_recs); } numof_ftp_recs = -1*abs(numof_ftp_recs); break; } return cmd; }