revert changes - raspi identified
This commit is contained in:
parent
86e7cc039b
commit
46842ab42b
11
src/Makefile
11
src/Makefile
@ -1,7 +1,7 @@
|
|||||||
SRC = util.c irmc.c cwprotocol.c beep.c
|
SRC = irmc.c cwprotocol.c beep.c
|
||||||
OBJ = ${SRC:.c=.o}
|
OBJ = ${SRC:.c=.o}
|
||||||
LDFLAGS = -lportaudio -lpthread -lm
|
LDFLAGS = -lportaudio -lpthread -lm
|
||||||
CFLAGS = -Wall -Wno-format-zero-length -Wno-unused-function
|
CFLAGS = -Wall
|
||||||
INSTALLDIR = ${HOME}/bin
|
INSTALLDIR = ${HOME}/bin
|
||||||
|
|
||||||
all: options irmc
|
all: options irmc
|
||||||
@ -27,12 +27,5 @@ java:
|
|||||||
clean:
|
clean:
|
||||||
@echo cleaning
|
@echo cleaning
|
||||||
@rm -f irmc irmc.core ${OBJ}
|
@rm -f irmc irmc.core ${OBJ}
|
||||||
|
|
||||||
linux: ${OBJ}
|
|
||||||
@echo CC -o irmc
|
|
||||||
@${CC} -o irmc ${OBJ} ${LDFLAGS} -lasound
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
install: irmc
|
install: irmc
|
||||||
cp irmc ${INSTALLDIR}
|
cp irmc ${INSTALLDIR}
|
||||||
|
128
src/beep.c
128
src/beep.c
@ -2,15 +2,16 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <unistd.h> // for usleep()
|
#include <unistd.h> // for usleep()
|
||||||
|
#include <portaudio.h>
|
||||||
#include "beep.h"
|
#include "beep.h"
|
||||||
|
|
||||||
#ifdef PORTAUDIO
|
|
||||||
// http://stackoverflow.com/questions/7678470/generating-sound-of-a-particular-frequency-using-gcc-in-ubuntu
|
// http://stackoverflow.com/questions/7678470/generating-sound-of-a-particular-frequency-using-gcc-in-ubuntu
|
||||||
|
|
||||||
static PaStream *stream;
|
static PaStream *stream;
|
||||||
static paTestData data;
|
static paTestData data;
|
||||||
|
|
||||||
|
|
||||||
/* This routine will be called by the PortAudio engine when audio is needed.
|
/* This routine will be called by the PortAudio engine when audio is needed.
|
||||||
** It may called at interrupt level on some machines so don't do anything
|
** It may called at interrupt level on some machines so don't do anything
|
||||||
** that could mess up the system like calling malloc() or free().
|
** that could mess up the system like calling malloc() or free().
|
||||||
@ -87,7 +88,7 @@ int buzzer_start(void)
|
|||||||
outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
|
outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
|
||||||
outputParameters.channelCount = 1; /* stereo output */
|
outputParameters.channelCount = 1; /* stereo output */
|
||||||
outputParameters.sampleFormat = paUInt8; /* 32 bit floating point output */
|
outputParameters.sampleFormat = paUInt8; /* 32 bit floating point output */
|
||||||
outputParameters.suggestedLatency = 30; //Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
|
outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
|
||||||
outputParameters.hostApiSpecificStreamInfo = NULL;
|
outputParameters.hostApiSpecificStreamInfo = NULL;
|
||||||
|
|
||||||
err = Pa_OpenStream(
|
err = Pa_OpenStream(
|
||||||
@ -133,18 +134,16 @@ error:
|
|||||||
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
|
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
void msleep(int d){
|
||||||
|
usleep(d*1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int beep(double freq_hz, double duration_sec)
|
int beep(double freq_hz, double duration_sec)
|
||||||
{
|
{
|
||||||
if (freq_hz > 0.0) {
|
|
||||||
buzzer_set_freq(freq_hz);
|
buzzer_set_freq(freq_hz);
|
||||||
msleep(duration_sec*1000.);
|
msleep(duration_sec*1000.);
|
||||||
buzzer_set_freq(0.);
|
buzzer_set_freq(0.);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msleep(duration_sec*1000.);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int beep_init()
|
int beep_init()
|
||||||
@ -153,102 +152,31 @@ int beep_init()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int beep_close()
|
|
||||||
{
|
|
||||||
buzzer_stop();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int beep_test(void)
|
int beep_test(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// notes frequency chart: http://www.phy.mtu.edu/~suits/notefreqs.html
|
||||||
|
|
||||||
buzzer_start();
|
buzzer_start();
|
||||||
buzzer_set_freq(261);
|
buzzer_set_freq(261);
|
||||||
|
msleep(250);
|
||||||
|
buzzer_set_freq(0);
|
||||||
|
msleep(250);
|
||||||
|
buzzer_set_freq(329);
|
||||||
|
msleep(250);
|
||||||
|
buzzer_set_freq(349);
|
||||||
|
msleep(250);
|
||||||
|
buzzer_set_freq(392);
|
||||||
|
msleep(250);
|
||||||
|
buzzer_set_freq(440);
|
||||||
|
msleep(250);
|
||||||
|
buzzer_set_freq(494);
|
||||||
|
msleep(250);
|
||||||
|
buzzer_beep(523, 200);
|
||||||
|
msleep(250);
|
||||||
|
|
||||||
buzzer_stop();
|
buzzer_stop();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Raspi does not work with portaudio?!
|
|
||||||
#ifdef ALSA
|
|
||||||
// https://www.raspberrypi.org/forums/viewtopic.php?t=84485&p=603451
|
|
||||||
|
|
||||||
static char *device = "hw:0,0"; /* playback device */
|
|
||||||
snd_output_t *output = NULL;
|
|
||||||
snd_pcm_t *handle;
|
|
||||||
|
|
||||||
int beep(double freq_hz, double duration_sec)
|
|
||||||
{
|
|
||||||
if (freq_hz <= 0.0)
|
|
||||||
{
|
|
||||||
usleep(duration_sec*1000.*1000);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
double p1,p2,f1,f2;
|
|
||||||
unsigned int i,j;
|
|
||||||
snd_pcm_sframes_t frames;
|
|
||||||
|
|
||||||
unsigned int up_count = (unsigned int)(SAMPLE_RATE*1.0 * duration_sec);
|
|
||||||
|
|
||||||
//printf(" %d %f ", up_count, duration_sec);
|
|
||||||
p1 = p2 = f1 = f2 = 0.02;//SAMPLE_RATE/freq_hz;//0.02;
|
|
||||||
i=0;
|
|
||||||
for (i = 0; i < up_count; ) {
|
|
||||||
for (j = 0; j < FRAMES*2 ; j+=2)
|
|
||||||
//for (j = 0; j < up_count*2; j+=2)
|
|
||||||
{
|
|
||||||
i += 1;
|
|
||||||
if (i<up_count)
|
|
||||||
{
|
|
||||||
buffer[j] = 1000.0 * sin(p1);
|
|
||||||
buffer[j+1] = 1000.0 * sin(p2);
|
|
||||||
p1 += f1;
|
|
||||||
p2 += f2;
|
|
||||||
}
|
|
||||||
//else
|
|
||||||
//{buffer[j]=buffer[j+1]=0.;}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
frames = snd_pcm_writei(handle, buffer, FRAMES);
|
|
||||||
|
|
||||||
if (frames < 0)
|
|
||||||
frames = snd_pcm_recover(handle, frames, 0);
|
|
||||||
if (frames < 0) {
|
|
||||||
//break;
|
|
||||||
}
|
|
||||||
if (frames > 0 && frames < FRAMES)
|
|
||||||
printf("Short write (expected %li, wrote %li)\n", FRAMES, (long)frames);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
int beep_init()
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
|
|
||||||
printf("Playback open error: %s\n", snd_strerror(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
if ((err = snd_pcm_set_params(handle,
|
|
||||||
SND_PCM_FORMAT_S16_LE,
|
|
||||||
SND_PCM_ACCESS_RW_INTERLEAVED,
|
|
||||||
2,
|
|
||||||
SAMPLE_RATE,
|
|
||||||
1,
|
|
||||||
500000)) < 0) { /* 0.5sec */
|
|
||||||
printf("Playback open error: %s\n", snd_strerror(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int beep_close()
|
|
||||||
{
|
|
||||||
snd_pcm_close(handle);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
37
src/beep.h
37
src/beep.h
@ -1,27 +1,15 @@
|
|||||||
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "portaudio.h"
|
||||||
#ifdef __MACH__
|
|
||||||
#define PORTAUDIO
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __arm__
|
|
||||||
//#define ALSA
|
|
||||||
#define PORTAUDIO
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PORTAUDIO
|
|
||||||
#include <portaudio.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NUM_SECONDS (5)
|
#define NUM_SECONDS (5)
|
||||||
#define SAMPLE_RATE (48000)
|
#define SAMPLE_RATE (44100)
|
||||||
#define FRAMES_PER_BUFFER (64)
|
#define FRAMES_PER_BUFFER (64)
|
||||||
|
|
||||||
#ifndef M_PI
|
#ifndef M_PI
|
||||||
#define M_PI (3.14159265)
|
#define M_PI (3.14159265)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PORTAUDIO
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t total_count;
|
uint32_t total_count;
|
||||||
@ -32,32 +20,13 @@ typedef struct
|
|||||||
uint32_t freq;
|
uint32_t freq;
|
||||||
} paTestData;
|
} paTestData;
|
||||||
|
|
||||||
static int patestCallback( const void *inputBuffer, void *outputBuffer,
|
|
||||||
unsigned long framesPerBuffer,
|
|
||||||
const PaStreamCallbackTimeInfo* timeInfo,
|
|
||||||
PaStreamCallbackFlags statusFlags,
|
|
||||||
void *userData );
|
|
||||||
|
|
||||||
void buzzer_set_freq(int frequency);
|
void buzzer_set_freq(int frequency);
|
||||||
void buzzer_beep(int frequency, int msecs);
|
void buzzer_beep(int frequency, int msecs);
|
||||||
int buzzer_start(void);
|
int buzzer_start(void);
|
||||||
int buzzer_stop();
|
int buzzer_stop();
|
||||||
void msleep(int d);
|
void msleep(int d);
|
||||||
int beep_test(void);
|
int beep_test(void);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ALSA
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <alsa/asoundlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#define FRAMES 32L //1024L //16384L
|
|
||||||
|
|
||||||
int16_t buffer[FRAMES*2]; /* 16bit stereo sound samples */
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// compatibility to old interface
|
// compatibility to old interface
|
||||||
int beep(double freq_hz, double duration_sec);
|
int beep(double freq_hz, double duration_sec);
|
||||||
int beep_init();
|
int beep_init();
|
||||||
int beep_close();
|
|
||||||
|
74
src/irmc.c
74
src/irmc.c
@ -15,9 +15,18 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __MACH__
|
||||||
// raspi wiring: http://raspberrypiguide.de/howtos/raspberry-pi-gpio-how-to/
|
#include <mach/clock.h>
|
||||||
|
#include <mach/mach.h>
|
||||||
|
#else
|
||||||
|
#include <linux/ioctl.h>
|
||||||
|
#include <asm-generic/ioctl.h>
|
||||||
|
#include <asm-generic/termios.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
//#define DEBUG 1
|
//#define DEBUG 1
|
||||||
|
|
||||||
@ -25,7 +34,6 @@
|
|||||||
|
|
||||||
#include "cwprotocol.h"
|
#include "cwprotocol.h"
|
||||||
#include "beep.h"
|
#include "beep.h"
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
int serial_status = 0, fd_serial, numbytes;
|
int serial_status = 0, fd_serial, numbytes;
|
||||||
|
|
||||||
@ -49,6 +57,59 @@ char last_sender[16];
|
|||||||
int translate = 1;
|
int translate = 1;
|
||||||
int audio_status = 1;
|
int audio_status = 1;
|
||||||
|
|
||||||
|
/* portable time, as listed in https://gist.github.com/jbenet/1087739 */
|
||||||
|
void current_utc_time(struct timespec *ts) {
|
||||||
|
#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
|
||||||
|
clock_serv_t cclock;
|
||||||
|
mach_timespec_t mts;
|
||||||
|
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
|
||||||
|
clock_get_time(cclock, &mts);
|
||||||
|
mach_port_deallocate(mach_task_self(), cclock);
|
||||||
|
ts->tv_sec = mts.tv_sec;
|
||||||
|
ts->tv_nsec = mts.tv_nsec;
|
||||||
|
#else
|
||||||
|
clock_gettime(CLOCK_REALTIME, ts);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* a better clock() in milliseconds */
|
||||||
|
long fastclock(void)
|
||||||
|
{
|
||||||
|
struct timespec t;
|
||||||
|
long r;
|
||||||
|
|
||||||
|
current_utc_time (&t);
|
||||||
|
r = t.tv_sec * 1000;
|
||||||
|
r = r + t.tv_nsec / 1000000;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kbhit (void)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
fd_set rdfs;
|
||||||
|
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
FD_ZERO(&rdfs);
|
||||||
|
FD_SET (STDIN_FILENO, &rdfs);
|
||||||
|
|
||||||
|
select (STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
|
||||||
|
return FD_ISSET(STDIN_FILENO, &rdfs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* get sockaddr, IPv4 or IPv6: */
|
||||||
|
void *get_in_addr(struct sockaddr *sa)
|
||||||
|
{
|
||||||
|
if (sa->sa_family == AF_INET) {
|
||||||
|
return &(((struct sockaddr_in*)sa)->sin_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return &(((struct sockaddr_in6*)sa)->sin6_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// disconnect from the server
|
// disconnect from the server
|
||||||
void inthandler(int sig)
|
void inthandler(int sig)
|
||||||
@ -60,7 +121,6 @@ void inthandler(int sig)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// main tx loop
|
|
||||||
void txloop (void)
|
void txloop (void)
|
||||||
{
|
{
|
||||||
key_press_t1 = fastclock();
|
key_press_t1 = fastclock();
|
||||||
@ -93,7 +153,7 @@ void txloop (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// screen output
|
|
||||||
void message(int msg)
|
void message(int msg)
|
||||||
{
|
{
|
||||||
switch(msg){
|
switch(msg){
|
||||||
@ -229,9 +289,7 @@ int main(int argc, char *argv[])
|
|||||||
inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),
|
inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),
|
||||||
s, sizeof s);
|
s, sizeof s);
|
||||||
fprintf(stderr, "Connected to %s.\n", s);
|
fprintf(stderr, "Connected to %s.\n", s);
|
||||||
|
|
||||||
beep_init();
|
beep_init();
|
||||||
|
|
||||||
if ((strcmp (serialport, "")) != 0)
|
if ((strcmp (serialport, "")) != 0)
|
||||||
tx_method = TX_SERIAL;
|
tx_method = TX_SERIAL;
|
||||||
|
|
||||||
@ -342,7 +400,7 @@ int main(int argc, char *argv[])
|
|||||||
send(fd_socket, &disconnect_packet, SIZE_COMMAND_PACKET, 0);
|
send(fd_socket, &disconnect_packet, SIZE_COMMAND_PACKET, 0);
|
||||||
close(fd_socket);
|
close(fd_socket);
|
||||||
close(fd_serial);
|
close(fd_serial);
|
||||||
beep_close();
|
buzzer_stop();
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
103
src/util.c
103
src/util.c
@ -1,103 +0,0 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <unistd.h> // for usleep()
|
|
||||||
|
|
||||||
|
|
||||||
// Detect OSX
|
|
||||||
#ifdef __MACH__
|
|
||||||
#include <mach/clock.h>
|
|
||||||
#include <mach/mach.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Detect Raspi
|
|
||||||
#ifdef __ARM
|
|
||||||
#include <linux/ioctl.h>
|
|
||||||
#include <asm-generic/ioctl.h>
|
|
||||||
#include <asm-generic/termios.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
/* portable time, as listed in https://gist.github.com/jbenet/1087739 */
|
|
||||||
void current_utc_time(struct timespec *ts) {
|
|
||||||
#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
|
|
||||||
clock_serv_t cclock;
|
|
||||||
mach_timespec_t mts;
|
|
||||||
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
|
|
||||||
clock_get_time(cclock, &mts);
|
|
||||||
mach_port_deallocate(mach_task_self(), cclock);
|
|
||||||
ts->tv_sec = mts.tv_sec;
|
|
||||||
ts->tv_nsec = mts.tv_nsec;
|
|
||||||
#else
|
|
||||||
clock_gettime(CLOCK_REALTIME, ts);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* a better clock() in milliseconds */
|
|
||||||
long fastclock(void)
|
|
||||||
{
|
|
||||||
struct timespec t;
|
|
||||||
long r;
|
|
||||||
|
|
||||||
current_utc_time (&t);
|
|
||||||
r = t.tv_sec * 1000;
|
|
||||||
r = r + t.tv_nsec / 1000000;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int kbhit (void)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
fd_set rdfs;
|
|
||||||
|
|
||||||
tv.tv_sec = 0;
|
|
||||||
tv.tv_usec = 0;
|
|
||||||
|
|
||||||
FD_ZERO(&rdfs);
|
|
||||||
FD_SET (STDIN_FILENO, &rdfs);
|
|
||||||
|
|
||||||
select (STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
|
|
||||||
return FD_ISSET(STDIN_FILENO, &rdfs);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* get sockaddr, IPv4 or IPv6: */
|
|
||||||
void *get_in_addr(struct sockaddr *sa)
|
|
||||||
{
|
|
||||||
if (sa->sa_family == AF_INET) {
|
|
||||||
return &(((struct sockaddr_in*)sa)->sin_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return &(((struct sockaddr_in6*)sa)->sin6_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void msleep(int d)
|
|
||||||
{
|
|
||||||
usleep(d*1000);
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
void current_utc_time(struct timespec *ts);
|
|
||||||
long fastclock(void);
|
|
||||||
int kbhit (void);
|
|
||||||
void msleep(int d);
|
|
||||||
void *get_in_addr(struct sockaddr *sa);
|
|
Loading…
Reference in New Issue
Block a user