void rx_task () { nrk_time_t t; uint16_t cnt; int8_t v; uint8_t len, i; uint8_t chan; cnt = 0; nrk_kprintf (PSTR ("Nano-RK Version ")); printf ("%d\r\n", NRK_VERSION); nrk_kprintf( PSTR( "RX Task PID=" )); printf ("%u\r\n", nrk_get_pid ()); t.secs = 5; t.nano_secs = 0; while (cal_done==0) nrk_wait_until_next_period (); chan = RADIO_CHANNEL; if (SET_MAC == 0x00) { v = read_eeprom_mac_address (&mac_address); if (v == NRK_OK) { v = read_eeprom_channel (&chan); v = read_eeprom_aes_key(aes_key); } else { while (1) { nrk_kprintf (PSTR ("* ERROR reading MAC address, run eeprom-set utility\r\n")); nrk_wait_until_next_period (); } } } else mac_address = SET_MAC; printf ("MAC ADDR: %x\r\n", mac_address & 0xffff); printf ("chan = %d\r\n", chan); len=0; for(i=0; i<16; i++ ) { len+=aes_key[i]; } printf ("AES checksum = %d\r\n", len); tdma_init (TDMA_CLIENT, chan, (mac_address)); tdma_aes_setkey(aes_key); tdma_aes_enable(); while (!tdma_started ()) nrk_wait_until_next_period (); v = tdma_tx_slot_add (mac_address&0xff); if (v != NRK_OK) nrk_kprintf (PSTR ("Could not add slot!\r\n")); // setup a software watch dog timer t.secs=30; t.nano_secs=0; nrk_sw_wdt_init(0, &t, NULL); nrk_sw_wdt_start(0); while (1) { // Update watchdog timer nrk_sw_wdt_update(0); v = tdma_recv (&rx_tdma_fd, &rx_buf, &len, TDMA_BLOCKING); if (v == NRK_OK) { // printf ("src: %u\r\nrssi: %d\r\n", rx_tdma_fd.src, rx_tdma_fd.rssi); // printf ("slot: %u\r\n", rx_tdma_fd.slot); // printf ("cycle len: %u\r\n", rx_tdma_fd.cycle_size); v=buf_to_pkt(&rx_buf, &rx_pkt); if(v==NRK_OK) { if(((rx_pkt.dst_mac&0xff) == (mac_address&0xff)) || ((rx_pkt.dst_mac&0xff)==0xff)) { if(rx_pkt.type==PING) { send_ack=1; nrk_led_clr(0); nrk_led_clr(1); if(rx_pkt.payload[0]==PING_1) { nrk_led_set(0); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_led_clr(0); } if(rx_pkt.payload[0]==PING_2) { nrk_led_set(1); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_led_clr(1); } if(rx_pkt.payload[0]==PING_PERSIST) { nrk_led_set(0); } } if(rx_pkt.type==APP) { // payload 1: Key if(rx_pkt.payload[1]==2) { send_ack=1; // payload 2: Outlet Number // payload 3: On/Off if(rx_pkt.payload[3]==0) { power_socket_disable(rx_pkt.payload[2]); plug_led_green_clr(); //printf( "Disable %d\r\n", rx_pkt.payload[2] ); } if(rx_pkt.payload[3]==1) { power_socket_enable(rx_pkt.payload[2]); //printf( "Enable %d\r\n", rx_pkt.payload[2] ); plug_led_green_set(); } } // payload 1: Key if(rx_pkt.payload[1]==3) { send_ack=1; true_power_thresh=((uint32_t)rx_pkt.payload[3])<<16 | ((uint32_t)rx_pkt.payload[4])<<8 | (uint32_t)rx_pkt.payload[5]; set_power_thresh(true_power_thresh); } } } } /* printf ("len: %u\r\npayload: ", len); for (i = 0; i < len; i++) printf ("%d ", rx_buf[i]); printf ("\r\n"); if(rx_buf[0]==(mac_address&0xff)) { if(rx_buf[2]==0) { power_socket_disable(rx_buf[1]); printf( "Disable %d\r\n", rx_buf[1] ); } if(rx_buf[2]==1) { power_socket_enable(rx_buf[1]); printf( "Enable %d\r\n", rx_buf[1] ); } } */ } tdma_rx_pkt_release(); // nrk_wait_until_next_period(); } }
void rx_task () { nrk_time_t t; uint16_t cnt; int8_t v,fd; uint8_t len, i; uint8_t chan; cnt = 0; nrk_kprintf (PSTR ("Nano-RK Version ")); printf ("%d\r\n", NRK_VERSION); printf ("RX Task PID=%u\r\n", nrk_get_pid ()); t.secs = 5; t.nano_secs = 0; chan = CHAN; if (SET_MAC == 0x00) { v = read_eeprom_mac_address (&mac_address); if (v == NRK_OK) { v = read_eeprom_channel (&chan); } else { while (1) { nrk_kprintf (PSTR ("* ERROR reading MAC address, run eeprom-set utility\r\n")); nrk_wait_until_next_period (); } } } else mac_address = SET_MAC; printf ("MAC ADDR: %x\r\n", mac_address & 0xffff); printf ("chan = %d\r\n", chan); tdma_init (TDMA_CLIENT, chan, mac_address); while (!tdma_started ()) nrk_wait_until_next_period (); // Set TDMA slot to lower byte of MAC address v = tdma_tx_slot_add (mac_address & 0xff); if (v != NRK_OK) nrk_kprintf (PSTR ("Could not add slot!\r\n")); while (1) { // Update watchdog timer // nrk_sw_wdt_update(0); v = tdma_recv (&rx_tdma_fd, &rx_buf, &len, TDMA_BLOCKING); if (v == NRK_OK) { // printf ("src: %u\r\nrssi: %d\r\n", rx_tdma_fd.src, rx_tdma_fd.rssi); // printf ("slot: %u\r\n", rx_tdma_fd.slot); // printf ("cycle len: %u\r\n", rx_tdma_fd.cycle_size); v=buf_to_pkt(&rx_buf, &rx_pkt); tdma_rx_pkt_release(); /*if((rx_pkt.dst_mac&0xff) == (mac_address&0xff)) { printf ("len: %u\r\npayload: ", len); for (i = 0; i < len; i++) printf ("%d ", rx_buf[i]); printf ("\r\n"); }*/ } // nrk_wait_until_next_period(); } }
int main (int argc, char *argv[]) { char buffer[128]; int v, cnt, i, size, socket, state; uint32_t target_mac; FF_POWER_PKT my_pwr_pkt; FF_ENV_PKT my_env_pkt; PKT_T my_pkt; time_t ts; if (argc < 3) { printf ("Usage: server port [-v]\n"); exit (1); } state = 0; verbose=0; if(argc==4) { if(strcmp(argv[3],"-v")==0) { printf( "Verbose on" ); verbose=1; } } v = slipstream_open (argv[1], atoi (argv[2]), BLOCKING); v = send_ping (); cnt = 0; while (1) { v = slipstream_receive (buffer); if (v > 0) { v = buf_to_pkt (buffer, &my_pkt); if (v == 1) { // printf ("TYPE: %d\n", my_pkt.type); // printf ("SRC MAC: %d\n", my_pkt.src_mac); // printf ("DST MAC: %d\n", my_pkt.dst_mac); // printf ("PAYLOAD LEN: %d\n", my_pkt.payload_len); // printf ("PAYLOAD: ["); // for (i = 0; i < my_pkt.payload_len; i++) // printf ("%d ", my_pkt.payload[i]); // printf ("]\n"); if(my_pkt.type==APP) { ts=time(NULL); switch(my_pkt.payload[1]) { case 1: power_unpack (my_pkt.payload, &my_pwr_pkt); if(verbose) printf( "(time,mac,total_secs,freq,v-rms,i-rms,t-pwr,energy,i-rms2,t-pwr2,energy2): %u,%x,%d,",ts,my_pkt.src_mac,my_pwr_pkt.total_secs ); else printf( "P,%u,%x,%d,",ts,my_pkt.src_mac,my_pwr_pkt.total_secs ); printf( "%u,%u,%u,%u,%lu",my_pwr_pkt.freq, my_pwr_pkt.rms_voltage,my_pwr_pkt.rms_current, my_pwr_pkt.true_power,my_pwr_pkt.long_energy); printf( ",%u,%u,%lu",my_pwr_pkt.rms_current1, my_pwr_pkt.true_power1,my_pwr_pkt.long_energy1); printf( ",%u,%u",my_pwr_pkt.v_p2p_low, my_pwr_pkt.v_p2p_high); printf( ",%u,%u",my_pwr_pkt.c_p2p_low, my_pwr_pkt.c_p2p_high); printf( ",%u,%u",my_pwr_pkt.c_p2p_low2, my_pwr_pkt.c_p2p_high2); printf( ",%u,%u,%u",my_pwr_pkt.v_center, my_pwr_pkt.c_center, my_pwr_pkt.c2_center); // printf ("%d,%d)", // ((float) my_pwr_pkt.true_power) / POWER_SCALER, // my_pwr_pkt.true_power); printf( "\n" ); break; case 3: env_unpack(my_pkt.payload, &my_env_pkt ); if(verbose) printf( "(time,mac,bat,light,temp,acc_x,acc_y,acc_z,audio_p2p,digital-temp,humidity,pressure,motion,gpio_state): %u,%x,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",ts,my_pkt.src_mac, my_env_pkt.bat, my_env_pkt.light, my_env_pkt.temp, my_env_pkt.acc_x, my_env_pkt.acc_y, my_env_pkt.acc_z, my_env_pkt.audio_p2p, my_env_pkt.digital_temp,my_env_pkt.humidity, my_env_pkt.pressure,my_env_pkt.motion,my_env_pkt.gpio_state ); else printf( "S,%u,%x,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",ts,my_pkt.src_mac, my_env_pkt.bat, my_env_pkt.light, my_env_pkt.temp, my_env_pkt.acc_x, my_env_pkt.acc_y, my_env_pkt.acc_z, my_env_pkt.audio_p2p,my_env_pkt.digital_temp,my_env_pkt.humidity, my_env_pkt.pressure, my_env_pkt.motion, my_env_pkt.gpio_state ); printf( "\n" ); break; case 4: printf("(time,mac,state): %u,%u,%u\n",ts,my_pkt.src_mac,my_pkt.payload[2] ); break; default: if(verbose) printf( "unkown pkt type (%d): ",my_pkt.payload[1] ); else printf( "U,%d,",my_pkt.payload[1] ); for(i=2; i<my_pkt.payload_len; i++ ) printf( ",%d",my_pkt.payload[i] ); printf( "\n" ); } } } } else printf ("Error reading packet\n"); // Count to 5 and then send an actuate packet /* cnt++; if (cnt > 5) { target_mac=0x04; socket=0; state=1; printf ("Sending an actuate command [mac=0x%x socket %d, state %d]\n",target_mac,socket,state); // Enable outlet 0 on node 0x01 outlet_actuate (target_mac, socket, state); cnt = 0; }*/ } }
void rx_task () { nrk_time_t t; uint16_t cnt; int8_t v; uint8_t len, i; uint8_t chan; cnt = 0; nrk_kprintf (PSTR ("Nano-RK Version ")); printf ("%d\r\n", NRK_VERSION); printf ("RX Task PID=%u\r\n", nrk_get_pid ()); t.secs = 5; t.nano_secs = 0; chan = CHAN; if (SET_MAC == 0x00) { v = read_eeprom_mac_address (&mac_address); if (v == NRK_OK) { v = read_eeprom_channel (&chan); v=read_eeprom_aes_key(aes_key); } else { while (1) { nrk_kprintf (PSTR ("* ERROR reading MAC address, run eeprom-set utility\r\n")); nrk_wait_until_next_period (); } } } else mac_address = SET_MAC; printf ("MAC ADDR: %x\r\n", mac_address & 0xffff); printf ("chan = %d\r\n", chan); len=0; for(i=0; i<16; i++ ) { len+=aes_key[i]; } printf ("AES checksum = %d\r\n", len); tdma_init (TDMA_CLIENT, chan, mac_address); tdma_aes_setkey(aes_key); tdma_aes_enable(); while (!tdma_started ()) nrk_wait_until_next_period (); // Mask off lower byte of MAC address for TDMA slot // FIXME: This should eventually be lower 2 bytes for larger TDMA cycles v = tdma_tx_slot_add (mac_address&0xFF); if (v != NRK_OK) nrk_kprintf (PSTR ("Could not add slot!\r\n")); while (1) { // Update watchdog timer // nrk_sw_wdt_update(0); v = tdma_recv (&rx_tdma_fd, &rx_buf, &len, TDMA_BLOCKING); if (v == NRK_OK) { // printf ("src: %u\r\nrssi: %d\r\n", rx_tdma_fd.src, rx_tdma_fd.rssi); // printf ("slot: %u\r\n", rx_tdma_fd.slot); // printf ("cycle len: %u\r\n", rx_tdma_fd.cycle_size); v=buf_to_pkt(&rx_buf, &rx_pkt); /* printf ("raw len: %u\r\nraw buf: ", len); for (i = 0; i < len; i++) printf ("%d ", rx_buf[i]); printf ("\r\n"); */ if(rx_pkt.type==PING && (((rx_pkt.dst_mac&0xff) == (mac_address&0xff)) || ((rx_pkt.dst_mac&0xff)==0xff))) { send_ack=1; nrk_led_clr(0); nrk_led_clr(1); if(rx_pkt.payload[0]==PING_1) { nrk_led_set(0); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_led_clr(0); } if(rx_pkt.payload[0]==PING_2) { nrk_led_set(1); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_wait_until_next_period(); nrk_led_clr(1); } if(rx_pkt.payload[0]==PING_PERSIST) { nrk_led_set(0); } } if(rx_pkt.type==NW_CONFIG && (((rx_pkt.dst_mac&0xff) == (mac_address&0xff)) || (rx_pkt.dst_mac==0xff))) { /* printf ("payload len: %u\r\npayload: ", rx_pkt.payload_len); for (i = 0; i < rx_pkt.payload_len; i++) printf ("%d ", rx_pkt.payload[i]); printf ("\r\n"); */ // Sleep control packet if(rx_pkt.payload[1]==NW_CONFIG_SLEEP) { // sleep mode off if(rx_pkt.payload[2]==0 ) { // Enter Deep Sleep deep_sleep_button(); } if(rx_pkt.payload[2]==2 ) { // Enter snooze mode tdma_disable(); nrk_wait_until_next_period(); tdma_snooze(); tdma_enable(); } } } } // nrk_wait_until_next_period(); } }
int main (int argc, char *argv[]) { char buffer[128]; int v, cnt, i, size, socket, state; uint32_t target_mac; FF_POWER_PKT my_pwr_pkt; FF_ENV_PKT my_env_pkt; FF_3PHASE_PKT my_three_phase_pkt; PKT_T my_pkt; time_t ts; uint32_t small_cnt, large_cnt; if (argc < 3) { printf ("Usage: server port [-v]\n"); exit (1); } state = 0; verbose=0; if(argc==4) { if(strcmp(argv[3],"-v")==0) { printf( "Verbose on" ); verbose=1; } } v = slipstream_open (argv[1], atoi (argv[2]), BLOCKING); v = send_ping (); cnt = 0; while (1) { v = slipstream_receive (buffer); if (v > 0) { v = buf_to_pkt (buffer, &my_pkt); //printf( "pkt: %d\n",v ); if (v == 1) { /* * printf ("TYPE: %d\n", my_pkt.type); printf ("RSSI: %u\n", my_pkt.rssi); printf ("SRC MAC: %d\n", my_pkt.src_mac); printf ("DST MAC: %d\n", my_pkt.dst_mac); printf ("PAYLOAD LEN: %d\n", my_pkt.payload_len); printf ("PAYLOAD: ["); for (i = 0; i < my_pkt.payload_len; i++) printf ("%d ", my_pkt.payload[i]); printf ("]\n"); */ if(my_pkt.type==APP) { ts=time(NULL); switch(my_pkt.payload[1]) { case 1: power_unpack (my_pkt.payload, &my_pwr_pkt); if(verbose) printf( "(time,mac,rssi,total_secs,freq,v-rms,i-rms,t-pwr,energy,i-rms2,t-pwr2,energy2): %u,%x,%u,%u,",ts,my_pkt.src_mac,my_pkt.rssi,my_pwr_pkt.total_secs ); else printf( "P,%u,%x,%u,%u,",ts,my_pkt.src_mac,my_pkt.rssi,my_pwr_pkt.total_secs ); printf( "%u,%u,%u,%u,%lu",my_pwr_pkt.freq, my_pwr_pkt.rms_voltage,my_pwr_pkt.rms_current, my_pwr_pkt.true_power,my_pwr_pkt.long_energy); printf( ",%u,%u,%lu",my_pwr_pkt.rms_current1, my_pwr_pkt.true_power1,my_pwr_pkt.long_energy1); printf( ",%u,%u",my_pwr_pkt.v_p2p_low, my_pwr_pkt.v_p2p_high); printf( ",%u,%u",my_pwr_pkt.c_p2p_low, my_pwr_pkt.c_p2p_high); printf( ",%u,%u",my_pwr_pkt.c_p2p_low2, my_pwr_pkt.c_p2p_high2); printf( ",%u,%u,%u,%u",my_pwr_pkt.v_center, my_pwr_pkt.c_center, my_pwr_pkt.c2_center, my_pwr_pkt.socket_state); // printf ("%d,%d)", // ((float) my_pwr_pkt.true_power) / POWER_SCALER, // my_pwr_pkt.true_power); printf( "\n" ); break; case 3: env_unpack(my_pkt.payload, &my_env_pkt ); if(verbose) printf( "(time,mac,rssi,bat,light,temp,acc_x,acc_y,acc_z,audio_p2p,digital-temp,humidity,pressure,motion,gpio_state): %u,%x,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",ts,my_pkt.src_mac, my_pkt.rssi,my_env_pkt.bat, my_env_pkt.light, my_env_pkt.temp, my_env_pkt.acc_x, my_env_pkt.acc_y, my_env_pkt.acc_z, my_env_pkt.audio_p2p, my_env_pkt.digital_temp,my_env_pkt.humidity, my_env_pkt.pressure,my_env_pkt.motion,my_env_pkt.gpio_state ); else printf( "S,%u,%x,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",ts,my_pkt.src_mac, my_pkt.rssi, my_env_pkt.bat, my_env_pkt.light, my_env_pkt.temp, my_env_pkt.acc_x, my_env_pkt.acc_y, my_env_pkt.acc_z, my_env_pkt.audio_p2p,my_env_pkt.digital_temp,my_env_pkt.humidity, my_env_pkt.pressure, my_env_pkt.motion, my_env_pkt.gpio_state ); printf( "\n" ); break; case 4: printf("(time,mac,rssi,state): %u,%x,%u,%u\n",ts,my_pkt.src_mac,my_pkt.rssi,my_pkt.payload[2] ); break; case 5: if(verbose) printf("(time,mac,rssi,gain): %u,%x,%u,%u\n",ts,my_pkt.src_mac,my_pkt.rssi, my_pkt.payload[2] ); else printf("B,%u,%u,%u,%u\n",ts,my_pkt.src_mac,my_pkt.rssi,my_pkt.payload[2] ); break; case 6: // Payload index 2 represents counts per minute if(verbose) printf("(time,mac,rssi,cpm): %u,%x,%u\n",ts,my_pkt.src_mac,my_pkt.rssi,my_pkt.payload[2] ); else printf("R,%u,%x,%u,%u\n",ts,my_pkt.src_mac,my_pkt.rssi,my_pkt.payload[2] ); break; case 7: // Payload index 2,3,4,5 represent a little endian value for small particles counted // Payload index 6,7,8,9 represent a little endian value for large particles counted small_cnt=my_pkt.payload[2] | my_pkt.payload[3]<<8 | my_pkt.payload[4]<<16 | my_pkt.payload[5]<<24; large_cnt=my_pkt.payload[6] | my_pkt.payload[7]<<8 | my_pkt.payload[8]<<16 | my_pkt.payload[9]<<24; if(verbose) printf("(time,mac,rssi,small_cnt,large_cnt): %u,%x,%u,%u,%u\n",ts,my_pkt.src_mac,my_pkt.rssi,small_cnt,large_cnt ); else printf("A,%u,%x,%u,%u,%u\n",ts,my_pkt.src_mac,my_pkt.rssi,small_cnt,large_cnt); break; case 8: three_phase_unpack (my_pkt.payload, &my_three_phase_pkt); if(verbose) printf( "3 Phase meter (time,mac,rssi,total_secs,period,awatthr,awatt,ava,avrms,airms,bwatt,bwatthr,bva,bvrms,birms,cwatt,cwatthr,cva,cvrms,cirms): %u,%x,%u,%u,",ts,my_pkt.src_mac,my_pkt.rssi,my_three_phase_pkt.total_secs ); else printf( "M,%u,%x,%u,%u,",ts,my_pkt.src_mac,my_pkt.rssi,my_three_phase_pkt.total_secs ); printf( "%u,%d,%d,%d,%d,%d,",my_three_phase_pkt.period, my_three_phase_pkt.awatthr,my_three_phase_pkt.awatt,my_three_phase_pkt.ava,my_three_phase_pkt.avrms,my_three_phase_pkt.airms ); printf( "%d,%d,%d,%d,%d,",my_three_phase_pkt.bwatthr,my_three_phase_pkt.bwatt,my_three_phase_pkt.bva,my_three_phase_pkt.bvrms,my_three_phase_pkt.birms ); printf( "%d,%d,%d,%d,%d",my_three_phase_pkt.cwatthr,my_three_phase_pkt.cwatt,my_three_phase_pkt.cva,my_three_phase_pkt.cvrms,my_three_phase_pkt.cirms ); printf( "\n" ); break; default: if(verbose) printf( "unkown pkt type (%d): ",my_pkt.payload[1] ); else printf( "U,%d",my_pkt.payload[1] ); for(i=2; i<my_pkt.payload_len; i++ ) printf( ",%d",my_pkt.payload[i] ); printf( "\n" ); } } } } else printf ("Error reading packet\n"); // Count to 5 and then send an actuate packet /* cnt++; if (cnt > 5) { target_mac=0x04; socket=0; state=1; printf ("Sending an actuate command [mac=0x%x socket %d, state %d]\n",target_mac,socket,state); // Enable outlet 0 on node 0x01 outlet_actuate (target_mac, socket, state); cnt = 0; }*/ } }