wiced_result_t gpio_keypad_enable( gpio_keypad_t* keypad, wiced_worker_thread_t* thread, gpio_keypad_handler_t function, uint32_t held_event_interval_ms, uint32_t total_keys, const gpio_key_t* key_list ) { gpio_key_internal_t* key_internal; uint32_t malloc_size; uint32_t i; if ( !keypad || !thread || !function || !total_keys || !key_list ) { return WICED_BADARG; } malloc_size = sizeof(gpio_keypad_internal_t) + total_keys * sizeof(gpio_key_internal_t); keypad->internal = (gpio_keypad_internal_t*) malloc_named("key internal", malloc_size); if ( !keypad->internal ) { return WICED_ERROR; } memset( keypad->internal, 0, sizeof( *( keypad->internal ) ) ); key_internal = (gpio_key_internal_t*)((uint8_t*)keypad->internal + sizeof(gpio_keypad_internal_t)); keypad->internal->function = function; keypad->internal->thread = thread; keypad->internal->total_keys = total_keys; keypad->internal->key_list = (gpio_key_t*)key_list; wiced_rtos_init_timer( &keypad->internal->check_state_timer, held_event_interval_ms, check_state_timer_handler, (void*) keypad->internal ); for ( i = 0; i < total_keys; i++ ) { wiced_gpio_irq_trigger_t trigger = ( key_list[i].polarity == KEY_POLARITY_HIGH ) ? IRQ_TRIGGER_FALLING_EDGE : IRQ_TRIGGER_RISING_EDGE; key_internal[i].key = (gpio_key_t*)&key_list[i]; key_internal[i].owner = keypad->internal; key_internal[i].last_irq_timestamp = 0; wiced_gpio_init( key_list[i].gpio, ( ( key_list[i].polarity == KEY_POLARITY_HIGH ) ? INPUT_PULL_UP : INPUT_PULL_DOWN ) ); wiced_gpio_input_irq_enable( key_list[i].gpio, trigger, gpio_interrupt_key_handler, (void*)&key_internal[i] ); } return WICED_SUCCESS; }
wiced_result_t spi_master_init( spi_master_t* master, const wiced_spi_device_t* device, wiced_gpio_t data_ready_pin, spi_master_data_ready_callback_t data_ready_callback ) { wiced_result_t result; if ( master == NULL || device == NULL ) { return WICED_BADARG; } master->device = device; master->in_transaction = WICED_FALSE; master->data_ready_pin = data_ready_pin; master->data_ready_callback = data_ready_callback; /* Init data ready semaphore */ result = wiced_rtos_init_semaphore( &master->data_ready_semaphore ); if ( result != WICED_SUCCESS ) { return result; } /* Init ready pin interrupt */ result = wiced_gpio_init( data_ready_pin, INPUT_PULL_UP ); if ( result != WICED_SUCCESS ) { return result; } result = wiced_gpio_input_irq_enable( data_ready_pin, IRQ_TRIGGER_BOTH_EDGES, spi_slave_ready_pin_irq_handler, (void*)master ); if ( result != WICED_SUCCESS ) { return result; } /* Init SPI master on the master CPU */ result = wiced_spi_init( master->device ); if ( result != WICED_SUCCESS ) { return result; } return WICED_SUCCESS; }
/****************************************************** * Function Definitions ******************************************************/ void application_start( void ) { wiced_result_t ret = WICED_SUCCESS; uint32_t connection_retries = 0; uint32_t retries = 0; ret = aws_app_init( &app_info ); wiced_gpio_input_irq_enable( WICED_BUTTON1, IRQ_TRIGGER_RISING_EDGE, publish_callback, NULL ); do { ret = aws_mqtt_conn_open( app_info.mqtt_object, mqtt_connection_event_cb ); connection_retries++ ; } while ( ( ret != WICED_SUCCESS ) && ( connection_retries < WICED_MQTT_CONNECTION_NUMBER_OF_RETRIES ) ); aws_mqtt_app_publish( app_info.mqtt_object, WICED_MQTT_QOS_DELIVER_AT_LEAST_ONCE, (uint8_t*) app_info.shadow_state_topic, (uint8_t*) SHADOW_PUBLISH_MESSAGE_STR_OFF_DESIRED_AND_REPORTED, sizeof( SHADOW_PUBLISH_MESSAGE_STR_OFF_DESIRED_AND_REPORTED ) ); wiced_rtos_delay_milliseconds( MQTT_DELAY_IN_MILLISECONDS * 2 ); aws_mqtt_app_subscribe( app_info.mqtt_object, app_info.shadow_delta_topic, WICED_MQTT_QOS_DELIVER_AT_LEAST_ONCE ); do { ret = aws_mqtt_app_subscribe( app_info.mqtt_object, app_info.thing_name, WICED_MQTT_QOS_DELIVER_AT_MOST_ONCE ); retries++ ; } while ( ( ret != WICED_SUCCESS ) && ( retries < WICED_MQTT_SUBSCRIBE_RETRY_COUNT ) ); if ( ret != WICED_SUCCESS ) { return; } while ( 1 ) { /* Wait forever on wake semaphore until the LED status is changed */ wiced_rtos_get_semaphore( &app_info.wake_semaphore, WICED_NEVER_TIMEOUT ); /* Toggle the LED */ if ( ( strncasecmp( led_status, "OFF", 3 ) == 0 ) && smart_control == 1 ) { wiced_gpio_output_low( WICED_LED1 ); led_status = "OFF"; WPRINT_APP_INFO(("[MQTT] Publishing to Thing state topic\n")); aws_mqtt_app_publish( app_info.mqtt_object, WICED_MQTT_QOS_DELIVER_AT_LEAST_ONCE, (uint8_t*) app_info.shadow_state_topic, (uint8_t*) SHADOW_PUBLISH_MESSAGE_STR_OFF_DESIRED_AND_REPORTED_STATUS_ON, sizeof( SHADOW_PUBLISH_MESSAGE_STR_OFF_DESIRED_AND_REPORTED_STATUS_ON ) ); } else if ( ( strncasecmp( led_status, "ON", 2 ) == 0 ) && smart_control == 0 ) { wiced_gpio_output_high( WICED_LED1 ); led_status = "ON"; WPRINT_APP_INFO(("[MQTT] Publishing to Thing state topic\n")); aws_mqtt_app_publish( app_info.mqtt_object, WICED_MQTT_QOS_DELIVER_AT_LEAST_ONCE, (uint8_t*) app_info.shadow_state_topic, (uint8_t*) SHADOW_PUBLISH_MESSAGE_STR_ON_DESIRED_AND_REPORTED_STATUS_OFF, sizeof( SHADOW_PUBLISH_MESSAGE_STR_ON_DESIRED_AND_REPORTED_STATUS_OFF ) ); } else if ( ( strncasecmp( led_status, "ON", 2 ) == 0 ) && smart_control == 1 ) { wiced_gpio_output_high( WICED_LED1 ); led_status = "ON"; WPRINT_APP_INFO(("[MQTT] Publishing to Thing state topic\n")); aws_mqtt_app_publish( app_info.mqtt_object, WICED_MQTT_QOS_DELIVER_AT_LEAST_ONCE, (uint8_t*) app_info.shadow_state_topic, (uint8_t*) SHADOW_PUBLISH_MESSAGE_STR_ON_DESIRED_AND_REPORTED, sizeof( SHADOW_PUBLISH_MESSAGE_STR_ON_DESIRED_AND_REPORTED ) ); } else { wiced_gpio_output_low( WICED_LED1 ); led_status = "OFF"; WPRINT_APP_INFO(("[MQTT] Publishing to Thing state topic\n")); aws_mqtt_app_publish( app_info.mqtt_object, WICED_MQTT_QOS_DELIVER_AT_LEAST_ONCE, (uint8_t*) app_info.shadow_state_topic, (uint8_t*) SHADOW_PUBLISH_MESSAGE_STR_OFF_DESIRED_AND_REPORTED, sizeof( SHADOW_PUBLISH_MESSAGE_STR_OFF_DESIRED_AND_REPORTED ) ); } } aws_mqtt_conn_close( app_info.mqtt_object ); wiced_rtos_deinit_semaphore( &app_info.msg_semaphore ); ret = wiced_mqtt_deinit( app_info.mqtt_object ); wiced_rtos_deinit_semaphore( &app_info.wake_semaphore ); free( app_info.mqtt_object ); app_info.mqtt_object = NULL; return; }