コード例 #1
0
ファイル: slave.c プロジェクト: kemaliu/kFishTank
int main()
{
    UINT32 val;
    char c, forceClearCfg = 0;
    /* enable watchdog */
    wdt_enable(WDTO_8S);
#ifdef INCLUDE_KTANK_UART
    /* init UART */
    init_uart(9600);
    printk("\n\n\n!!!!!!!!!!ktank start!!!!!!!!!!!!!!\n\n\n");
#endif
    /* init PWM, local time */
    pwm_init();
    /* enable i2c bus, rtc need it  */
    I2C_init();
    /* init timer */
    timer_init();
    val = timebase_get();
#ifdef INCLUDE_KTANK_UART
    do{
        if(uart_poll_c((UINT8*)&c) > 0 && c == 'c'){
            forceClearCfg++;
        }
    }while(time_diff_ms(val) < 2000);
#endif
    if(forceClearCfg > 10){
        DBG_PRINT("slave force clear cfg..\n");
        EEPROM_put(EEPROM_OFS_RFAVAIL, 0xff);
    }
    local_device_info_load();
    local_device_info_show();
    if(RF_CFG_AVAL()){
        rf_init(NULL, SLAVE_MODE_NORMAL);

        rf_config(EEPROM_get(EEPROM_OFS_HOSTID), EEPROM_get(EEPROM_OFS_DEVID));
        DBG_PRINT("slave start hostid 0x%x devid 0x%x\n", 
               EEPROM_get(EEPROM_OFS_HOSTID), EEPROM_get(EEPROM_OFS_DEVID));
        nrf_enter_rx_mode();
    }else{
#if 0
        rf_init(NULL, SLAVE_MODE_WAIT_SYNC);
        DBG_PRINT("no cfg, force device id 1, host id 0xef\n");
        rf_config(0xef, 1);
        nrf_enter_rx_mode();
#else

        rf_init(NULL, SLAVE_MODE_WAIT_DISCOVER);
        rf_config(0xc0, 0x80);
        DBG_PRINT("slave start without rf cfg\n");
#endif
    }
    sei();
    while(1){
        wdt_reset();
        rf_process();
	local_device_update();
    }
}
コード例 #2
0
ファイル: server.c プロジェクト: EPLab/Eco_AccBabyMonitor
static void sendto(char *packet)
{
	connectSPITo(SPI_RF_CH1, SCK_2MHz);
	rf_config(TX);
			//BUF_RDY = 1;/**/
	rf_txPacket(packet);
			//BUF_RDY = 0;/**/

} // sendto
コード例 #3
0
ファイル: slave.c プロジェクト: kemaliu/kFishTank
void rf_process()
{
    struct rf_cmd cmd;
    UINT32 val32;
    UINT8 devId, hostId;
    INT8 ret;
    if(32 != rcvCmd(&cmd)){
        return;
    }
    switch(cmd.cmd){
      case KFISH_CMD_DISCOVER:
	if(rf_mode_get() != SLAVE_MODE_WAIT_DISCOVER)
	  break;
	memcpy(&val32, cmd.data, sizeof(UINT32));
        if(val32 == 0xffffffff){
            DBG_PRINT("devId full\n");
	    rf_mode_set(SLAVE_MODE_WAIT_DISCOVER);
            return;
        }
        for(devId = 0; devId < 0x20; devId++){
            if(((val32 >> devId) & 1) == 0)
              break;
        }
        /* printk("rcv discover from 0x%x->%x \n", cmd.srcId, cmd.destId); */
	/* printk("try devid 0x%x plane %d mode %d\n", devId, cmd.rfPlane, rf_mode_get()); */
        /* printk("list 0x%lx\n", val32); */
        rf_config(cmd.srcId, devId);
        cmd.cmd = KFISH_CMD_DISCOVER_ACK;
	val32 = val32 | (1 << devId);
	memcpy(cmd.data, &val32, sizeof(UINT32));
        sndCmd(&cmd);
	rf_mode_set(SLAVE_MODE_DISCOVER_GET);
        break;
      
      case KFISH_CMD_DEVCONFIRM: /* 4Byte dev status, 1B controlNum */
	if(rf_mode_get() != SLAVE_MODE_DISCOVER_GET)
	  break;
        hostId = cmd.srcId;
        devId = cmd.destId;
	memcpy(&val32, cmd.data, sizeof(UINT32));
	val32 |= (1 << devId);
	memcpy(cmd.data, &val32, sizeof(UINT32));
        cmd.data[4] = __local_ctrl_num; /* control number */
        cmd.cmd = KFISH_CMD_DEVCONFIRM_ACK;
        rf_mode_set(SLAVE_MODE_NORMAL);
        sndCmd(&cmd);
	printk("confirmed, use devId 0x%x\n", devId);
        if(hostId != EEPROM_get(EEPROM_OFS_HOSTID)){
            EEPROM_put(EEPROM_OFS_HOSTID, hostId);
        }
        if(devId != EEPROM_get(EEPROM_OFS_DEVID)){
            EEPROM_put(EEPROM_OFS_RFPLANE, devId);
        }
        if(0xa9 != EEPROM_get(EEPROM_OFS_RFAVAIL)){
            EEPROM_put(EEPROM_OFS_RFAVAIL, 0xa9);
        }
        break;
      default:
	ret = uartCmdLocalProcess(&cmd);
	if(CMD_PROCESS_ACK == ret){
	    DBG_PRINT("<cmd 0x%x ctrl:%d data:%x %x %x\n", 
		   cmd.cmd, cmd.ctrlId, cmd.data[0], cmd.data[1], cmd.data[2]
		  );
	    sndCmd(&cmd);	/* 合法命令,发送应答 */
	    DBG_PRINT(">cmd 0x%x ctrl %d %x %x %x\n", 
		      cmd.cmd, cmd.ctrlId, cmd.data[0], cmd.data[1], cmd.data[2]
		     );
	}else if(CMD_PROCESS_NO_ACK == ret){	/* 合法命令,但是不用应答 */
	    
	}else{			/* 不合法的命令 */
	    DBG_PRINT("illegal command\n");
	    DBG_PRINT("\tcmd 0x%x ctrlId %d", cmd.cmd, cmd.ctrlId);
	}
        break;
    }
}
コード例 #4
0
ファイル: server.c プロジェクト: EPLab/Eco_AccBabyMonitor
void main (void)
{
	//unsigned char i;
	unsigned char my_order;
	//static char		count_burst;
	init_ioport();
	spi_init();
	rf_init();
	//msp_init();
	//timer0_init();
	adc_init();
	timer0_init();
	timer0_start();


	//regCallbackFunc();

	//led_turnOn();
	BUF_RDY = 0;

	rf_config(RX);
	rf_rxOn();

/* initial blinking */
	//for(my_order=0; my_order<=MyID; my_order++)
	for(my_order=0; my_order<=1; my_order++)
	{
		led_turnOn();						
		delayms(10);
		led_turnOff();						
		delayms(1000);
	}
/**/


	for(;;)
	{
		rf_rxPacket(Buffer);

		if (Buffer[0] != MyID && Buffer[1] != MyID && Buffer[2] != MyID)
		{
			rf_rxOn();
			continue;
		}
		
		if(Buffer[0] == MyID)
			my_order = 0;
		else if(Buffer[1] == MyID)
			my_order = 1;
		else
			my_order = 2;

		Buffer[0] = Buffer[1] = Buffer[2] = -1;	// xmitdata() uses 'Buffer' to send data --> reset!

		//PWR_UP = 0;
		MSP_CS = 1;

		switch(my_order)
		{
			case 0:
				//_delay2us(150);
				_delay2us(170);	//350 us
				break;
			case 1:
				delayms(1);
				_delay2us(245);	//500 us
				//_delay2us(185);
				_delay2us(195);	//400
				break;
			case 2:
				delayms(2);
				_delay2us(245);	// 5oo us
				//_delay2us(185);
				_delay2us(205); // 420 us
				break;
		}

		timer0_stop();
		MSP_CS = 0;
		xmitdata();
		MSP_CS = 1;
		led_toggle();
		rf_config(RX);
		rf_rxOn();
		timer0_start();
		MSP_CS = 0;
	} // for
} // main