Hi all,
I am adding PWM to light switch server . I added success. PWM function run OK. I use PWM1,PWM2 with Timer 1 and Timer 3 and PWM library example .If I call function PWM in int main , it run OK . But if I call function PWM in set_cb (function for receiver data from client light switch model) it dont run , call back function of PWM not called . This is my PWM.c
#include "pwm.h"
#include "nrf.h"
#include "app_error.h"
#include "nrf_delay.h"
#include "app_pwm.h"
APP_PWM_INSTANCE(PWM1,1);
APP_PWM_INSTANCE(PWM2,3);
static volatile bool ready_flag1 = true; // A flag indicating PWM status.
static volatile bool ready_flag2 = true;
void pwm1_ready_callback(uint32_t pwm_id) // PWM callback function
{
ready_flag1 = true;
}
void pwm2_ready_callback(uint32_t pwm_id) // PWM callback function
{
ready_flag2 = true;
}
void PWM_Init(void)
{
app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_2CH(2000L, R_PIN, G_PIN);
app_pwm_config_t pwm2_cfg = APP_PWM_DEFAULT_CONFIG_2CH(2000L, B_PIN, D_PIN);
pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
pwm2_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
ret_code_t err_code;
err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm1_ready_callback);
err_code = app_pwm_init(&PWM2,&pwm2_cfg,pwm2_ready_callback);
APP_ERROR_CHECK(err_code);
app_pwm_enable(&PWM1);
app_pwm_enable(&PWM2);
}
void setRGB(uint8_t* rgb_value)
{
ready_flag1 = false;
ready_flag2 = false;
APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 0, *rgb_value));
while(!ready_flag1);
APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 1, *(rgb_value+1)));
while(!ready_flag1);
APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM2, 0, *(rgb_value+2)));
while(!ready_flag2);
}
void setD(uint8_t d_value)
{
ready_flag2 = false;
APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM2, 1, d_value));
while (!ready_flag2);
}
this set_cb function :
static bool set_cb(const simple_message_server_t * p_server, nrf_mesh_address_t src, nrf_mesh_address_t dst,uint8_t *data, uint8_t length) // event data receivered from provioner
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Set_cb event.\n");
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Got data :\n");
for(int i=0;i<length;i++)
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, " 0x%02x\n",data[i]);
}
if(data[0]==0)
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Set to DIM Mode.\n");
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Set DIM Value = %d.\n",data[1]);
setD(data[1]); // -> not run
}
else if(data[0]==0x01)
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Set to RGB Mode.\n");
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Set RGB Value = R: %d--G: %d--B: %d.\n",data[1],data[2],data[3]);
setRGB(&data[1]); // -> not run
}
else
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Unknown Mode.\n");
setD(0);
setRGB(&RGB[0]);
}
}
pls, show me advise . Thank !!!