int main(void) { puts("PIR motion sensor test application\n"); printf("Initializing PIR sensor at GPIO_%ld... ", (long)PIR_GPIO); if (pir_init(&dev, PIR_GPIO) == 0) { puts("[OK]\n"); } else { puts("[Failed]"); return 1; } #if TEST_PIR_POLLING puts("Printing sensor state every second."); while (1) { printf("Status: %s\n", pir_get_status(&dev) == PIR_STATUS_LO ? "lo" : "hi"); vtimer_usleep(1000 * 1000); } #else thread_create( pir_handler_stack, sizeof(pir_handler_stack), THREAD_PRIORITY_MAIN - 1, CREATE_WOUT_YIELD | CREATE_STACKTEST, pir_handler, NULL, "pir_handler"); #endif return 0; }
static void pir_send_msg(pir_t *dev, pir_event_t event) { DEBUG("pir_send_msg\n"); msg_t m = { .type = event, .content.ptr = (char*) dev, }; int ret = msg_send_int(&m, dev->msg_thread_pid); DEBUG("pir_send_msg: msg_send_int: %i\n", ret); switch (ret) { case 0: DEBUG("pir_send_msg: msg_thread_pid not receptive, event is lost"); break; case 1: DEBUG("pir_send_msg: OK"); break; case -1: DEBUG("pir_send_msg: msg_thread_pid is gone, clearing it"); dev->msg_thread_pid = KERNEL_PID_UNDEF; break; } } static void pir_callback(void *arg) { DEBUG("pir_callback: %p\n", arg); pir_t *dev = (pir_t*) arg; if (dev->msg_thread_pid != KERNEL_PID_UNDEF) { pir_send_msg(dev, pir_get_status(dev)); } }
int main(void) { puts("PIR motion sensor test application\n"); printf("Initializing red LED at GPIO_%i... ", GPIO_LED_RED); led_red = GPIO_LED_RED; if (gpio_init_out(led_red, GPIO_NOPULL) == 0) { puts("[OK]\n"); } else { puts("[Failed]"); return 1; } gpio_clear(led_red); printf("Initializing green LED at GPIO_%i... ", GPIO_LED_GREEN); led_green = GPIO_LED_GREEN; if (gpio_init_out(led_green, GPIO_NOPULL) == 0) { puts("[OK]\n"); } else { puts("[Failed]"); return 1; } gpio_clear(led_green); printf("Initializing PIR sensor at GPIO_%i... ", PIR_GPIO); if (pir_init(&pir, PIR_GPIO) == 0) { puts("[OK]\n"); } else { puts("[Failed]"); return 1; } kernel_pid_t pir_handler_pid = thread_create( pir_handler_stack, sizeof(pir_handler_stack), PRIORITY_MAIN - 1, CREATE_WOUT_YIELD | CREATE_STACKTEST, pir_handler, NULL, "pir_handler"); #if TEST_PIR_POLLING puts("Checking sensor state every half second."); pir_event_t status_old; while (1) { pir_event_t status = pir_get_status(&pir); if (status != status_old) { msg_t m = { .type = status, .content.ptr = (void*)&pir, }; msg_send(&m, pir_handler_pid, 0); } status_old = status; vtimer_usleep(1000 * 500); } #endif return 0; }