int mon_calibrate(int argc, char **argv){ int on_time, off_time; //check if we should stop calibration mode if(argc==2){ if(strcmp(argv[1],"stop")==0){ printf("stopping calibration mode\n"); wemo_config.calibrate = false; //disable the calibration PWM pwm_channel_disable_interrupt(PWM,CAL_PWM_CHANNEL,CAL_PWM_CHANNEL); pwm_channel_disable(PWM,CAL_PWM_CHANNEL); //save the new config fs_write_config(); return 0; } else { printf("usage: specify [stop] or [start # #]\n"); } return -1; } //make sure there are enough params to start if(argc!=4 || (strcmp(argv[1],"start")!=0)){ printf("usage: specify [stop] or \n"); printf("\t [start on_time off_time] in ms\n"); return -1; } //parse the on_time and off_time params on_time = atoi(argv[2]); off_time = atoi(argv[3]); //make sure these times are valid if(on_time<MIN_CAL_TIME || off_time<MIN_CAL_TIME){ printf("times must be >= %d\n",MIN_CAL_TIME); return -1; } //stop data collection wemo_config.collect_data = false; //setup calibration parameters wemo_config.calibrate = true; wemo_config.cal_on_time = on_time; wemo_config.cal_off_time = off_time; //start the calibration PWM pwm_channel_enable_interrupt(PWM,CAL_PWM_CHANNEL,CAL_PWM_CHANNEL); pwm_channel_enable(PWM,CAL_PWM_CHANNEL); //save the new config fs_write_config(); return 0; }
void monitor(void){ uint32_t prev_tick=0; //allocate memory for buffers and flush them cmd_buf = membag_alloc(CMD_BUF_SIZE); if(!cmd_buf) core_panic(); memset(cmd_buf,0x0,CMD_BUF_SIZE); //initialize the power packet buffers tx_pkt = &power_pkts[0]; cur_pkt = &power_pkts[1]; //both are empty tx_pkt->status = POWER_PKT_EMPTY; cur_pkt->status = POWER_PKT_EMPTY; //initialize runtime configs wemo_config.echo = false; wemo_config.debug_level = DEBUG_ERROR; wemo_config.collect_data = true; //collect power data //check if we are on USB if(gpio_pin_is_high(VBUS_PIN)){ rgb_led_set(LED_LT_BLUE,0); //don't start wifi because we are configuring b_wifi_enabled=false; //don't collect power data wemo_config.collect_data = false; } //check if the plug is in calibrate mode if(wemo_config.calibrate){ //start the calibration PWM pwm_channel_enable_interrupt(PWM,CAL_PWM_CHANNEL,CAL_PWM_CHANNEL); pwm_channel_enable(PWM,CAL_PWM_CHANNEL); //don't start wifi because we are in calibration mode b_wifi_enabled=false; wemo_config.standalone = true; wemo_config.collect_data = false; //indicate cal mode with a purple LED rgb_led_set(LED_PURPLE,0); } //check if reset is pressed if(gpio_pin_is_low(BUTTON_PIN)){ //erase the configs memset(wemo_config.nilm_id,0x0,MAX_CONFIG_LEN); memset(wemo_config.nilm_ip_addr,0x0,MAX_CONFIG_LEN); memset(wemo_config.wifi_ssid,0x0,MAX_CONFIG_LEN); memset(wemo_config.wifi_pwd,0x0,MAX_CONFIG_LEN); //save the erased config fs_write_config(); core_log("erased config"); //erase the stored data //spin until button is released rgb_led_set(LED_ORANGE,500); while(gpio_pin_is_low(BUTTON_PIN)); rgb_led_set(LED_ORANGE,0); //disable blink } //setup WIFI if(b_wifi_enabled){ if(wifi_init()!=0){ rgb_led_set(LED_PURPLE,0); } else{ //good to go! turn light green rgb_led_set(LED_LT_GREEN,0); } } //initialize the wifi_rx buffer and flag wifi_rx_buf_full = false; memset(wifi_rx_buf,0x0,WIFI_RX_BUF_SIZE); while (1) { //***** SYS TICK ACTIONS ****** if(sys_tick!=prev_tick){ //check if there is a valid wemo sample if(wemo_sample.valid==true && wemo_config.collect_data){ core_log_power_data(&wemo_sample); } wemo_read_power(); wdt_restart(WDT); prev_tick = sys_tick; } //check for pending data from the Internet if(wifi_rx_buf_full){ core_process_wifi_data(); wifi_rx_buf_full=false; } //see if we have any commands to run if(cmd_buf_full){ runcmd(cmd_buf); // run it //clear the buffer cmd_buf_idx = 0; memset(cmd_buf,0x0,CMD_BUF_SIZE); if(wemo_config.echo) printf("\r> "); //print the prompt cmd_buf_full=false; } } }
/** * \brief Application entry point for PWM with LED example. * Output PWM waves on LEDs to make them fade in and out. * * \return Unused (ANSI-C compatibility). */ int main(void) { /* Initialize the SAM system */ sysclk_init(); board_init(); /* Configure the console uart for debug information */ configure_console(); /* Output example information */ puts(STRING_HEADER); /* Enable PWM peripheral clock */ #if (SAMV70 || SAMV71 || SAME70 || SAMS70) pmc_enable_periph_clk(ID_PWM0); #else pmc_enable_periph_clk(ID_PWM); #endif /* Disable PWM channels for LEDs */ #if (SAMV70 || SAMV71 || SAME70 || SAMS70) pwm_channel_disable(PWM0, PIN_PWM_LED0_CHANNEL); pwm_channel_disable(PWM0, PIN_PWM_LED1_CHANNEL); #else pwm_channel_disable(PWM, PIN_PWM_LED0_CHANNEL); pwm_channel_disable(PWM, PIN_PWM_LED1_CHANNEL); #endif /* Set PWM clock A as PWM_FREQUENCY*PERIOD_VALUE (clock B is not used) */ pwm_clock_t clock_setting = { .ul_clka = PWM_FREQUENCY * PERIOD_VALUE, .ul_clkb = 0, .ul_mck = sysclk_get_cpu_hz() }; #if (SAMV70 || SAMV71 || SAME70 || SAMS70) pwm_init(PWM0, &clock_setting); #else pwm_init(PWM, &clock_setting); #endif /* Initialize PWM channel for LED0 */ /* Period is left-aligned */ g_pwm_channel_led.alignment = PWM_ALIGN_LEFT; /* Output waveform starts at a low level */ g_pwm_channel_led.polarity = PWM_LOW; /* Use PWM clock A as source clock */ g_pwm_channel_led.ul_prescaler = PWM_CMR_CPRE_CLKA; /* Period value of output waveform */ g_pwm_channel_led.ul_period = PERIOD_VALUE; /* Duty cycle value of output waveform */ g_pwm_channel_led.ul_duty = INIT_DUTY_VALUE; g_pwm_channel_led.channel = PIN_PWM_LED0_CHANNEL; #if (SAMV70 || SAMV71 || SAME70 || SAMS70) pwm_channel_init(PWM0, &g_pwm_channel_led); #else pwm_channel_init(PWM, &g_pwm_channel_led); #endif /* Enable channel counter event interrupt */ #if (SAMV70 || SAMV71 || SAME70 || SAMS70) pwm_channel_enable_interrupt(PWM0, PIN_PWM_LED0_CHANNEL, 0); #else pwm_channel_enable_interrupt(PWM, PIN_PWM_LED0_CHANNEL, 0); #endif /* Initialize PWM channel for LED1 */ /* Period is center-aligned */ g_pwm_channel_led.alignment = PWM_ALIGN_CENTER; /* Output waveform starts at a high level */ g_pwm_channel_led.polarity = PWM_HIGH; /* Use PWM clock A as source clock */ g_pwm_channel_led.ul_prescaler = PWM_CMR_CPRE_CLKA; /* Period value of output waveform */ g_pwm_channel_led.ul_period = PERIOD_VALUE; /* Duty cycle value of output waveform */ g_pwm_channel_led.ul_duty = INIT_DUTY_VALUE; g_pwm_channel_led.channel = PIN_PWM_LED1_CHANNEL; #if (SAMV70 || SAMV71 || SAME70 || SAMS70) pwm_channel_init(PWM0, &g_pwm_channel_led); /* Disable channel counter event interrupt */ pwm_channel_disable_interrupt(PWM0, PIN_PWM_LED1_CHANNEL, 0); #else pwm_channel_init(PWM, &g_pwm_channel_led); /* Disable channel counter event interrupt */ pwm_channel_disable_interrupt(PWM, PIN_PWM_LED1_CHANNEL, 0); #endif /* Configure interrupt and enable PWM interrupt */ #if (SAMV70 || SAMV71 || SAME70 || SAMS70) NVIC_DisableIRQ(PWM0_IRQn); NVIC_ClearPendingIRQ(PWM0_IRQn); NVIC_SetPriority(PWM0_IRQn, 0); NVIC_EnableIRQ(PWM0_IRQn); /* Enable PWM channels for LEDs */ pwm_channel_enable(PWM0, PIN_PWM_LED0_CHANNEL); pwm_channel_enable(PWM0, PIN_PWM_LED1_CHANNEL); #else NVIC_DisableIRQ(PWM_IRQn); NVIC_ClearPendingIRQ(PWM_IRQn); NVIC_SetPriority(PWM_IRQn, 0); NVIC_EnableIRQ(PWM_IRQn); /* Enable PWM channels for LEDs */ pwm_channel_enable(PWM, PIN_PWM_LED0_CHANNEL); pwm_channel_enable(PWM, PIN_PWM_LED1_CHANNEL); #endif /* Infinite loop */ while (1) { } }
void init_pwm(void) { /* Enable PWM peripheral clock */ pmc_enable_periph_clk(ID_PWM0); /* Disable PWM channels for LEDs */ pwm_channel_disable(PWM0, PIN_PWM_LED0_CHANNEL); pwm_channel_disable(PWM0, PIN_PWM_LED1_CHANNEL); /* Set PWM clock A as PWM_FREQUENCY*PERIOD_VALUE (clock B is not used) */ pwm_clock_t clock_setting = { .ul_clka = PWM_FREQUENCY * PERIOD_VALUE, .ul_clkb = 0, .ul_mck = sysclk_get_cpu_hz() }; pwm_init(PWM0, &clock_setting); /* Initialize PWM channel for LED0 */ /* Period is left-aligned */ g_pwm_channel_led.alignment = PWM_ALIGN_LEFT; /* Output waveform starts at a low level */ g_pwm_channel_led.polarity = PWM_LOW; /* Use PWM clock A as source clock */ g_pwm_channel_led.ul_prescaler = PWM_CMR_CPRE_CLKA; /* Period value of output waveform */ g_pwm_channel_led.ul_period = PERIOD_VALUE; /* Duty cycle value of output waveform */ g_pwm_channel_led.ul_duty = INIT_DUTY_VALUE; g_pwm_channel_led.channel = PIN_PWM_LED0_CHANNEL; pwm_channel_init(PWM0, &g_pwm_channel_led); /* Enable channel counter event interrupt */ pwm_channel_enable_interrupt(PWM0, PIN_PWM_LED0_CHANNEL, 0); /* Initialize PWM channel for LED1 */ /* Period is center-aligned */ g_pwm_channel_led.alignment = PWM_ALIGN_CENTER; /* Output waveform starts at a high level */ g_pwm_channel_led.polarity = PWM_HIGH; /* Use PWM clock A as source clock */ g_pwm_channel_led.ul_prescaler = PWM_CMR_CPRE_CLKA; /* Period value of output waveform */ g_pwm_channel_led.ul_period = PERIOD_VALUE; /* Duty cycle value of output waveform */ g_pwm_channel_led.ul_duty = INIT_DUTY_VALUE; g_pwm_channel_led.channel = PIN_PWM_LED1_CHANNEL; pwm_channel_init(PWM0, &g_pwm_channel_led); /* Disable channel counter event interrupt */ pwm_channel_disable_interrupt(PWM0, PIN_PWM_LED1_CHANNEL, 0); /* Configure interrupt and enable PWM interrupt */ NVIC_DisableIRQ(PWM0_IRQn); NVIC_ClearPendingIRQ(PWM0_IRQn); NVIC_SetPriority(PWM0_IRQn, 0); NVIC_EnableIRQ(PWM0_IRQn); /* Enable PWM channels for LEDs */ pwm_channel_enable(PWM0, PIN_PWM_LED0_CHANNEL); //jsi 15feb16 pwm_channel_enable(PWM0, PIN_PWM_LED1_CHANNEL); }