/*---------------------------------------------------------------------------*/ static radio_result_t get_value(radio_param_t param, radio_value_t *value) { if(!value) { return RADIO_RESULT_INVALID_VALUE; } switch(param) { case RADIO_PARAM_POWER_MODE: *value = listen_on || tx_in_progress ? RADIO_POWER_MODE_ON : RADIO_POWER_MODE_OFF; return RADIO_RESULT_OK; case RADIO_PARAM_CHANNEL: *value = get_channel(); return RADIO_RESULT_OK; case RADIO_PARAM_RX_MODE: *value = 0; if(frame_filtering) { *value |= RADIO_RX_MODE_ADDRESS_FILTER; } if(autoack_enabled) { *value |= RADIO_RX_MODE_AUTOACK; } if(poll_mode) { *value |= RADIO_RX_MODE_POLL_MODE; } return RADIO_RESULT_OK; case RADIO_PARAM_TX_MODE: *value = 0; if(send_on_cca) { *value |= RADIO_TX_MODE_SEND_ON_CCA; } return RADIO_RESULT_OK; case RADIO_PARAM_TXPOWER: *value = get_txpower(); return RADIO_RESULT_OK; case RADIO_PARAM_RSSI: *value = get_rssi(); return RADIO_RESULT_OK; case RADIO_PARAM_LAST_RSSI: *value = radio_last_rssi; return RADIO_RESULT_OK; case RADIO_PARAM_CCA_THRESHOLD: *value = cca_thershold; return RADIO_RESULT_OK; case RADIO_CONST_CHANNEL_MIN: *value = 11; return RADIO_RESULT_OK; case RADIO_CONST_CHANNEL_MAX: *value = 26; return RADIO_RESULT_OK; case RADIO_CONST_TXPOWER_MIN: *value = OUTPUT_POWER_MIN; return RADIO_RESULT_OK; case RADIO_CONST_TXPOWER_MAX: *value = OUTPUT_POWER_MAX; return RADIO_RESULT_OK; default: return RADIO_RESULT_NOT_SUPPORTED; } }
void rssi_value_add(void) { g_total_rssi_value += -(0xFF - get_rssi()); g_total_rssi_cnt_num ++; //printk("rssi_value_add %d\n",g_total_rssi_value); return; }
/*---------------------------------------------------------------------------*/ static radio_result_t get_value(radio_param_t param, radio_value_t *value) { if(!value) { return RADIO_RESULT_INVALID_VALUE; } switch(param) { case RADIO_PARAM_POWER_MODE: *value = (REG(RFCORE_XREG_RXENABLE) && RFCORE_XREG_RXENABLE_RXENMASK) == 0 ? RADIO_POWER_MODE_OFF : RADIO_POWER_MODE_ON; return RADIO_RESULT_OK; case RADIO_PARAM_CHANNEL: *value = (radio_value_t)get_channel(); return RADIO_RESULT_OK; case RADIO_PARAM_PAN_ID: *value = get_pan_id(); return RADIO_RESULT_OK; case RADIO_PARAM_16BIT_ADDR: *value = get_short_addr(); return RADIO_RESULT_OK; case RADIO_PARAM_RX_MODE: *value = 0; if(REG(RFCORE_XREG_FRMFILT0) & RFCORE_XREG_FRMFILT0_FRAME_FILTER_EN) { *value |= RADIO_RX_MODE_ADDRESS_FILTER; } if(REG(RFCORE_XREG_FRMCTRL0) & RFCORE_XREG_FRMCTRL0_AUTOACK) { *value |= RADIO_RX_MODE_AUTOACK; } return RADIO_RESULT_OK; case RADIO_PARAM_TXPOWER: *value = get_tx_power(); return RADIO_RESULT_OK; case RADIO_PARAM_CCA_THRESHOLD: *value = get_cca_threshold(); return RADIO_RESULT_OK; case RADIO_PARAM_RSSI: *value = get_rssi(); return RADIO_RESULT_OK; case RADIO_CONST_CHANNEL_MIN: *value = CC2538_RF_CHANNEL_MIN; return RADIO_RESULT_OK; case RADIO_CONST_CHANNEL_MAX: *value = CC2538_RF_CHANNEL_MAX; return RADIO_RESULT_OK; case RADIO_CONST_TXPOWER_MIN: *value = OUTPUT_POWER_MIN; return RADIO_RESULT_OK; case RADIO_CONST_TXPOWER_MAX: *value = OUTPUT_POWER_MAX; return RADIO_RESULT_OK; default: return RADIO_RESULT_NOT_SUPPORTED; } }
void loop(){ if (ch_num >= 24 && ch_num <= 61) { SubGHz.begin(ch_num, 0xABCD, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW); } // SubGHz.rxEnable(NULL); // 2015.07.29 Eiichi Saito CCA中シンクさせない reg_data = 0x00; ml7396_regwrite(REG_ADR_DEMSET3, ®_data, 1); ml7396_regwrite(REG_ADR_DEMSET14, ®_data, 1); reg_data = 0x30; // CCA無限実行 ml7396_regwrite(REG_ADR_CCA_CNTRL, ®_data, 1); reg_data = 0x06; ml7396_regwrite(REG_ADR_RF_STATUS, ®_data, 1); // lcd.clear(); lcd.home(); lcd.print("100k"); lcd.print(" "); // lcd.print("50k"); // lcd.print(" "); get_sw_val(); create_msg(ch_num, DEC, 2); lcd.print("c"); lcd.setCursor(0, 1); get_rssi(); create_msg(occupancy_rate, DEC, 3); lcd.print("%"); lcd.print(" "); create_msg(max_rssi, HEX, 2); lcd.print(" "); reg_data = 0x40; // CCA無限実行 ml7396_regwrite(REG_ADR_CCA_CNTRL, ®_data, 1); reg_data = 0x08; ml7396_regwrite(REG_ADR_RF_STATUS, ®_data, 1); // 2015.07.29 Eiichi Saito CCA中シンクさせない reg_data = 0x64; ml7396_regwrite(REG_ADR_DEMSET3, ®_data, 1); reg_data = 0x27; ml7396_regwrite(REG_ADR_DEMSET14, ®_data, 1); SubGHz.close(); delay(500); }
////////////////////////////////////////////////////////////////////////////////////////////// // // // Main function // // // ////////////////////////////////////////////////////////////////////////////////////////////// int main(void) { //Test int last_nombre = 4; char str[64] = "Test de String..."; unsigned char distanceActuel = 0; //Variables protocole de liaison de donnée char trame_a_envoye = 0, trame_complete = 0, trameRX[NBROCTET], trameTX[NBROCTET]; //Initial configuration setup_oscillator(); config(); //Init fifo fifo_init(); radio_dir(TRM_RX); //Module en réception //Display welcome screen: ToDo #ifdef USE_GLCD GLCD_Bitmap((char*)Base1, 0, 0, 128, 64); #endif //Test // index = 0; // while(1) // { // // result = get_offset(dirty_buf[index], dirty_buf[index + 1], flag); // result = get_flag(flag); // Nop(); // clean_buffer(result, 16); // Nop(); // } //Main loop while (1) { #ifdef AUTO routine_auto(&trame_a_envoye, &trame_complete, trameTX, trameRX); #endif #ifdef BORNE routine_borne(&trame_a_envoye, &trame_complete, trameTX, trameRX); #endif //Test: encodeur et GLCD if((last_nombre != nombre) || buttonPress) //Si une transition a eu lieu { #ifdef USE_GLCD GLCD_ClearScreen(); GLCD_Bitmap((char*)Base1, 0, 0, 128, 64); if(buttonPress && !toEcran1) { BORNERESERVE = nombre; GLCD_GoTo(0,5); GLCD_WriteString(RESERVE); toEcran1 = 1; } else if(buttonPress && toEcran1) { toEcran1 = 0; BORNERESERVE = 3; confirm=2; } sprintf(str,"%d",SERIALBATTERIE); GLCD_GoTo(107,0); GLCD_WriteString(str); #endif switch(nombre) { case 0: #ifdef USE_GLCD DISTANCE = D1; GLCD_GoTo(0,2); GLCD_WriteString(ADR1A); if(!toEcran1) { GLCD_GoTo(0,3); GLCD_WriteString(ADR2); GLCD_GoTo(0,4); GLCD_WriteString(ADR3); } #endif break; case 1: #ifdef USE_GLCD DISTANCE = D2; GLCD_GoTo(0,3); GLCD_WriteString(ADR2A); if(!toEcran1) { GLCD_GoTo(0,2); GLCD_WriteString(ADR1); GLCD_GoTo(0,4); GLCD_WriteString(ADR3); } #endif break; case 2: #ifdef USE_GLCD DISTANCE = D3; if(!toEcran1) { GLCD_GoTo(0,2); GLCD_WriteString(ADR1); GLCD_GoTo(0,3); GLCD_WriteString(ADR2); } GLCD_GoTo(0,4); GLCD_WriteString(ADR3A); #endif break; default: #ifdef USE_GLCD GLCD_ClearScreen(); GLCD_Bitmap((char*)Base1, 0, 0, 128, 64); #endif break; } #ifdef USE_GLCD GLCD_GoTo(90,7); GLCD_WriteString(METER); distanceActuel = DISTANCE; buttonPress = 0; last_nombre = nombre; if(confirm==2) { if(D1<DISTANCEPROCHE){ borneProche(0); } else if(D2<DISTANCEPROCHE){ borneProche(1); } else if(D3<DISTANCEPROCHE){ borneProche(2); } if(confirm==1) { buttonPress=1; toEcran1=0; } else if(confirm==0) { buttonPress=0; toEcran1=0; last_nombre=4; } } #endif } //Données sortantes if(trame_a_envoye == 1) { envoie = rf_envoie(trameTX, (char *)clean_buf); if(envoie == 1) trame_a_envoye = 0; } //Flags - Données entrantes if(rf_flag == 1)//&& trame_complete == 0) { //Actualise la batterie #ifdef USE_GLCD getBatt(); sprintf(str,"%03i",BATTERIE); GLCD_GoTo(80,0); if(nombre==0) {DISTANCE = D1;} else if(nombre==1) {DISTANCE = D2;} else if(nombre==2) {DISTANCE = D3;} GLCD_WriteString(str); sprintf(str,"%i",DISTANCE); GLCD_GoTo(40,7); GLCD_WriteString(str); #endif result = get_flag(flag); if(result != 10) { clean_buffer(result, 32); //Extraction des octets vers la couche application trame_complete = rf_gerer_RX((char *)clean_buf, trameRX); } //Remise à zéro de la détection rf_flag = 0; result = 10; } // #ifdef GPS_FEEDTHROUGH //TestGPS #ifdef DEBUG_MPSIM gps_flag =1; //REMOVE #endif if(gps_flag) { gps_flag = 0; //Filtre les données quand le buffer est plein #ifdef DEBUG_MPSIM (gpsstr[3]='R'); //REMOVE #endif if((gpsstr[3]=='R')) { for(a =0;a<47;a++) { gps[a] = gpsstr[a]; //Buffer de travail } // puts_usart1(gpsstr); //gps[] = "$GPRMC,174254.000,V,4522.75800,N,07155.43400,W"; #ifdef DEBUG_MPSIM gps[20]='4'; gps[21]='5'; gps[22]='2'; gps[23]='2'; gps[25]='7'; gps[26]='5'; gps[27]='8'; gps[33]='0'; gps[34]='7'; gps[35]='1'; gps[36]='5'; gps[37]='5'; gps[39]='4'; gps[40]='3'; gps[41]='4'; gps[45]='W'; #endif convStr(); //LaA = 45.3793; //LoA= -71.9239; assignDist(LaA,LoA); } } #endif /* #ifdef USE_GLCD if(buttonPress) { switchScreen(last_nombre); buttonPress = 0; } if(distanceActuel < DISTANCEBATT && BATTERIE < 50 && ecran ==2) { switchBatt(); } #endif */ if(buttonPress) { #ifdef BORNE buttonPress = 0; char donnee_test[NBROCTET] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37}; envoie = rf_envoie(donnee_test, (char *)clean_buf); #endif #ifdef AUTO puts_usart1(gps); #endif } if(rssi_flag) { rssi_flag = 0; //Filtre les données quand le buffer est plein rssi = get_rssi(); } } return 0; }
void maca_isr(void) { // print_packets("maca_isr"); maca_entry++; if (bit_is_set(*MACA_STATUS, maca_status_ovr)) { PRINTF("maca overrun\n\r"); } if (bit_is_set(*MACA_STATUS, maca_status_busy)) { PRINTF("maca busy\n\r"); } if (bit_is_set(*MACA_STATUS, maca_status_crc)) { PRINTF("maca crc error\n\r"); } if (bit_is_set(*MACA_STATUS, maca_status_to)) { PRINTF("maca timeout\n\r"); } if (data_indication_irq()) { *MACA_CLRIRQ = (1 << maca_irq_di); dma_rx->length = *MACA_GETRXLVL - 2; /* packet length does not include FCS */ dma_rx->lqi = get_lqi(); dma_rx->rssi = get_rssi(); dma_rx->dbm = get_dbm(); dma_rx->rx_time = *MACA_TIMESTAMP; /* check if received packet needs an ack */ if(prm_mode == AUTOACK && (dma_rx->data[1] & 0x20)) { /* this wait is necessary to auto-ack */ volatile uint32_t wait_clk; wait_clk = *MACA_CLK + 200; while(*MACA_CLK < wait_clk) { continue; } } if(maca_rx_callback != 0) { maca_rx_callback(dma_rx); } add_to_rx(dma_rx); dma_rx = 0; } if (filter_failed_irq()) { PRINTF("maca filter failed\n\r"); ResumeMACASync(); *MACA_CLRIRQ = (1 << maca_irq_flt); } if (checksum_failed_irq()) { PRINTF("maca checksum failed\n\r"); ResumeMACASync(); *MACA_CLRIRQ = (1 << maca_irq_crc); } if (softclock_irq()) { *MACA_CLRIRQ = (1 << maca_irq_sftclk); } if (poll_irq()) { *MACA_CLRIRQ = (1 << maca_irq_poll); } if(action_complete_irq()) { /* PRINTF("maca action complete %d\n\r", get_field(*MACA_CONTROL,SEQUENCE)); */ if(last_post == TX_POST) { tx_head->status = get_field(*MACA_STATUS,CODE); if(maca_tx_callback != 0) { maca_tx_callback(tx_head); } dma_tx = 0; free_tx_head(); last_post = NO_POST; } ResumeMACASync(); *MACA_CLRIRQ = (1 << maca_irq_acpl); } decode_status(); if (*MACA_IRQ != 0) { PRINTF("*MACA_IRQ %x\n\r", (unsigned int)*MACA_IRQ); } if(tx_head != 0) { post_tx(); } else { post_receive(); } }