亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? wdp_host.c

?? 非常全的nrf2401設計資料
?? C
字號:
/* Copyright (c) 2007 Nordic Semiconductor. All Rights Reserved.
 *
 * The information contained herein is property of Nordic Semiconductor ASA.
 * Terms and conditions of usage are described in detail in NORDIC
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. 
 *
 * Licensees are granted free, non-transferable use of the information. NO
 * WARRENTY of ANY KIND is provided. This heading must NOT be removed from
 * the file.
 *
 * $LastChangedRevision: 2290 $
 */ 

/** @file
 *
 * Host source file for the Wireless Desktop Protocol. 
 *
 * @author Lasse Olsen
 *
 */
 
#include <stdint.h>
#include <string.h>
#include "wdp_host.h"

/**
Device parameter struct type definition. 
*/ 
typedef struct
{
  uint16_t dev_keep_alive_interval;   
  uint8_t dev_b0_address;            
} wdp_dev_params_t;

const wdp_dev_params_t wdp_dev_params[WDP_DEVICE_SUPPORT_SIZE]=
{
  {WDP_MOUSE_KA_INTERVAL, WDP_MOUSE_ADR_B0},
  {WDP_KEYBOARD_KA_INTERVAL, WDP_KEYBOARD_ADR_B0},
  {WDP_REMOTE_KA_INTERVAL, WDP_REMOTE_ADR_B0} 
};

typedef struct 
{
  uint8_t pairing[FAP_ADDRESS_WIDTH];
  uint8_t master[FAP_ADDRESS_WIDTH-1];
} wdp_addresses_t;  

static wdp_addresses_t wdp_addresses =           
{
  WDP_PAIRING_ADDRESS,
  WDP_INIT_MASTER_ADDRESS
};

/** 
WDP status register flag.
*/
#define WDP_EN_ADR_GEN 0

/** 
WDP status register flag.
*/
#define WDP_PAIRING_EXECUTED 1
/** 
WDP status register flag.
*/
#define WDP_APP_DATA_RDY 2

//***************************************************************************** 
// Misc. macros
//*****************************************************************************

#define WDP_GET_BIT(a, b) ((a >> b) & 0x01)
#define WDP_CLEAR_BIT(a, b) (a &= ~(1 << b))
#define WDP_SET_BIT(a, b) (a |= (1 << b)) 
                         
static xdata uint8_t wdp_status_reg;

static xdata fap_tx_rx_struct_t wdp_rx_struct;
static xdata fap_tx_rx_struct_t wdp_gen_purp_struct;

static xdata uint16_t wdp_device_alive_array[WDP_DEVICE_SUPPORT_SIZE];
static const uint8_t wdp_pairing_ch_tab[FAP_CH_TAB_SIZE] = WDP_PAIRING_CHANNELS;

bool wdp_host_get_rx_data(uint8_t *dst, uint8_t* length, wdp_dev_types_t* origin)
{
  if(WDP_GET_BIT(wdp_status_reg, WDP_APP_DATA_RDY))
  {
    *length = (wdp_rx_struct.pl_length - WDP_APP_PL_START); 
    *origin = (wdp_dev_types_t) wdp_rx_struct.pipe; 
    memcpy(dst, &wdp_rx_struct.pl[WDP_APP_PL_START], *length);
    WDP_CLEAR_BIT(wdp_status_reg, WDP_APP_DATA_RDY);
    return true;
  }
  else
  {
    return false;
  }
}

void wdp_host_init(void)
{
  uint8_t temp_adr;
  fap_init();
  fap_select_radio_idle_mode(FAP_PDOWN_IDLE);       

  fap_set_address(FAP_DEVICE0, (uint8_t*) &wdp_addresses.pairing[0]);
  
  temp_adr = WDP_KEYBOARD_ADR_B0;
  fap_set_address(FAP_DEVICE2, &temp_adr);

  temp_adr = WDP_REMOTE_ADR_B0;
  fap_set_address(FAP_DEVICE3, &temp_adr);
   
  WDP_SET_BIT(wdp_status_reg, WDP_EN_ADR_GEN);
  WDP_CLEAR_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
}
 
void wdp_host_get_master_adr(uint8_t *adr)
{
  memcpy(adr, &wdp_addresses.master[0], (FAP_ADDRESS_WIDTH-1));
}

void wdp_host_enable_random_adr_gen(void)
{
  WDP_SET_BIT(wdp_status_reg, WDP_EN_ADR_GEN);
}

bool wdp_host_set_master_adr(uint8_t *adr)
{
  if(fap_get_mode() == FAP_IDLE)
  {
    memcpy(&wdp_addresses.master[0], adr, (FAP_ADDRESS_WIDTH-1));   
    
    wdp_gen_purp_struct.pl[0] = wdp_dev_params[0].dev_b0_address;
    memcpy(&wdp_gen_purp_struct.pl[1], adr, (FAP_ADDRESS_WIDTH-1));
    
    WDP_CLEAR_BIT(wdp_status_reg, WDP_EN_ADR_GEN);
  
    fap_set_address(FAP_DEVICE1, &wdp_gen_purp_struct.pl[0]);
  
    return true;
  }
  else
  {
    return false;
  } 
}

void wdp_host_rx_setup(wdp_rx_setup_t setup)
{
  fap_goto_idle_mode();

  fap_flush_rx_fifo();
  fap_flush_tx_fifo();

  if(setup == WDP_RX_PAIRING)
  {
    WDP_CLEAR_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);  
    
    // Setup pairing receive channels
    fap_set_channels(wdp_pairing_ch_tab);
    
    // Note: Pipe 0 (pairing) address setup by wdp_host_init()
    fap_rx_data( (uint8_t) setup, 0);
  }
  else
  if(setup == WDP_RX_NORMAL)
  {
    // Setup receive channels
    wdp_extract_channels(wdp_addresses.master[0], &wdp_gen_purp_struct.pl[0]); 
    fap_set_channels(&wdp_gen_purp_struct.pl[0]);

    // Setup pipe 1 address (master)
    wdp_gen_purp_struct.pl[0] = wdp_dev_params[0].dev_b0_address; // Mouse address on pipe 1                
    memcpy(&wdp_gen_purp_struct.pl[1], &wdp_addresses.master[0], FAP_ADDRESS_WIDTH -1);        
    fap_set_address(FAP_DEVICE1, &wdp_gen_purp_struct.pl[0]);  
    
    fap_rx_data( (uint8_t) setup, 0);
  }
  else
  if(setup == WDP_RX_SUSPEND)
  {
    fap_rx_data( (uint8_t) setup, FAP_RX_SINGLE_CH_REV); 
  }
}

bool wdp_host_get_clear_pairing_result(void)
{
  bool retbit; 
  retbit = WDP_GET_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
  WDP_CLEAR_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
  return retbit; 
}

bool wdp_host_process_events(void)
{
  uint8_t temp_dev_index;

  // Random address counter    
  if(WDP_GET_BIT(wdp_status_reg, WDP_EN_ADR_GEN))
  {
    (*((uint16_t*)(&wdp_addresses.master[2]))) += 4;  
    (*((uint16_t*)(&wdp_addresses.master[0])))++;  
  }
  
  // Check if received data
  if(fap_read_rx_fifo(&wdp_rx_struct))
  {
    WDP_CLEAR_BIT(wdp_status_reg, WDP_APP_DATA_RDY);

    if(wdp_rx_struct.pipe == WDP_PAIRING_PIPE)
    {
      switch(wdp_rx_struct.pl[WDP_TYPE_ID])
      {
        case PAIRING_REQ:
          temp_dev_index = wdp_rx_struct.pl[DEV_TYPE] - 1;
        
          if(!(temp_dev_index < WDP_DEVICE_SUPPORT_SIZE))
          {
            break;
          }        

          WDP_CLEAR_BIT(wdp_status_reg, WDP_EN_ADR_GEN); // Stop address generator
        
          // Assemble pairing return payload 
          wdp_gen_purp_struct.pl[WDP_TYPE_ID] = PAIRING_RESP;
          wdp_gen_purp_struct.pl[DEV_TYPE] = wdp_rx_struct.pl[DEV_TYPE];
          
          wdp_gen_purp_struct.pl[ADDRESS_B0] = wdp_dev_params[temp_dev_index].dev_b0_address;                  

          memcpy(&wdp_gen_purp_struct.pl[MASTER_ADDRESS_START], wdp_addresses.master, FAP_ADDRESS_WIDTH -1 );  
          wdp_gen_purp_struct.pipe = WDP_PAIRING_PIPE;
          wdp_gen_purp_struct.pl_length = WDP_PAIRING_PL_LENGTH;

          // Write pairing return payload to downlink buffer (ack payload) 
          
          fap_write_ack_pload(&wdp_gen_purp_struct);  
                                                     
          break;
        case PAIRING_COMPL:
          WDP_SET_BIT(wdp_status_reg, WDP_PAIRING_EXECUTED);
          break;
        default:
          break;
      }    
    }
    else
    {
      temp_dev_index = wdp_rx_struct.pipe - 1;
    
      if(temp_dev_index < WDP_DEVICE_SUPPORT_SIZE) // If data received on device address (not pairing address)
      {
        wdp_device_alive_array[temp_dev_index]= wdp_dev_params[temp_dev_index].dev_keep_alive_interval*2;
      }
      
      switch(wdp_rx_struct.pl[WDP_TYPE_ID])
      {
        case KEEP_ALIVE:
          break; 
        case USER_DATA:
          WDP_SET_BIT(wdp_status_reg, WDP_APP_DATA_RDY);
          break;
        default:
          break;
      }
    }   
    return true;
  }

  return false;
}

void wdp_timer_isr_function(void)
{
  uint8_t index; 
  for(index=0; index<WDP_DEVICE_SUPPORT_SIZE; index++)
  {
    if(wdp_device_alive_array[index]>1)               // Stops at 1 when going from connect to disconnect
    {
      wdp_device_alive_array[index]--;
    }
  }
  return; 
}

bool wdp_host_write_downlink_data(wdp_dev_types_t dev_type, uint8_t *src, uint8_t length)
{
  if(!(length > WDP_MAX_DL_PL_LENGTH))
  {
    memcpy(&wdp_gen_purp_struct.pl[0], src, length);  
    wdp_gen_purp_struct.pipe = dev_type;
    wdp_gen_purp_struct.pl_length = length;
      
    return fap_write_ack_pload(&wdp_gen_purp_struct);
  }
  else
  {
    return false;
  }
}

bool wdp_host_get_connection_status(wdp_dev_types_t dev_type)
{
  if(wdp_device_alive_array[dev_type-1] == 1)
  {
    wdp_device_alive_array[dev_type-1] = 0;
    return false;  
  }
  else
  {
    return true;
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美高清一级片在线观看| 国产精品久久久久一区二区三区 | 欧美揉bbbbb揉bbbbb| 国产精品一线二线三线精华| 91视频在线看| www.亚洲激情.com| 懂色av中文字幕一区二区三区 | 国内外成人在线| 日韩 欧美一区二区三区| 亚洲制服丝袜av| 依依成人综合视频| 色婷婷综合久久久中文字幕| 欧美美女直播网站| 欧美一区二区三区视频免费播放| 久久国产精品色| 亚洲综合视频网| 韩国一区二区三区| 国产精品123区| 久久先锋影音av鲁色资源网| 欧美激情中文字幕| 国产精品看片你懂得| 久久看人人爽人人| 中文字幕一区二区三区av| 玉米视频成人免费看| 日韩欧美精品在线视频| 国产日韩视频一区二区三区| 国产精品色在线观看| 成人高清视频在线观看| 91高清视频在线| 欧美va亚洲va| 一区二区三区欧美视频| 久久色.com| 伊人性伊人情综合网| 美女视频黄频大全不卡视频在线播放| 国产一区二区精品久久| 欧美午夜精品久久久久久超碰| 7777精品伊人久久久大香线蕉| 日韩1区2区日韩1区2区| 国产一区二区在线看| 欧美亚洲综合久久| 久久精品夜夜夜夜久久| 亚洲高清中文字幕| 亚洲h动漫在线| 成人国产精品免费观看视频| 在线综合视频播放| 日本韩国精品在线| 欧美自拍丝袜亚洲| 精品国产百合女同互慰| 香蕉久久一区二区不卡无毒影院| 国产精品久久久久久久久免费相片 | 亚洲一区二区偷拍精品| 精品一区二区三区视频| 美国一区二区三区在线播放| 一区二区三区影院| 国产精品1024久久| 91精品国产免费| 国产真实乱子伦精品视频| 欧美日韩国产影片| 中文字幕一区二区三区乱码在线| 亚洲自拍与偷拍| 91麻豆国产自产在线观看| 国产精品卡一卡二卡三| 国产精品一二一区| 久久久国产一区二区三区四区小说| 国产精品久久毛片av大全日韩| 国产精品一区专区| 国产亚洲精品7777| 成人综合激情网| 亚洲欧美另类小说视频| 成人av手机在线观看| |精品福利一区二区三区| 亚洲国产精品久久一线不卡| 国产v综合v亚洲欧| 欧美日韩mp4| 精品一区二区精品| 国产精品少妇自拍| 狠狠色综合播放一区二区| 国产亚洲人成网站| 99国产精品视频免费观看| 一二三四区精品视频| 欧美日韩在线一区二区| 激情综合一区二区三区| 一区精品在线播放| 国产精品18久久久久久久网站| 国产精品婷婷午夜在线观看| 日本不卡视频一二三区| 国产视频一区二区在线观看| 日韩国产欧美三级| 欧美国产乱子伦| 精品视频在线看| 国产99久久久国产精品潘金 | 天堂久久一区二区三区| 欧美国产禁国产网站cc| 成人国产在线观看| 日韩精品亚洲专区| 亚洲欧洲日韩一区二区三区| 欧美精品第1页| caoporen国产精品视频| 日本韩国视频一区二区| 欧美日韩一二三区| 日韩女优制服丝袜电影| 日韩欧美一级精品久久| 久久日韩精品一区二区五区| 亚洲精品一区二区在线观看| 久久女同精品一区二区| 亚洲欧美影音先锋| 一区二区三区免费网站| 丝袜a∨在线一区二区三区不卡| 午夜精品一区二区三区电影天堂 | 久久久www成人免费毛片麻豆| 欧美经典一区二区| 亚洲精品视频在线看| 免费av成人在线| 成人精品在线视频观看| 91在线视频18| 日韩久久精品一区| 亚洲国产精品99久久久久久久久| 亚洲美女偷拍久久| 久久国产精品99久久久久久老狼| 国产黄色精品视频| 精品视频免费看| 久久久久久久久久久久久夜| 亚洲二区视频在线| 国产成人av资源| 欧美精品一级二级三级| 亚洲人妖av一区二区| 伦理电影国产精品| 在线免费一区三区| 国产精品国产自产拍在线| 麻豆91在线看| 国产亚洲1区2区3区| av午夜精品一区二区三区| 日韩一级片在线观看| 亚洲国产精品视频| 91黄色激情网站| 国产精品女主播av| 久久99热国产| 欧美成人午夜电影| 精品一区二区日韩| 欧美一区二区大片| 日韩成人一级大片| 欧美日韩一区不卡| 一区二区三区四区视频精品免费| 91精品国产全国免费观看| 天天操天天色综合| 欧美体内she精视频| 亚洲午夜成aⅴ人片| 欧美精品亚洲二区| 日韩高清在线不卡| 777亚洲妇女| 精品无人码麻豆乱码1区2区| 日韩女优av电影| 韩国v欧美v日本v亚洲v| 中文字幕免费一区| 成人黄页在线观看| 亚洲图片激情小说| 欧美日本在线视频| 精品亚洲欧美一区| 国产丝袜美腿一区二区三区| 国产sm精品调教视频网站| 国产精品欧美综合在线| 91精品91久久久中77777| 日本在线不卡一区| 久久影院电视剧免费观看| 99久久夜色精品国产网站| 夜色激情一区二区| 日韩视频一区在线观看| 大桥未久av一区二区三区中文| 亚洲女性喷水在线观看一区| 7777精品久久久大香线蕉| 国产麻豆精品95视频| 人人爽香蕉精品| 国产精品久久久久一区二区三区共| 欧美午夜精品一区二区三区| 国内不卡的二区三区中文字幕| 亚洲婷婷综合色高清在线| 精品国产乱码久久久久久牛牛| 99久久精品免费| 国产精品一二三四| 午夜电影网亚洲视频| 国产午夜精品在线观看| 欧美肥妇bbw| 成人永久aaa| 国产精品香蕉一区二区三区| 亚洲一区二区三区四区五区黄| 久久影院午夜论| 日韩一区二区不卡| 91成人在线观看喷潮| 不卡视频一二三| 国产乱国产乱300精品| 亚洲小说欧美激情另类| 欧美激情中文不卡| 久久女同精品一区二区| www国产成人| 久久午夜电影网| 久久综合九色综合欧美98| 日韩你懂的电影在线观看| 91精品在线观看入口| 欧美日韩一区二区三区四区 | 亚洲精品日韩专区silk|