void Card::move(int dest_x, int dest_y, bool animate) { const int steps = 100; timeout_t start_time, stop_time, mpause; // Time of end of animation get_time (&start_time); stop_time = start_time; incr_time (&stop_time, (unsigned) Option::speedup()); // Delay between steps double_to_time ((double)Option::speedup() / 1000.0 / 2.0 / (double)steps, &mpause); raise(); if (animate && Option::animation()) { int oldx = x(); int oldy = y(); int newx = dest_x; int newy = dest_y; float curx = (float) oldx; float cury = (float) oldy; for (int i = 0; i < steps; i++) { curx += ((float) (newx - oldx)) / steps; cury += ((float) (newy - oldy)) / steps; NSWindow::move((int) curx, (int) cury); XFlush(dpy); add_time (&start_time, &mpause); wait_until (&start_time); } } else { NSWindow::move(dest_x, dest_y); } XFlush(dpy); raise(); if (animate) wait_until (&stop_time); }
void ScheduleScreen::loop() { int x = getTouchX(); int y = getTouchY(); // LGSerial::put("X"); LGSerial::print(x); // LGSerial::put("Y"); LGSerial::print(y); // LGSerial::print("----"); // touch screen dimensions // if ((x<180 && x>140)) { scheduleScreenCurrentDay = (y - 6)/44; // Starts at 6px, each is 44px wide renderDays(); renderOnTime(); renderOffTime(); renderAuto(); } //off+ // bool pressed = false; if ((x>35 && x<75) && (y>255 && y<295)) { pressed = true; incr_time(device_idx, scheduleScreenCurrentDay, false, consecutive_presses); } //on+ // if ((x>90 && x<130) && (y>255 && y<295)) { pressed = true; incr_time(device_idx, scheduleScreenCurrentDay, true, consecutive_presses); } //off- // if ((x>35 && x<75) && (y>85 && y<125)) { pressed = true; decr_time(device_idx, scheduleScreenCurrentDay, false, consecutive_presses); } //on-// if ((x>90 && x<130) && (y>85 && y<125)) { pressed = true; decr_time(device_idx, scheduleScreenCurrentDay, true, consecutive_presses); } if(pressed) { consecutive_presses++; renderOnTime(); renderOffTime(); } else { consecutive_presses = 0; } // auto- // if ((x>-20 && x<20) && (y>85 && y<125)) { // No sensor found? LGDB::write_sensor_table_entry(device_idx, scheduleScreenCurrentDay, 0xFF); renderAuto(); } // auto+ // if ((x>-20 && x<20) && (y>255 && y<295)) { uint8_t currentValue = LGDB::read_sensor_table_entry(device_idx, scheduleScreenCurrentDay); uint8_t startingIdx; if(currentValue == 0xFF) startingIdx = 0; else startingIdx = currentValue+1; for(uint8_t i=startingIdx; i < sizeof(lgdb_sensor_table); i++) { uint8_t data = LGDB::read_device_table_entry(i); if(data == 1) { // Found a sensor LGDB::write_sensor_table_entry(device_idx, scheduleScreenCurrentDay, i); renderAuto(); break; } } // Otherwise, we found no applicable sensors } sleep(100); }
int main (int argc, char *argv[]) { timeout_t timeout; int timeout_ms; int accuracy_ms; soc_token soc = init_soc; soc_port port_no; char lan_name[80]; synchro_msg_t synchro_msg; soc_length length; int cr, fd; boolean read; unsigned int travel_ms; timeout_t request_time, reply_time, travel_delta; timeout_t accuracy_timeout, wait_timeout; if ( (argc != 2) && (argc != 3) && (argc != 4) ) { fprintf (stderr, "SYNTAX error : Wrong number of arguments\n"); USAGE(); exit (1); } if (argc >= 3) { timeout_ms = atoi(argv[2]); if (timeout_ms <= 0) { fprintf (stderr, "SYNTAX error : Wrong timeout value\n"); USAGE(); exit (1); } } else { timeout_ms = DEFAULT_TIMEOUT_MS; } wait_timeout.tv_sec = timeout_ms / 1000; wait_timeout.tv_usec = (timeout_ms % 1000) * 1000; if (argc == 4) { accuracy_ms = atoi(argv[3]); if (accuracy_ms <= 0) { fprintf (stderr, "SYNTAX error : Wrong accuracy value\n"); USAGE(); exit (1); } } else { accuracy_ms = DEFAULT_ACCURACY_MS; } accuracy_timeout.tv_sec = accuracy_ms / 1000; accuracy_timeout.tv_usec = (accuracy_ms % 1000) * 1000; if (soc_get_local_lan_name(lan_name, sizeof(lan_name)) != SOC_OK) { perror ("getting lan name"); exit (1); } if (soc_open(&soc, udp_socket) != SOC_OK) { perror ("opening socket"); exit (1); } port_no = atoi(argv[1]); if (port_no <= 0) { if (soc_set_dest_name_service(soc, lan_name, true, argv[1]) != SOC_OK) { perror ("setting destination service"); exit (1); } } else { if (soc_set_dest_name_port(soc, lan_name, true, port_no) != SOC_OK) { perror ("setting destination port"); exit (1); } } if (soc_get_dest_port(soc, &port_no) != SOC_OK) { perror ("getting destination port no"); exit (1); } if (soc_link_port(soc, port_no) != SOC_OK) { perror ("linking socket"); exit (1); } /* List for wait */ if (soc_get_id(soc, &fd) != SOC_OK) { perror ("getting socket id"); exit (1); } if (evt_add_fd(fd, TRUE) != WAIT_OK) { perror("Adding fd"); exit (1); } for (;;) { synchro_msg.magic_number = magic_request_value; get_time (&(synchro_msg.request_time)); cr = soc_send (soc, (soc_message) &synchro_msg, sizeof(synchro_msg)); if (cr != SOC_OK) { perror ("sending request"); exit (1); } request_time = synchro_msg.request_time; for (;;) { timeout = wait_timeout; if (evt_wait (&fd, &read, &timeout) != WAIT_OK) { perror ("waiting for event"); exit (1); } if (fd == NO_EVENT) { printf ("Timeout expired. Giving up.\n"); exit (2); } else if (fd <= 0) { /* Other non fd event */ continue; } length = sizeof (synchro_msg); cr = soc_receive (soc, (soc_message) &synchro_msg, length, FALSE); get_time (&reply_time); if ( cr == sizeof (synchro_msg) ) { if (synchro_msg.magic_number == magic_request_value) { ; } else if ( (synchro_msg.magic_number == magic_reply_value) && (synchro_msg.request_time.tv_sec == request_time.tv_sec) && (synchro_msg.request_time.tv_usec == request_time.tv_usec) ) { travel_delta = reply_time; (void) sub_time (&travel_delta, &request_time); if (comp_time(&travel_delta, &accuracy_timeout) > 0) { printf ("Insuficient accuracy. Skipping...\n"); break; } /* Compute time (reply + travel/2) and settimofday */ travel_ms = travel_delta.tv_sec * 1000; travel_ms += travel_delta.tv_usec / 1000; incr_time (&synchro_msg.server_time, travel_ms / 2); (void) sub_time (&reply_time, &synchro_msg.server_time); printf ("Synchro %ld.%06d s\n", reply_time.tv_sec, (int)reply_time.tv_usec); if (settimeofday (&synchro_msg.server_time, NULL) < 0) { perror ("settimeofday"); exit (1); } exit (0); } else { fprintf (stderr, "Error : wrong reply received"); } } else if (cr != SOC_OK) { perror ("receiving reply"); } else { fprintf (stderr, "Error : wrong reply received"); } } /* Reset dest */ if (soc_set_dest_name_port(soc, lan_name, true, port_no) != SOC_OK) { perror ("linking socket"); exit (1); } } }
/* THE MAIN */ int main (const int argc, const char * argv[]) { /* Socket data */ soc_token soc = init_soc; soc_host lan; soc_port port; int soc_fd, fd; /* Socket message */ msg_type msg; /* Times and timeouts */ timeout_t start_time, end_time, current_time; timeout_t wait_timeout; double local_time, remote_time; /* Dynamic list of server infos */ dlist list; info_type info; /* Utilities */ boolean for_read; char buff[256]; int res; char *index; /*********/ /* Start */ /*********/ /* Save prog name */ strcpy (prog, argv[0]); strcpy (prog, basename (prog)); /*******************/ /* Parse arguments */ /*******************/ /* Check args */ if (argc != 2) { error ("Invalid argument"); } /* Parse IPM address and port */ strcpy (buff, argv[1]); index = strstr (buff, ":"); if (index == NULL) { error ("Invalid argument"); } *index = '\0'; index++; if (soc_str2host (buff, &lan) != SOC_OK) { sprintf (buff, "Invalid ipm address %s", buff); error (buff); } if (soc_str2port (index, &port) != SOC_OK) { sprintf (buff, "Invalid port num %s", index); error (buff); } /**************/ /* Initialize */ /**************/ /* Init dynamic list */ dlist_init (& list, sizeof(info_type)); /* Init socket */ if (soc_open (&soc, udp_socket) != SOC_OK) { perror ("opening socket"); error ("Socket initialization failed"); } if (soc_set_dest_host_port (soc, &lan, port) != SOC_OK) { perror ("setting destination"); error ("Socket initialization failed"); } if (soc_link_port (soc, port) != SOC_OK) { perror ("linking to port"); error ("Socket initialization failed"); } if (soc_get_dest_host (soc, &lan) != SOC_OK) { perror ("getting dest lan"); error ("Socket initialization failed"); } if (soc_get_dest_port (soc, &port) != SOC_OK) { perror ("getting dest port"); error ("Socket initialization failed"); } /* Add socket to waiting point */ if (soc_get_id(soc, &soc_fd) != SOC_OK) { perror ("getting socket id"); error ("Socket initialization failed"); } if (evt_add_fd(soc_fd, TRUE) != WAIT_OK) { perror("Adding fd"); error ("Socket initialization failed"); } /* Activate signal catching */ activate_signal_handling(); /* Report starting */ buff[0]='\0'; addr_image (&lan, buff); printf ("%s mcasting at address %s on port %d.\n", prog, buff, (int) port); /* Init times */ get_time (&start_time); current_time = start_time; end_time = start_time; incr_time (&end_time, DELAY_CLIENT_MS); /* Send initial ping request */ msg.ping = TRUE; msg.time = start_time; if (soc_send (soc, (soc_message) &msg, sizeof(msg)) != SOC_OK) { perror ("sending ping"); error ("Sending ping request failed"); } /*************/ /* Main loop */ /*************/ for (;;) { /* First step is to loop until timeout */ if (wait_timeout.tv_sec != -1) { wait_timeout = end_time; res = sub_time (&wait_timeout, ¤t_time); if (res <= 0) { break; } } if (evt_wait (&fd, &for_read, &wait_timeout) != WAIT_OK) { perror ("waiting for event"); error ("Waiting for events failed"); } if (! for_read) { error ("Write event received"); } /* Termination signal */ if (fd == SIG_EVENT) { if (get_signal () == SIG_TERMINATE) { break; } } else if (fd == NO_EVENT) { /* Timeout: first step ends with a dump of servers */ if (dlist_length(&list) != 0) { dlist_rewind (&list, TRUE); for (;;) { dlist_read (&list, &info); /* Get host name if possible, else dump address */ res = soc_host_name_of (&info.host, buff, sizeof(buff)); if (res != SOC_OK) { buff[0]='\0'; addr_image (&info.host, buff); } /* Compute (Start_time + Reception_time) / 2 */ local_time = (time_to_double (&start_time) + time_to_double (&info.reception_time) ) / 2.0; remote_time = time_to_double (&info.server_time); printf ("Host %s is shifted by %4.03fs\n", buff, remote_time - local_time); /* Done when last record has been put */ if (dlist_get_pos (&list, FALSE) == 1) { break; } dlist_move (&list, TRUE); } } /* Now entering second step: infinite timeout */ wait_timeout.tv_sec = -1; wait_timeout.tv_usec = -1; printf ("%s ready.\n", prog); } else if (fd != soc_fd) { sprintf (buff, "Invalid fd %d received", fd); error (buff); } else { /* Now this is the socket, read message */ res = soc_receive (soc, (soc_message) &msg, sizeof(msg), TRUE); if (res < 0) { perror ("reading from socket"); error ("Reading message failed"); } else if (res != sizeof(msg)) { sprintf (buff, "Invalid size received, expected %d, got %d", (int)sizeof(msg), res); error (buff); } get_time (¤t_time); /* Client and server different behaviours */ if ((wait_timeout.tv_sec != -1) && !msg.ping) { /* First step: store the address and time of server, if pong */ if (soc_get_dest_host (soc, &(info.host)) != SOC_OK) { perror ("getting dest host"); error ("Getting server address failed"); } info.server_time = msg.time; info.reception_time = current_time; dlist_insert (&list, &info, TRUE); } else if ( (wait_timeout.tv_sec == -1) && msg.ping) { /* Second step: reply pong and time to ping */ msg.time = current_time; msg.ping = FALSE; if (soc_send (soc, (soc_message) &msg, sizeof(msg)) != SOC_OK) { perror ("sending pong"); error ("Sending pong request failed"); } } } } /* End of main loop */ /* Clean - Close */ dlist_delete_all (&list); (void) evt_del_fd (soc_fd, TRUE); (void) soc_close (&soc); printf ("Done.\n"); exit (0); }