static void *__map_umm(const char *name, uint32_t *size_r) { struct cobalt_memdev_stat statbuf; int fd, ret; void *addr; fd = __RT(open(name, O_RDWR)); if (fd < 0) { early_warning("cannot open RTDM device %s: %s", name, strerror(errno)); return MAP_FAILED; } ret = __RT(ioctl(fd, MEMDEV_RTIOC_STAT, &statbuf)); if (ret) { early_warning("failed getting status of %s: %s", name, strerror(errno)); return MAP_FAILED; } addr = __RT(mmap(NULL, statbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)); __RT(close(fd)); *size_r = statbuf.size; return addr; }
void cancel_fall(void) { staticCnt = 0; delayCnt = 0; //watcher_data->flag &= ~flag_sensor_transient; early_warning(false); terminate_transfer(); }
/* * Will be called once on behalf of xenomai_init(), and when * re-binding after a fork. */ static void init_bind(void) { cobalt_umm_private = map_umm(COBALT_MEMDEV_PRIVATE, &private_size); if (cobalt_umm_private == MAP_FAILED) { early_warning("cannot map private umm area: %s", strerror(errno)); early_panic("(CONFIG_DEVTMPFS_MOUNT not enabled?)"); } }
bool is_fall(void) { // LED_Light(led_blue,true); if(watcher_data->config.valid & VALID_AUTO_ALARM) { if(++delayCnt <= POSE_FALL_CONFIRM){ return false; } // LED_Light(led_blue,false); if(( watcher_data->step.activity.base.type & TYPE_STAND) == 0){ early_warning(true); // play alarm media every time, it can make some break here staticCnt++; //静止计数 if(staticCnt > POSE_FALL_STATIC) { //至此满足了摔倒的所有条件 cancel_fall(); return true; } }else { //取消报警 cancel_fall(); } } return false; }