diff options
-rw-r--r-- | linux/Documentation/dvb/cards.txt | 4 | ||||
-rw-r--r-- | linux/drivers/media/video/saa7134/saa7134-cards.c | 5 | ||||
-rw-r--r-- | linux/drivers/media/video/saa7134/saa7134-input.c | 10 | ||||
-rw-r--r-- | linux/drivers/media/video/tveeprom.c | 9 | ||||
-rw-r--r-- | linux/include/media/tveeprom.h | 2 | ||||
-rw-r--r-- | v4l2-apps/test/ioctl-test.c | 212 | ||||
-rw-r--r-- | v4l2-apps/util/v4l2-ctl.cpp | 71 |
7 files changed, 265 insertions, 48 deletions
diff --git a/linux/Documentation/dvb/cards.txt b/linux/Documentation/dvb/cards.txt index ca58e339d..cc09187a5 100644 --- a/linux/Documentation/dvb/cards.txt +++ b/linux/Documentation/dvb/cards.txt @@ -22,10 +22,10 @@ o Frontends drivers: - ves1x93 : Alps BSRV2 (ves1893 demodulator) and dbox2 (ves1993) - cx24110 : Conexant HM1221/HM1811 (cx24110 or cx24106 demod, cx24108 PLL) - grundig_29504-491 : Grundig 29504-491 (Philips TDA8083 demodulator), tsa5522 PLL - - mt312 : Zarlink mt312 or Mitel vp310 demodulator, sl1935 or tsa5059 PLL + - mt312 : Zarlink mt312 or Mitel vp310 demodulator, sl1935 or tsa5059 PLLi, Technisat Sky2Pc with bios Rev. 2.3 - stv0299 : Alps BSRU6 (tsa5059 PLL), LG TDQB-S00x (tsa5059 PLL), LG TDQF-S001F (sl1935 PLL), Philips SU1278 (tua6100 PLL), - Philips SU1278SH (tsa5059 PLL), Samsung TBMU24112IMB + Philips SU1278SH (tsa5059 PLL), Samsung TBMU24112IMB, Technisat Sky2Pc with bios Rev. 2.6 DVB-C: - ves1820 : various (ves1820 demodulator, sp5659c or spXXXX PLL) - at76c651 : Atmel AT76c651(B) with DAT7021 PLL diff --git a/linux/drivers/media/video/saa7134/saa7134-cards.c b/linux/drivers/media/video/saa7134/saa7134-cards.c index 24faf5ad3..33beca409 100644 --- a/linux/drivers/media/video/saa7134/saa7134-cards.c +++ b/linux/drivers/media/video/saa7134/saa7134-cards.c @@ -3012,7 +3012,7 @@ struct saa7134_board saa7134_boards[] = { /* Petr Baudis <pasky@ucw.cz> */ .name = "AVerMedia TV Hybrid A16AR", .audio_clock = 0x187de7, - .tuner_type = TUNER_PHILIPS_TDA8290, /* untested */ + .tuner_type = TUNER_PHILIPS_TD1316, /* untested */ .radio_type = TUNER_TEA5767, /* untested */ .tuner_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET, @@ -3946,6 +3946,7 @@ int saa7134_board_init1(struct saa7134_dev *dev) case SAA7134_BOARD_AVERMEDIA_307: case SAA7134_BOARD_AVERMEDIA_STUDIO_507: case SAA7134_BOARD_AVERMEDIA_GO_007_FM: + case SAA7134_BOARD_AVERMEDIA_777: /* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */ case SAA7134_BOARD_VIDEOMATE_TV_PVR: case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS: @@ -3963,6 +3964,7 @@ int saa7134_board_init1(struct saa7134_dev *dev) case SAA7134_BOARD_FLYDVBT_LR301: case SAA7134_BOARD_FLYDVBTDUO: case SAA7134_BOARD_PROTEUS_2309: + case SAA7134_BOARD_AVERMEDIA_A16AR: dev->has_remote = SAA7134_REMOTE_GPIO; break; case SAA7134_BOARD_FLYDVBS_LR300: @@ -4001,7 +4003,6 @@ int saa7134_board_init1(struct saa7134_dev *dev) saa_writeb(SAA7134_GPIO_GPMODE3, 0x08); saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x00); break; - case SAA7134_BOARD_AVERMEDIA_A16AR: case SAA7134_BOARD_AVERMEDIA_CARDBUS: /* power-up tuner chip */ saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0xffffffff); diff --git a/linux/drivers/media/video/saa7134/saa7134-input.c b/linux/drivers/media/video/saa7134/saa7134-input.c index 99462db8f..c7df8d1c5 100644 --- a/linux/drivers/media/video/saa7134/saa7134-input.c +++ b/linux/drivers/media/video/saa7134/saa7134-input.c @@ -187,7 +187,6 @@ int saa7134_input_init1(struct saa7134_dev *dev) case SAA7134_BOARD_AVERMEDIA_STUDIO_307: case SAA7134_BOARD_AVERMEDIA_STUDIO_507: case SAA7134_BOARD_AVERMEDIA_GO_007_FM: - case SAA7134_BOARD_AVERMEDIA_A16AR: ir_codes = ir_codes_avermedia; mask_keycode = 0x0007C8; mask_keydown = 0x000010; @@ -196,6 +195,15 @@ int saa7134_input_init1(struct saa7134_dev *dev) saa_setb(SAA7134_GPIO_GPMODE0, 0x4); saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); break; + case SAA7134_BOARD_AVERMEDIA_777: + case SAA7134_BOARD_AVERMEDIA_A16AR: + ir_codes = ir_codes_avermedia; + mask_keycode = 0x02F200; + mask_keydown = 0x000400; + polling = 50; // ms + /* Without this we won't receive key up events */ + saa_setb(SAA7134_GPIO_GPMODE1, 0x1); + saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1); case SAA7134_BOARD_KWORLD_TERMINATOR: ir_codes = ir_codes_pixelview; mask_keycode = 0x00001f; diff --git a/linux/drivers/media/video/tveeprom.c b/linux/drivers/media/video/tveeprom.c index 2b290a731..dd06107a3 100644 --- a/linux/drivers/media/video/tveeprom.c +++ b/linux/drivers/media/video/tveeprom.c @@ -434,7 +434,7 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee, tvee->has_radio = eeprom_data[i+len-1]; /* old style tag, don't know how to detect IR presence, mark as unknown. */ - tvee->has_ir = 2; + tvee->has_ir = -1; tvee->model = eeprom_data[i+8] + (eeprom_data[i+9] << 8); @@ -657,13 +657,14 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee, STRM(decoderIC, tvee->decoder_processor), tvee->decoder_processor); } - if (tvee->has_ir == 2) + if (tvee->has_ir == -1) tveeprom_info("has %sradio\n", tvee->has_radio ? "" : "no "); else - tveeprom_info("has %sradio, has %sIR remote\n", + tveeprom_info("has %sradio, has %sIR receiver, has %sIR transmitter\n", tvee->has_radio ? "" : "no ", - tvee->has_ir ? "" : "no "); + (tvee->has_ir & 1) ? "" : "no ", + (tvee->has_ir & 2) ? "" : "no "); } EXPORT_SYMBOL(tveeprom_hauppauge_analog); diff --git a/linux/include/media/tveeprom.h b/linux/include/media/tveeprom.h index e9fc1a785..5660ea249 100644 --- a/linux/include/media/tveeprom.h +++ b/linux/include/media/tveeprom.h @@ -3,7 +3,7 @@ struct tveeprom { u32 has_radio; - u32 has_ir; /* 0: no IR, 1: IR present, 2: unknown */ + u32 has_ir; /* bit 0: IR receiver present, bit 1: IR transmitter (blaster) present. -1 == unknown */ u32 has_MAC_address; /* 0: no MAC, 1: MAC present, 2: unknown */ u32 tuner_type; diff --git a/v4l2-apps/test/ioctl-test.c b/v4l2-apps/test/ioctl-test.c index 6d78ad0f8..335ccf102 100644 --- a/v4l2-apps/test/ioctl-test.c +++ b/v4l2-apps/test/ioctl-test.c @@ -51,8 +51,9 @@ typedef u_int32_t u32; /* All possible parameters used on v4l ioctls */ union v4l_parms { int i; - unsigned long l; - u32 u_32; + unsigned long u64; + u32 u32; + v4l2_std_id id; #ifdef CONFIG_VIDEO_V4L1_COMPAT /* V4L1 structs */ @@ -148,10 +149,12 @@ int ioctls[] = { VIDIOC_ENUMAUDOUT,/* struct v4l2_audioout */ VIDIOC_ENUM_FMT,/* struct v4l2_fmtdesc */ VIDIOC_ENUMINPUT,/* struct v4l2_input */ + VIDIOC_G_INPUT,/* int */ + VIDIOC_S_INPUT,/* int */ VIDIOC_ENUMOUTPUT,/* struct v4l2_output */ VIDIOC_ENUMSTD,/* struct v4l2_standard */ -// VIDIOC_G_AUDIO_OLD,/* struct v4l2_audio */ -// VIDIOC_G_AUDOUT_OLD,/* struct v4l2_audioout */ + VIDIOC_G_STD, /*v4l2_std_id */ + VIDIOC_S_STD, /*v4l2_std_id */ VIDIOC_G_CROP,/* struct v4l2_crop */ VIDIOC_G_CTRL,/* struct v4l2_control */ VIDIOC_G_FMT,/* struct v4l2_format */ @@ -159,7 +162,6 @@ int ioctls[] = { VIDIOC_G_MODULATOR,/* struct v4l2_modulator */ VIDIOC_G_PARM,/* struct v4l2_streamparm */ VIDIOC_G_TUNER,/* struct v4l2_tuner */ -// VIDIOC_OVERLAY_OLD,/* int */ VIDIOC_QBUF,/* struct v4l2_buffer */ VIDIOC_QUERYBUF,/* struct v4l2_buffer */ VIDIOC_QUERYCTRL,/* struct v4l2_queryctrl */ @@ -172,6 +174,12 @@ int ioctls[] = { VIDIOC_S_PARM,/* struct v4l2_streamparm */ VIDIOC_TRY_FMT,/* struct v4l2_format */ +#if 0 + VIDIOC_G_AUDIO_OLD,/* struct v4l2_audio */ + VIDIOC_G_AUDOUT_OLD,/* struct v4l2_audioout */ + VIDIOC_OVERLAY_OLD,/* int */ +#endif + #ifdef INTERNAL /* V4L2 internal ioctls */ AUDC_SET_RADIO,/* no args */ @@ -201,6 +209,193 @@ int ioctls[] = { #define S_IOCTLS sizeof(ioctls)/sizeof(ioctls[0]) /********************************************************************/ + +int get_capabilities (int fd, union v4l_parms *p) +{ + int ret; + + ret=ioctl(fd,VIDIOC_QUERYCAP,(void *) &p); + if (ret>=0) { + struct v4l2_capability *pq= (struct v4l2_capability *)&p; + printf ("driver=%s, card=%s, bus=%s, version=0x%08x, " + "capabilities=0x%08x\n", + pq->driver,pq->card,pq->bus_info, + pq->version, + pq->capabilities); + } + return ret; +} + +#define ERR "*** ERROR " +#define WARN "* Warning " + +int get_set_stds (int fd, union v4l_parms *p) +{ + struct v4l2_standard *pq=(void *)p; + int ok=0,ret,i; + v4l2_std_id id; + + for (i=0; ok==0; i++) { + pq->index=i; + ok=ioctl(fd,VIDIOC_ENUMSTD,pq); + if (ok>=0) { + printf ("STANDARD: index=%d, id=%Ld, name=%s, fps=%.3f, " + "framelines=%d\n", pq->index, + (unsigned long long)pq->id, pq->name, + 1.*pq->frameperiod.denominator/pq->frameperiod.numerator, + pq->framelines); + } else + break; + id=pq->id; + p->id=id; + ret=ioctl(fd,VIDIOC_S_STD,p); + if (ret) { + printf (ERR "%i while trying to set STD to %08x\n",ret, + (unsigned int) id); + } + ret=ioctl(fd,VIDIOC_G_STD,p); + if (ret) { + printf (ERR "%i while trying to get STD id\n",ret); + } + if (id & p->id) { + if (id != p->id) { + printf (WARN "Received a std subset (%08x std) while trying to adjust to %08x\n", + (unsigned int) p->id,(unsigned int) id); + } + } else + printf (ERR "Received %08x std while trying to adjust to %08x\n", + (unsigned int) p->id,(unsigned int) id); + + } + return ok; +} + +int get_set_inputs (int fd, union v4l_parms *arg) +{ + struct v4l2_input *p=(void *)arg; + int ok=0,ret,i; + int input; + + for (i=0; ok==0; i++) { + p->index=i; + ok=ioctl(fd,VIDIOC_ENUMINPUT,p); + if (ok>=0) { + + printf ("INPUT: index=%d, name=%s, type=%d, audioset=%d, " + "tuner=%d, std=%08x, status=%d\n", + p->index,p->name,p->type,p->audioset, + p->tuner, + (unsigned int)p->std, + p->status); + + } else + break; + input=p->index; + arg->i=input; + ret=ioctl(fd,VIDIOC_S_INPUT,arg); + if (ret) { + printf (ERR "%i while trying to set INPUT to %d\n",ret, + input); + } + ret=ioctl(fd,VIDIOC_G_INPUT,arg); + if (ret) { + printf (ERR "%i while trying to get INPUT id\n",ret); + } + if (input != arg->i) { + printf ("Input is different than expected (received %i, set %i)\n", + input, p->index); + } + } + return ok; +} + +int get_set_formats (int fd, union v4l_parms *arg) +{ + struct v4l2_fmtdesc *p=(void *)arg; + int ok=0,ret,i; + struct v4l2_format fmt; + struct v4l2_streamparm parm; + struct v4l2_captureparm *c; + + + for (i=0; ok==0; i++) { + p->index=i; + p->type=V4L2_BUF_TYPE_VIDEO_CAPTURE; + + ok=ioctl(fd,VIDIOC_ENUM_FMT,p); + if (ok>=0) { + printf ("FORMAT: index=%d, type=%d, flags=%d, description=%s\n\t" + "pixelformat=0x%08x\n", + p->index, p->type, p->flags,p->description, + p->pixelformat); + } else + break; + + parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (ioctl(fd,VIDIOC_G_PARM,&parm)>=0) { + c=&parm.parm.capture; + printf ("PARM: capability=%d, capturemode=%d, frame time =%.3f ns " + "ext=%x, readbuf=%d\n", + c->capability, + c->capturemode, + 100.*c->timeperframe.numerator/c->timeperframe.denominator, + c->extendedmode, c->readbuffers); + } else + perror ("VIDIOC_G_PARM"); + +#if 0 + fmt.type=p->type; + fmt.pixelformat=p->pixelformat; + + ret=ioctl(fd,VIDIOC_G_FMT,arg); + if (ret < 0) { + printf("VIDIOC_G_FMT failed\n"); + continue; + } + + switch (f->type) { + case V4L2_BUF_TYPE_VIDEO_CAPTURE: + + err = cx8800_try_fmt(dev,fh,f); + if (0 != err) + return err; + + fmt.pixelformat=p->pixelformat; + fmt. + fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat); + fh->width = f->fmt.pix.width; + fh->height = f->fmt.pix.height; + fh->vidq.field = f->fmt.pix.field; + return 0; + case V4L2_BUF_TYPE_VBI_CAPTURE: + cx8800_vbi_fmt(dev, f); + return 0; + default: + printf(WARN "format type not implemented\n"); + continue; + } + + + input=p->index; + arg->i=input; + ret=ioctl(fd,VIDIOC_S_INPUT,arg); + if (ret) { + printf (ERR "%i while trying to set INPUT to %d\n",ret, + input); + } + ret=ioctl(fd,VIDIOC_G_INPUT,arg); + if (ret) { + printf (ERR "%i while trying to get INPUT id\n",ret); + } + if (input != arg->i) { + printf ("Input is different than expected (received %i, set %i)\n", + input, p->index); + } +#endif + } + return ok; +} + int main (void) { int fd=0, ret=0; @@ -213,11 +408,18 @@ int main (void) return(-1); } + get_capabilities (fd, &p); + get_set_stds (fd, &p); + get_set_inputs (fd, &p); + get_set_formats (fd, &p); + +#if 0 for (i=0;i<S_IOCTLS;i++) { memset(&p,0,sizeof(p)); ret=ioctl(fd,ioctls[i], (void *) &p); printf("%i: ioctl=0x%08x, return=%d\n",i, ioctls[i], ret); } +#endif close (fd); diff --git a/v4l2-apps/util/v4l2-ctl.cpp b/v4l2-apps/util/v4l2-ctl.cpp index a90dd76eb..7dabb3969 100644 --- a/v4l2-apps/util/v4l2-ctl.cpp +++ b/v4l2-apps/util/v4l2-ctl.cpp @@ -51,10 +51,8 @@ In general the lower case is used to set something and the upper case is used to retrieve a setting. */ enum Option { - OptGetAudioInput = 'A', - OptSetAudioInput = 'a', - OptGetAudioOutput = 'B', - OptSetAudioOutput = 'b', + OptGetSlicedVbiFormat = 'B', + OptSetSlicedVbiFormat = 'b', OptGetCtrl = 'C', OptSetCtrl = 'c', OptSetDevice = 'd', @@ -70,8 +68,6 @@ enum Option { OptListInputs = 'n', OptGetOutput = 'O', OptSetOutput = 'o', - OptListAudioOutputs = 'Q', - OptListAudioInputs = 'q', OptGetStandard = 'S', OptSetStandard = 's', OptGetTuner = 'T', @@ -79,9 +75,7 @@ enum Option { OptGetVideoFormat = 'V', OptSetVideoFormat = 'v', - OptGetSlicedVbiFormat = 128, - OptSetSlicedVbiFormat, - OptGetSlicedVbiOutFormat, + OptGetSlicedVbiOutFormat = 128, OptSetSlicedVbiOutFormat, OptGetOverlayFormat, //OptSetOverlayFormat, TODO @@ -102,6 +96,12 @@ enum Option { OptGetSlicedVbiOutCap, OptGetVideoCrop, OptSetVideoCrop, + OptGetAudioInput, + OptSetAudioInput, + OptGetAudioOutput, + OptSetAudioOutput, + OptListAudioOutputs, + OptListAudioInputs, OptLast = 256 }; @@ -199,15 +199,18 @@ static struct option long_options[] = { static void usage(void) { printf("Usage:\n"); + printf("Common options:\n"); printf(" --all display all information available\n"); - printf(" -A, --get-audio-input\n"); - printf(" query the audio input [VIDIOC_G_AUDIO]\n"); - printf(" -a, --set-audio-input=<num>\n"); - printf(" set the audio input to <num> [VIDIOC_S_AUDIO]\n"); - printf(" -B, --get-audio-output\n"); - printf(" query the audio output [VIDIOC_G_AUDOUT]\n"); - printf(" -b, --set-audio-output=<num>\n"); - printf(" set the audio output to <num> [VIDIOC_S_AUDOUT]\n"); + printf(" -B, --get-fmt-sliced-vbi\n"); + printf(" query the sliced VBI capture format [VIDIOC_G_FMT]\n"); + printf(" -b, --set-fmt-sliced-vbi=<mode>\n"); + printf(" set the sliced VBI capture format to <mode> [VIDIOC_S_FMT]\n"); + printf(" <mode> is a comma separated list of:\n"); + printf(" off: turn off sliced VBI (cannot be combined with other modes)\n"); + printf(" teletext: teletext (PAL/SECAM)\n"); + printf(" cc: closed caption (NTSC)\n"); + printf(" wss: widescreen signal (PAL/SECAM)\n"); + printf(" vps: VPS (PAL/SECAM)\n"); printf(" -C, --get-ctrl=<ctrl>[,<ctrl>...]\n"); printf(" get the value of the controls [VIDIOC_G_EXT_CTRLS]\n"); printf(" -c, --set-ctrl=<ctrl>=<val>[,<ctrl>=<val>...]\n"); @@ -252,30 +255,19 @@ static void usage(void) printf(" query the video capture format [VIDIOC_G_FMT]\n"); printf(" -v, --set-fmt-video=width=<x>,height=<y>\n"); printf(" set the video capture format [VIDIOC_S_FMT]\n"); + printf(" --verbose turn on verbose ioctl error reporting.\n"); + printf("\n"); + printf("Uncommon options:\n"); printf(" --get-fmt-video-out\n"); printf(" query the video output format [VIDIOC_G_FMT]\n"); printf(" --set-fmt-video-out=width=<x>,height=<y>\n"); printf(" set the video output format [VIDIOC_S_FMT]\n"); printf(" --get-fmt-overlay\n"); printf(" query the video overlay format [VIDIOC_G_FMT]\n"); - printf(" --get-crop-video\n"); - printf(" query the video capture crop window [VIDIOC_G_CROP]\n"); - printf(" --set-crop-video=top=<x>,left=<y>,width=<w>,height=<h>\n"); - printf(" set the video capture crop window [VIDIOC_S_CROP]\n"); printf(" --get-sliced-vbi-cap\n"); printf(" query the sliced VBI capture capabilities [VIDIOC_G_SLICED_VBI_CAP]\n"); printf(" --get-sliced-vbi-out-cap\n"); printf(" query the sliced VBI output capabilities [VIDIOC_G_SLICED_VBI_CAP]\n"); - printf(" --get-fmt-sliced-vbi\n"); - printf(" query the sliced VBI capture format [VIDIOC_G_FMT]\n"); - printf(" --set-fmt-sliced-vbi=<mode>\n"); - printf(" set the sliced VBI capture format to <mode> [VIDIOC_S_FMT]\n"); - printf(" <mode> is a comma separated list of:\n"); - printf(" off: turn off sliced VBI (cannot be combined with other modes)\n"); - printf(" teletext: teletext (PAL/SECAM)\n"); - printf(" cc: closed caption (NTSC)\n"); - printf(" wss: widescreen signal (PAL/SECAM)\n"); - printf(" vps: VPS (PAL/SECAM)\n"); printf(" --get-fmt-sliced-vbi-out\n"); printf(" query the sliced VBI output format [VIDIOC_G_FMT]\n"); printf(" --set-fmt-sliced-vbi-out=<mode>\n"); @@ -288,7 +280,20 @@ static void usage(void) printf(" vps: VPS (PAL/SECAM)\n"); printf(" --get-fmt-vbi query the VBI capture format [VIDIOC_G_FMT]\n"); printf(" --get-fmt-vbi-out query the VBI output format [VIDIOC_G_FMT]\n"); - printf(" --verbose turn on verbose ioctl error reporting.\n"); + printf(" --get-crop-video\n"); + printf(" query the video capture crop window [VIDIOC_G_CROP]\n"); + printf(" --set-crop-video=top=<x>,left=<y>,width=<w>,height=<h>\n"); + printf(" set the video capture crop window [VIDIOC_S_CROP]\n"); + printf(" --get-audio-input query the audio input [VIDIOC_G_AUDIO]\n"); + printf(" --set-audio-input=<num>\n"); + printf(" set the audio input to <num> [VIDIOC_S_AUDIO]\n"); + printf(" --get-audio-output query the audio output [VIDIOC_G_AUDOUT]\n"); + printf(" --set-audio-output=<num>\n"); + printf(" set the audio output to <num> [VIDIOC_S_AUDOUT]\n"); + printf(" --list-audio-outputs\n"); + printf(" display audio outputs [VIDIOC_ENUMAUDOUT]\n"); + printf(" --list-audio-inputs\n"); + printf(" display audio inputs [VIDIOC_ENUMAUDIO]\n"); printf("\n"); printf("Expert options:\n"); printf(" --streamoff turn the stream off [VIDIOC_STREAMOFF]\n"); @@ -404,7 +409,7 @@ static std::string flags2s(unsigned val, const flag_def *def) static void print_sliced_vbi_cap(struct v4l2_sliced_vbi_cap &cap) { -// printf("\tType : %s\n", buftype2s(vfmt.type).c_str()); + printf("\tType : %s\n", buftype2s(cap.type).c_str()); printf("\tService Set : %s\n", flags2s(cap.service_set, service_def).c_str()); for (int i = 0; i < 24; i++) { |