bool SimpleDynamics::evolve(SECONDS dt) { if(!is_mobile) return false; for(int i=0;i<bodies.max_id();i++) { Body* b = (Body*)bodies.get(i); if(b) { // device moves itself Vek dp(b->velocity()); flo len = vek_dot(&dp,&dp); if(act_err) { dp.x += len*act_err*urnd(-0.5,0.5); dp.y += len*act_err*urnd(-0.5,0.5); dp.z += len*act_err*urnd(-0.5,0.5); } if (len > speed_lim*speed_lim) vek_mul(&dp,speed_lim/sqrt(len)); // limit velocity vek_mul(&dp,dt); // device is moved by walls ((SimpleBody*)b)->wall_touch = false; if (is_walls) { for (int j=0; j<N_WALLS; j++) { Vek vec(b->position()); vek_sub(&vec, &walls[j]); flo d = vek_dot(&vec, wall_normals[j]); if (d < 0.0) { vek_cpy(&vec, wall_normals[j]); vek_mul(&vec, -d * K_BOUND * dt); vek_add(&dp, &vec); ((SimpleBody*)b)->wall_touch = true; } } } // adjust the position Vek pos(b->position()); b->moved = (dp.x||dp.y||dp.z); vek_add(&pos,&dp); if(parent->volume->dimensions()==2) { pos.z=0; } // Hard floor at z=0: if the calculated pos has z < 0, reset to 0 else if(is_hard_floor && pos.z<0) { pos.z=0; b->moved=true; } b->set_position(pos.x,pos.y,pos.z); } } return true; }
bool RadioSim::try_rx() { return rx_error==0 || urnd(0,1) > rx_error; }
uint64_t get_len(){ uint64_t len = (urnd() % (4096*5))+1; return len; }
bool RadioSim::try_tx() { return tx_error==0 || urnd(0,1) > tx_error; }
uint64_t get_addr(){ uint64_t base = ((uint64_t)urnd())%4; uint64_t addr= baseranges[base] + urnd()%(4096*10); return addr; }