Mercurial > pt1.oyama
changeset 168:061ef2cd98f0
Code refactoring.
author | Naoya OYAMA <naoya.oyama@gmail.com> |
---|---|
date | Sun, 07 Oct 2012 00:37:10 +0900 |
parents | b21f1e823ec3 |
children | cb54f9777734 |
files | src/Makefile src/checksignal.c src/pt1_common.h src/pt1_dev.h src/recpt1.c src/recpt1ctl.c |
diffstat | 6 files changed, 28 insertions(+), 805 deletions(-) [+] |
line wrap: on
line diff
--- a/src/Makefile Sat Oct 06 21:57:42 2012 +0900 +++ b/src/Makefile Sun Oct 07 00:37:10 2012 +0900 @@ -59,16 +59,19 @@ decoder.c \ mkpath.c \ recpt1.c \ - tssplitter_lite.c + tssplitter_lite.c \ + pt1_common.c SRCS2 = \ - checksignal.c + checksignal.c \ + pt1_common.c SRCS3 = \ pt1_lnbd.c SRCS4 = \ - recpt1ctl.c + recpt1ctl.c \ + pt1_common.c LIBS2 = -lpthread -lm
--- a/src/checksignal.c Sat Oct 06 21:57:42 2012 +0900 +++ b/src/checksignal.c Sun Oct 07 00:37:10 2012 +0900 @@ -34,16 +34,11 @@ #include "pt1_dev.h" #include "tssplitter_lite.h" -#define MAX_RETRY (2) /* globals */ boolean f_exit = FALSE; boolean use_bell = FALSE; -/* prototypes */ -int tune(char *channel, thread_data *tdata, char *device); -int close_tuner(thread_data *tdata); - void cleanup(void) { @@ -97,24 +92,6 @@ pthread_create(signal_thread, NULL, process_signals, NULL); } -/* lookup frequency conversion table*/ -ISDB_T_FREQ_CONV_TABLE * -searchrecoff(char *channel) -{ - int lp; - - for(lp = 0; isdb_t_conv_table[lp].parm_freq != NULL; lp++) { - /* return entry number in the table when strings match and - * lengths are same. */ - if((memcmp(isdb_t_conv_table[lp].parm_freq, channel, - strlen(channel)) == 0) && - (strlen(channel) == strlen(isdb_t_conv_table[lp].parm_freq))) { - return &isdb_t_conv_table[lp]; - } - } - return NULL; -} - void show_usage(char *cmd) { @@ -134,256 +111,6 @@ fprintf(stderr, "--list: Show channel list\n"); } -void -show_channels(void) -{ - FILE *f; - char *home; - char buf[255], filename[255]; - - fprintf(stderr, "Available Channels:\n"); - - home = getenv("HOME"); - sprintf(filename, "%s/.recpt1-channels", home); - f = fopen(filename, "r"); - if(f) { - while(fgets(buf, 255, f)) - fprintf(stderr, "%s", buf); - fclose(f); - } - else - fprintf(stderr, "13-62: Terrestrial Channels\n"); - - fprintf(stderr, "101ch: NHK BS1\n"); - fprintf(stderr, "102ch: NHK BS2\n"); - fprintf(stderr, "103ch: NHK BShi\n"); - fprintf(stderr, "141ch: BS Nittele\n"); - fprintf(stderr, "151ch: BS Asahi\n"); - fprintf(stderr, "161ch: BS-TBS\n"); - fprintf(stderr, "171ch: BS Japan\n"); - fprintf(stderr, "181ch: BS Fuji\n"); - fprintf(stderr, "191ch: WOWOW\n"); - fprintf(stderr, "192ch: WOWOW2\n"); - fprintf(stderr, "193ch: WOWOW3\n"); - fprintf(stderr, "200ch: Star Channel\n"); - fprintf(stderr, "211ch: BS11 Digital\n"); - fprintf(stderr, "222ch: TwellV\n"); - fprintf(stderr, "C13-C63: CATV Channels\n"); - fprintf(stderr, "CS2-CS24: CS Channels\n"); -} - -float -getsignal_isdb_s(int signal) -{ - /* apply linear interpolation */ - static const float afLevelTable[] = { - 24.07f, // 00 00 0 24.07dB - 24.07f, // 10 00 4096 24.07dB - 18.61f, // 20 00 8192 18.61dB - 15.21f, // 30 00 12288 15.21dB - 12.50f, // 40 00 16384 12.50dB - 10.19f, // 50 00 20480 10.19dB - 8.140f, // 60 00 24576 8.140dB - 6.270f, // 70 00 28672 6.270dB - 4.550f, // 80 00 32768 4.550dB - 3.730f, // 88 00 34816 3.730dB - 3.630f, // 88 FF 35071 3.630dB - 2.940f, // 90 00 36864 2.940dB - 1.420f, // A0 00 40960 1.420dB - 0.000f // B0 00 45056 -0.01dB - }; - - unsigned char sigbuf[4]; - memset(sigbuf, '\0', sizeof(sigbuf)); - sigbuf[0] = (((signal & 0xFF00) >> 8) & 0XFF); - sigbuf[1] = (signal & 0xFF); - - /* calculate signal level */ - if(sigbuf[0] <= 0x10U) { - /* clipped maximum */ - return 24.07f; - } - else if (sigbuf[0] >= 0xB0U) { - /* clipped minimum */ - return 0.0f; - } - else { - /* linear interpolation */ - const float fMixRate = - (float)(((unsigned short)(sigbuf[0] & 0x0FU) << 8) | - (unsigned short)sigbuf[0]) / 4096.0f; - return afLevelTable[sigbuf[0] >> 4] * (1.0f - fMixRate) + - afLevelTable[(sigbuf[0] >> 4) + 0x01U] * fMixRate; - } -} - -void -do_bell(int bell) -{ - int i; - for(i=0; i < bell; i++) { - fprintf(stderr, "\a"); - usleep(400000); - } -} - -void -calc_cn(int fd, int type) -{ - int rc; - double P; - double CNR; - int bell = 0; - - if(ioctl(fd, GET_SIGNAL_STRENGTH, &rc) < 0) { - fprintf(stderr, "Tuner Select Error\n"); - return ; - } - - if(type == CHTYPE_GROUND) { - P = log10(5505024/(double)rc) * 10; - CNR = (0.000024 * P * P * P * P) - (0.0016 * P * P * P) + - (0.0398 * P * P) + (0.5491 * P)+3.0965; - } - else { - CNR = getsignal_isdb_s(rc); - } - - if(CNR >= 30.0) - bell = 3; - else if(CNR >= 15.0 && CNR < 30.0) - bell = 2; - else if(CNR < 15.0) - bell = 1; - - fprintf(stderr, "\rC/N = %fdB", CNR); - if(use_bell) - do_bell(bell); -} - -int -tune(char *channel, thread_data *tdata, char *device) -{ - char **tuner; - int num_devs; - int lp; - FREQUENCY freq; - - /* get channel */ - tdata->table = searchrecoff(channel); - if(tdata->table == NULL) { - fprintf(stderr, "Invalid Channel: %s\n", channel); - return 1; - } - - freq.frequencyno = tdata->table->set_freq; - freq.slot = tdata->table->add_freq; - - /* open tuner */ - /* case 1: specified tuner device */ - if(device) { - tdata->tfd = open(device, O_RDONLY); - if(tdata->tfd < 0) { - fprintf(stderr, "Cannot open tuner device: %s\n", device); - return 1; - } - - /* power on LNB */ - if(tdata->table->type == CHTYPE_SATELLITE) { - if(ioctl(tdata->tfd, LNB_ENABLE, tdata->lnb) < 0) { - fprintf(stderr, "Power on LNB failed: %s\n", device); - } - } - - /* tune to specified channel */ - while(ioctl(tdata->tfd, SET_CHANNEL, &freq) < 0) { - if(f_exit) { - close_tuner(tdata); - return 1; - } - fprintf(stderr, "No signal. Still trying: %s\n", device); - } - - fprintf(stderr, "device = %s\n", device); - strncpy(tdata->ch, channel, sizeof(tdata->ch)); - } - else { - /* case 2: loop around available devices */ - if(tdata->table->type == CHTYPE_SATELLITE) { - tuner = bsdev; - num_devs = NUM_BSDEV; - } - else { - tuner = isdb_t_dev; - num_devs = NUM_ISDB_T_DEV; - } - - for(lp = 0; lp < num_devs; lp++) { - int count = 0; - - tdata->tfd = open(tuner[lp], O_RDONLY); - if(tdata->tfd >= 0) { - /* power on LNB */ - if(tdata->table->type == CHTYPE_SATELLITE) { - if(ioctl(tdata->tfd, LNB_ENABLE, tdata->lnb) < 0) { - fprintf(stderr, "Warning: Power on LNB failed: %s\n", tuner[lp]); - } - } - - /* tune to specified channel */ - while(ioctl(tdata->tfd, SET_CHANNEL, &freq) < 0 && - count < MAX_RETRY) { - if(f_exit) { - close_tuner(tdata); - return 1; - } - fprintf(stderr, "No signal. Still trying: %s\n", tuner[lp]); - count++; - } - - if(count >= MAX_RETRY) { - close_tuner(tdata); - count = 0; - continue; - } - - fprintf(stderr, "device = %s\n", tuner[lp]); - break; /* found suitable tuner */ - } - } - - /* all tuners cannot be used */ - if(tdata->tfd < 0) { - fprintf(stderr, "Cannot tune to the specified channel\n"); - return 1; - } - else { - strncpy(tdata->ch, channel, sizeof(tdata->ch)); - } - } - - return 0; /* success */ -} - -int -close_tuner(thread_data *tdata) -{ - int rv = 0; - - if(tdata->tfd == -1) - return rv; - - if(tdata->table->type == CHTYPE_SATELLITE) { - if(ioctl(tdata->tfd, LNB_DISABLE, 0) < 0) { - rv = 1; - } - } - close(tdata->tfd); - tdata->tfd = -1; - - return rv; -} - int main(int argc, char **argv) { @@ -470,7 +197,7 @@ if(f_exit) break; /* show signal strength */ - calc_cn(tdata.tfd, tdata.table->type); + calc_cn(tdata.tfd, tdata.table->type, use_bell); sleep(1); }
--- a/src/pt1_common.h Sat Oct 06 21:57:42 2012 +0900 +++ b/src/pt1_common.h Sun Oct 07 00:37:10 2012 +0900 @@ -15,11 +15,30 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#ifndef _RECPT1_COMMON_H_ +#define _RECPT1_COMMON_H_ + +#include "pt1_dev.h" +#include "recpt1.h" + /* ipc message size */ #define MSGSZ 255 +#define ISDB_T_NODE_LIMIT 24 // 32:ARIB limit 24:program maximum +#define ISDB_T_SLOT_LIMIT 8 +#define MAX_RETRY (2) typedef struct pt1_msgbuf { long mtype; char mtext[MSGSZ]; } pt1_message_buf; +//prototaype +int tune(char *channel, thread_data *tdata, char *device); +int close_tuner(thread_data *tdata); +void show_channels(void); +ISDB_T_FREQ_CONV_TABLE *searchrecoff(char *channel); +void calc_cn(int fd, int type, boolean use_bell); +int tune(char *channel, thread_data *tdata, char *device); +int close_tuner(thread_data *tdata); + +#endif
--- a/src/pt1_dev.h Sat Oct 06 21:57:42 2012 +0900 +++ b/src/pt1_dev.h Sun Oct 07 00:37:10 2012 +0900 @@ -4,226 +4,4 @@ #define DEVICE_NAME_BASE "/dev/pt1video" -char *bsdev[NUM_BSDEV] = { - "/dev/pt1video1", - "/dev/pt1video0", - "/dev/pt1video5", - "/dev/pt1video4", - "/dev/pt1video9", - "/dev/pt1video8", - "/dev/pt1video13", - "/dev/pt1video12", - "/dev/pt3video1", - "/dev/pt3video0", - "/dev/pt3video5", - "/dev/pt3video4", - "/dev/pt3video9", - "/dev/pt3video8", - "/dev/pt3video13", - "/dev/pt3video12" -}; -char *isdb_t_dev[NUM_ISDB_T_DEV] = { - "/dev/pt1video2", - "/dev/pt1video3", - "/dev/pt1video6", - "/dev/pt1video7", - "/dev/pt1video10", - "/dev/pt1video11", - "/dev/pt1video14", - "/dev/pt1video15", - "/dev/pt3video2", - "/dev/pt3video3", - "/dev/pt3video6", - "/dev/pt3video7", - "/dev/pt3video10", - "/dev/pt3video11", - "/dev/pt3video14", - "/dev/pt3video15" -}; - -// 変換テーブル(ISDB-T用) -// 実際にioctl()を行う値の部分はREADMEを参照の事。 -// BS/CSの設定値およびスロット番号は -// http://www5e.biglobe.ne.jp/~kazu_f/digital-sat/index.htmlより取得。 -// - -ISDB_T_FREQ_CONV_TABLE isdb_t_conv_table[] = { - { 0, CHTYPE_SATELLITE, 0, "151"}, /* 151ch:BS朝日 */ - { 0, CHTYPE_SATELLITE, 1, "161"}, /* 161ch:BS-TBS */ - { 1, CHTYPE_SATELLITE, 0, "191"}, /* 191ch:WOWOW prime */ - { 1, CHTYPE_SATELLITE, 1, "171"}, /* 171ch:BSジャパン */ - { 2, CHTYPE_SATELLITE, 0, "192"}, /* 192ch:WOWOWライブ */ - { 2, CHTYPE_SATELLITE, 1, "193"}, /* 193ch:WOWOWシネマ */ - { 3, CHTYPE_SATELLITE, 0, "201"}, /* 201ch:スター・チャンネル2 */ - { 3, CHTYPE_SATELLITE, 0, "202"}, /* 202ch:スター・チャンネル3 */ - { 3, CHTYPE_SATELLITE, 1, "236"}, /* 236ch:BSアニマックス */ - { 3, CHTYPE_SATELLITE, 2, "256"}, /* 256ch:ディズニー・チャンネル */ - { 4, CHTYPE_SATELLITE, 0, "211"}, /* 211ch:BS11デジタル */ - { 4, CHTYPE_SATELLITE, 1, "200"}, /* 200ch:スター・チャンネル1 */ - { 4, CHTYPE_SATELLITE, 2, "222"}, /* 222ch:TwellV */ - { 5, CHTYPE_SATELLITE, 0, "238"}, /* 238ch:FOX bs238 */ - { 5, CHTYPE_SATELLITE, 1, "241"}, /* 241ch:BSスカパー! */ - { 5, CHTYPE_SATELLITE, 2, "231"}, /* 231ch:放送大学テレビ1 */ - { 5, CHTYPE_SATELLITE, 2, "232"}, /* 232ch:放送大学テレビ2 */ - { 5, CHTYPE_SATELLITE, 2, "233"}, /* 233ch:放送大学テレビ3 */ - { 5, CHTYPE_SATELLITE, 2, "531"}, /* 531ch:放送大学ラジオ */ - { 6, CHTYPE_SATELLITE, 0, "141"}, /* 141ch:BS日テレ */ - { 6, CHTYPE_SATELLITE, 1, "181"}, /* 181ch:BSフジ */ - { 7, CHTYPE_SATELLITE, 0, "101"}, /* 101ch:NHK-BS1 */ - { 7, CHTYPE_SATELLITE, 0, "102"}, /* 102ch:NHK-BS1臨時 */ - { 7, CHTYPE_SATELLITE, 1, "103"}, /* 103ch:NHK-BSプレミアム*/ - { 7, CHTYPE_SATELLITE, 1, "910"}, /* 910ch:ウェザーニュース(WNI)*/ - { 8, CHTYPE_SATELLITE, 2, "291"}, /* 291ch:NHK総合テレビジョン(東京)*/ - { 8, CHTYPE_SATELLITE, 2, "292"}, /* 292ch:NHK教育テレビジョン(東京)*/ - { 8, CHTYPE_SATELLITE, 1, "294"}, /* 294ch:日本テレビ */ - { 8, CHTYPE_SATELLITE, 1, "295"}, /* 295ch:テレビ朝日 */ - { 8, CHTYPE_SATELLITE, 1, "296"}, /* 296ch:TBSテレビ */ - { 8, CHTYPE_SATELLITE, 1, "297"}, /* 297ch:テレビ東京 */ - { 8, CHTYPE_SATELLITE, 2, "298"}, /* 298ch:フジテレビ */ - { 9, CHTYPE_SATELLITE, 0, "234"}, /* 234ch:グリーンチャンネル */ - { 9, CHTYPE_SATELLITE, 1, "242"}, /* 242ch:J SPORTS 1 */ - { 9, CHTYPE_SATELLITE, 2, "243"}, /* 243ch:J SPORTS 2 */ - { 10, CHTYPE_SATELLITE, 0, "252"}, /* 252ch:IMAGICA BS */ - { 10, CHTYPE_SATELLITE, 1, "244"}, /* 244ch:J SPORTS 3 */ - { 10, CHTYPE_SATELLITE, 2, "245"}, /* 245ch:J SPORTS 4 */ - { 11, CHTYPE_SATELLITE, 0, "251"}, /* 251ch:BS釣りビジョン */ - { 11, CHTYPE_SATELLITE, 1, "255"}, /* 255ch:日本映画専門チャンネル */ - { 11, CHTYPE_SATELLITE, 2, "258"}, /* 258ch:D-Life */ - { 12, CHTYPE_SATELLITE, 0, "CS2"}, /* ND2: - * 237ch:スター・チャンネル プラス - * 239ch:日本映画専門チャンネルHD - * 306ch:フジテレビNEXT */ - { 13, CHTYPE_SATELLITE, 0, "CS4"}, /* ND4: - * 100ch:e2プロモ - * 256ch:J sports ESPN - * 312ch:FOX - * 322ch:スペースシャワーTV - * 331ch:カートゥーンネットワーク - * 294ch:ホームドラマチャンネル - * 334ch:トゥーン・ディズニー */ - { 14, CHTYPE_SATELLITE, 0, "CS6"}, /* ND6: - * 221ch:東映チャンネル - * 222ch:衛星劇場 - * 223ch:チャンネルNECO - * 224ch:洋画★シネフィル・イマジカ - * 292ch:時代劇専門チャンネル - * 238ch:スター・チャンネル クラシック - * 310ch:スーパー!ドラマTV - * 311ch:AXN - * 250ch:スカイ・Asports+ */ - { 15, CHTYPE_SATELLITE, 0, "CS8"}, /* ND8: - * 055ch:ショップ チャンネル - * 335ch:キッズステーションHD */ - { 16, CHTYPE_SATELLITE, 0, "CS10"}, /* ND10: - * 228ch:ザ・シネマ - * 800ch:スカチャンHD800 - * 801ch:スカチャン801 - * 802ch:スカチャン802 */ - { 17, CHTYPE_SATELLITE, 0, "CS12"}, /* ND12: - * 260ch:ザ・ゴルフ・チャンネル - * 303ch:テレ朝チャンネル - * 323ch:MTV 324ch:大人の音楽専門TV◆ミュージック・エア - * 352ch:朝日ニュースター - * 353ch:BBCワールドニュース - * 354ch:CNNj - * 110ch:ワンテンポータル */ - { 18, CHTYPE_SATELLITE, 0, "CS14"}, /* ND14: - * 251ch:J sports 1 - * 252ch:J sports 2 - * 253ch:J sports Plus - * 254ch:GAORA */ - { 19, CHTYPE_SATELLITE, 0, "CS16"}, /* ND16: - * 305ch:チャンネル銀河 - * 333ch:アニメシアターX(AT-X) - * 342ch:ヒストリーチャンネル - * 290ch:TAKARAZUKA SKYSTAGE - * 803ch:スカチャン803 - * 804ch:スカチャン804 */ - { 20, CHTYPE_SATELLITE, 0, "CS18"}, /* ND18: - * 240ch:ムービープラスHD - * 262ch:ゴルフネットワーク - * 314ch:LaLa HDHV */ - { 21, CHTYPE_SATELLITE, 0, "CS20"}, /* ND20: - * 258ch:フジテレビONE - * 302ch:フジテレビTWO - * 332ch:アニマックス - * 340ch:ディスカバリーチャンネル - * 341ch:アニマルプラネット */ - { 22, CHTYPE_SATELLITE, 0, "CS22"}, /* ND22: - * 160ch:C-TBSウェルカムチャンネル - * 161ch:QVC - * 185ch:プライム365.TV - * 293ch:ファミリー劇場 - * 301ch:TBSチャンネル - * 304ch:ディズニー・チャンネル - * 325ch:MUSIC ON! TV - * 351ch:TBSニュースバード - * 343ch:ナショナルジオグラフィックチャンネル */ - { 23, CHTYPE_SATELLITE, 0, "CS24"}, /* ND24: - * 257ch:日テレG+ HD - * 291ch:fashiontv - * 300ch:日テレプラス - * 315ch:FOXプラス - * 321ch:MusicJapan TV - * 350ch:日テレNEWS24 - * 362ch:旅チャンネル */ - { 0, CHTYPE_GROUND, 0, "1"}, { 1, CHTYPE_GROUND, 0, "2"}, - { 2, CHTYPE_GROUND, 0, "3"}, { 3, CHTYPE_GROUND, 0, "C13"}, - { 4, CHTYPE_GROUND, 0, "C14"}, { 5, CHTYPE_GROUND, 0, "C15"}, - { 6, CHTYPE_GROUND, 0, "C16"}, { 7, CHTYPE_GROUND, 0, "C17"}, - { 8, CHTYPE_GROUND, 0, "C18"}, { 9, CHTYPE_GROUND, 0, "C19"}, - { 10, CHTYPE_GROUND, 0, "C20"}, { 11, CHTYPE_GROUND, 0, "C21"}, - { 12, CHTYPE_GROUND, 0, "C22"}, { 13, CHTYPE_GROUND, 0, "4"}, - { 14, CHTYPE_GROUND, 0, "5"}, { 15, CHTYPE_GROUND, 0, "6"}, - { 16, CHTYPE_GROUND, 0, "7"}, { 17, CHTYPE_GROUND, 0, "8"}, - { 18, CHTYPE_GROUND, 0, "9"}, { 19, CHTYPE_GROUND, 0, "10"}, - { 20, CHTYPE_GROUND, 0, "11"}, { 21, CHTYPE_GROUND, 0, "12"}, - { 22, CHTYPE_GROUND, 0, "C23"}, { 23, CHTYPE_GROUND, 0, "C24"}, - { 24, CHTYPE_GROUND, 0, "C25"}, { 25, CHTYPE_GROUND, 0, "C26"}, - { 26, CHTYPE_GROUND, 0, "C27"}, { 27, CHTYPE_GROUND, 0, "C28"}, - { 28, CHTYPE_GROUND, 0, "C29"}, { 29, CHTYPE_GROUND, 0, "C30"}, - { 30, CHTYPE_GROUND, 0, "C31"}, { 31, CHTYPE_GROUND, 0, "C32"}, - { 32, CHTYPE_GROUND, 0, "C33"}, { 33, CHTYPE_GROUND, 0, "C34"}, - { 34, CHTYPE_GROUND, 0, "C35"}, { 35, CHTYPE_GROUND, 0, "C36"}, - { 36, CHTYPE_GROUND, 0, "C37"}, { 37, CHTYPE_GROUND, 0, "C38"}, - { 38, CHTYPE_GROUND, 0, "C39"}, { 39, CHTYPE_GROUND, 0, "C40"}, - { 40, CHTYPE_GROUND, 0, "C41"}, { 41, CHTYPE_GROUND, 0, "C42"}, - { 42, CHTYPE_GROUND, 0, "C43"}, { 43, CHTYPE_GROUND, 0, "C44"}, - { 44, CHTYPE_GROUND, 0, "C45"}, { 45, CHTYPE_GROUND, 0, "C46"}, - { 46, CHTYPE_GROUND, 0, "C47"}, { 47, CHTYPE_GROUND, 0, "C48"}, - { 48, CHTYPE_GROUND, 0, "C49"}, { 49, CHTYPE_GROUND, 0, "C50"}, - { 50, CHTYPE_GROUND, 0, "C51"}, { 51, CHTYPE_GROUND, 0, "C52"}, - { 52, CHTYPE_GROUND, 0, "C53"}, { 53, CHTYPE_GROUND, 0, "C54"}, - { 54, CHTYPE_GROUND, 0, "C55"}, { 55, CHTYPE_GROUND, 0, "C56"}, - { 56, CHTYPE_GROUND, 0, "C57"}, { 57, CHTYPE_GROUND, 0, "C58"}, - { 58, CHTYPE_GROUND, 0, "C59"}, { 59, CHTYPE_GROUND, 0, "C60"}, - { 60, CHTYPE_GROUND, 0, "C61"}, { 61, CHTYPE_GROUND, 0, "C62"}, - { 62, CHTYPE_GROUND, 0, "C63"}, { 63, CHTYPE_GROUND, 0, "13"}, - { 64, CHTYPE_GROUND, 0, "14"}, { 65, CHTYPE_GROUND, 0, "15"}, - { 66, CHTYPE_GROUND, 0, "16"}, { 67, CHTYPE_GROUND, 0, "17"}, - { 68, CHTYPE_GROUND, 0, "18"}, { 69, CHTYPE_GROUND, 0, "19"}, - { 70, CHTYPE_GROUND, 0, "20"}, { 71, CHTYPE_GROUND, 0, "21"}, - { 72, CHTYPE_GROUND, 0, "22"}, { 73, CHTYPE_GROUND, 0, "23"}, - { 74, CHTYPE_GROUND, 0, "24"}, { 75, CHTYPE_GROUND, 0, "25"}, - { 76, CHTYPE_GROUND, 0, "26"}, { 77, CHTYPE_GROUND, 0, "27"}, - { 78, CHTYPE_GROUND, 0, "28"}, { 79, CHTYPE_GROUND, 0, "29"}, - { 80, CHTYPE_GROUND, 0, "30"}, { 81, CHTYPE_GROUND, 0, "31"}, - { 82, CHTYPE_GROUND, 0, "32"}, { 83, CHTYPE_GROUND, 0, "33"}, - { 84, CHTYPE_GROUND, 0, "34"}, { 85, CHTYPE_GROUND, 0, "35"}, - { 86, CHTYPE_GROUND, 0, "36"}, { 87, CHTYPE_GROUND, 0, "37"}, - { 88, CHTYPE_GROUND, 0, "38"}, { 89, CHTYPE_GROUND, 0, "39"}, - { 90, CHTYPE_GROUND, 0, "40"}, { 91, CHTYPE_GROUND, 0, "41"}, - { 92, CHTYPE_GROUND, 0, "42"}, { 93, CHTYPE_GROUND, 0, "43"}, - { 94, CHTYPE_GROUND, 0, "44"}, { 95, CHTYPE_GROUND, 0, "45"}, - { 96, CHTYPE_GROUND, 0, "46"}, { 97, CHTYPE_GROUND, 0, "47"}, - { 98, CHTYPE_GROUND, 0, "48"}, { 99, CHTYPE_GROUND, 0, "49"}, - { 100, CHTYPE_GROUND, 0, "50"}, { 101, CHTYPE_GROUND, 0, "51"}, - { 102, CHTYPE_GROUND, 0, "52"}, { 103, CHTYPE_GROUND, 0, "53"}, - { 104, CHTYPE_GROUND, 0, "54"}, { 105, CHTYPE_GROUND, 0, "55"}, - { 106, CHTYPE_GROUND, 0, "56"}, { 107, CHTYPE_GROUND, 0, "57"}, - { 108, CHTYPE_GROUND, 0, "58"}, { 109, CHTYPE_GROUND, 0, "59"}, - { 110, CHTYPE_GROUND, 0, "60"}, { 111, CHTYPE_GROUND, 0, "61"}, - { 112, CHTYPE_GROUND, 0, "62"}, - { 0, 0, 0, NULL} /* terminate */ -}; #endif
--- a/src/recpt1.c Sat Oct 06 21:57:42 2012 +0900 +++ b/src/recpt1.c Sun Oct 07 00:37:10 2012 +0900 @@ -41,22 +41,14 @@ /* maximum write length at once */ #define SIZE_CHANK 1316 -#define ISDB_T_NODE_LIMIT 24 // 32:ARIB limit 24:program maximum -#define ISDB_T_SLOT_LIMIT 8 - /* globals */ boolean f_exit = FALSE; struct channel_info_list *channel_list = NULL; extern struct ushare_t *ut; -char bs_channel_buf[8]; -ISDB_T_FREQ_CONV_TABLE isdb_t_conv_set = { 0, CHTYPE_SATELLITE, 0, bs_channel_buf }; +thread_data *gp_tdata; /* prototypes */ -int tune(char *channel, thread_data *tdata, char *device); -int close_tuner(thread_data *tdata); static int get_device_id_by_name ( const char *name ); -void calc_cn(int fd, int type); -ISDB_T_FREQ_CONV_TABLE *searchrecoff(char *channel); static struct channel_info_list *open_list_file( char *type, @@ -262,7 +254,7 @@ tdata->ch[0] = '\0'; goto CHECK_TIME_TO_ADD; } - calc_cn(tdata->tfd, tdata->table->type); + calc_cn(tdata->tfd, tdata->table->type, false); } /* restart recording */ if(ioctl(tdata->tfd, START_REC, 0) < 0) { @@ -294,50 +286,6 @@ } } - -/* lookup frequency conversion table*/ -ISDB_T_FREQ_CONV_TABLE * -searchrecoff(char *channel) -{ - int lp; - - if((channel[0] == 'B' || channel[0] == 'b') && - (channel[1] == 'S' || channel[1] == 's')) { - int node = 0; - int slot = 0; - char *bs_ch; - - bs_ch = channel + 2; - while(isdigit(*bs_ch)) { - node *= 10; - node += *bs_ch++ - '0'; - } - if(*bs_ch == '_' && (node&0x01) && node < ISDB_T_NODE_LIMIT) { - if(isdigit(*++bs_ch)) { - slot = *bs_ch - '0'; - if(*++bs_ch == '\0' && slot < ISDB_T_SLOT_LIMIT) { - isdb_t_conv_set.set_freq = node / 2; - isdb_t_conv_set.add_freq = slot; - sprintf(bs_channel_buf, "BS%d_%d", node, slot); - return &isdb_t_conv_set; - } - } - } - return NULL; - } - - for(lp = 0; isdb_t_conv_table[lp].parm_freq != NULL; lp++) { - /* return entry number in the table when strings match and - * lengths are same. */ - if((memcmp(isdb_t_conv_table[lp].parm_freq, channel, - strlen(channel)) == 0) && - (strlen(channel) == strlen(isdb_t_conv_table[lp].parm_freq))) { - return &isdb_t_conv_table[lp]; - } - } - return NULL; -} - QUEUE_T * create_queue(size_t size) { @@ -953,113 +901,6 @@ } void -show_channels(void) -{ - FILE *f; - char *home; - char buf[255], filename[255]; - - fprintf(stderr, "Available Channels:\n"); - - home = getenv("HOME"); - sprintf(filename, "%s/.recpt1-channels", home); - f = fopen(filename, "r"); - if(f) { - while(fgets(buf, 255, f)) - fprintf(stderr, "%s", buf); - fclose(f); - } - else { - fprintf(stderr, "13-62: Terrestrial Channels\n"); - fprintf(stderr, "101ch: NHK BS1\n"); - fprintf(stderr, "102ch: NHK BS2\n"); - fprintf(stderr, "103ch: NHK BShi\n"); - fprintf(stderr, "141ch: BS Nittele\n"); - fprintf(stderr, "151ch: BS Asahi\n"); - fprintf(stderr, "161ch: BS-TBS\n"); - fprintf(stderr, "171ch: BS Japan\n"); - fprintf(stderr, "181ch: BS Fuji\n"); - fprintf(stderr, "191ch: WOWOW\n"); - fprintf(stderr, "192ch: WOWOW2\n"); - fprintf(stderr, "193ch: WOWOW3\n"); - fprintf(stderr, "200ch: Star Channel\n"); - fprintf(stderr, "211ch: BS11 Digital\n"); - fprintf(stderr, "222ch: TwellV\n"); - fprintf(stderr, "C13-C63: CATV Channels\n"); - fprintf(stderr, "CS2-CS24: CS Channels\n"); - } -} - -float -getsignal_isdb_s(int signal) -{ - /* apply linear interpolation */ - static const float afLevelTable[] = { - 24.07f, // 00 00 0 24.07dB - 24.07f, // 10 00 4096 24.07dB - 18.61f, // 20 00 8192 18.61dB - 15.21f, // 30 00 12288 15.21dB - 12.50f, // 40 00 16384 12.50dB - 10.19f, // 50 00 20480 10.19dB - 8.140f, // 60 00 24576 8.140dB - 6.270f, // 70 00 28672 6.270dB - 4.550f, // 80 00 32768 4.550dB - 3.730f, // 88 00 34816 3.730dB - 3.630f, // 88 FF 35071 3.630dB - 2.940f, // 90 00 36864 2.940dB - 1.420f, // A0 00 40960 1.420dB - 0.000f // B0 00 45056 -0.01dB - }; - - unsigned char sigbuf[4]; - memset(sigbuf, '\0', sizeof(sigbuf)); - sigbuf[0] = (((signal & 0xFF00) >> 8) & 0XFF); - sigbuf[1] = (signal & 0xFF); - - /* calculate signal level */ - if(sigbuf[0] <= 0x10U) { - /* clipped maximum */ - return 24.07f; - } - else if (sigbuf[0] >= 0xB0U) { - /* clipped minimum */ - return 0.0f; - } - else { - /* linear interpolation */ - const float fMixRate = - (float)(((unsigned short)(sigbuf[0] & 0x0FU) << 8) | - (unsigned short)sigbuf[0]) / 4096.0f; - return afLevelTable[sigbuf[0] >> 4] * (1.0f - fMixRate) + - afLevelTable[(sigbuf[0] >> 4) + 0x01U] * fMixRate; - } -} - -void -calc_cn(int fd, int type) -{ - int rc ; - double P ; - double CNR; - - if(ioctl(fd, GET_SIGNAL_STRENGTH, &rc) < 0) { - fprintf(stderr, "Tuner Select Error\n"); - return ; - } - - if(type == CHTYPE_GROUND) { - P = log10(5505024/(double)rc) * 10; - CNR = (0.000024 * P * P * P * P) - (0.0016 * P * P * P) + - (0.0398 * P * P) + (0.5491 * P)+3.0965; - fprintf(stderr, "C/N = %fdB\n", CNR); - } - else { - CNR = getsignal_isdb_s(rc); - fprintf(stderr, "C/N = %fdB\n", CNR); - } -} - -void cleanup(thread_data *tdata) { boolean use_dlna = tdata->streamer ? TRUE : FALSE; @@ -1137,100 +978,6 @@ } int -tune(char *channel, thread_data *tdata, char *device) -{ - char **tuner; - int num_devs; - int lp; - FREQUENCY freq; - - /* get channel */ - tdata->table = searchrecoff(channel); - if(tdata->table == NULL) { - fprintf(stderr, "Invalid Channel: %s\n", channel); - return 1; - } - - freq.frequencyno = tdata->table->set_freq; - freq.slot = tdata->table->add_freq; - - /* open tuner */ - /* case 1: specified tuner device */ - if(device) { - tdata->tfd = open(device, O_RDONLY); - tdata->device_id = get_device_id_by_name(device); - if(tdata->tfd < 0) { - fprintf(stderr, "Cannot open tuner device: %s\n", device); - return 1; - } - - /* power on LNB */ - if(tdata->table->type == CHTYPE_SATELLITE) { - if(ioctl(tdata->tfd, LNB_ENABLE, tdata->lnb) < 0) { - fprintf(stderr, "Power on LNB failed: %s\n", device); - } - } - - /* tune to specified channel */ - if(ioctl(tdata->tfd, SET_CHANNEL, &freq) < 0) { - close(tdata->tfd); - fprintf(stderr, "Cannot tune to the specified channel: %s\n", device); - return 1; - } - else { - strncpy(tdata->ch, channel, sizeof(tdata->ch)); - } - } - else { - /* case 2: loop around available devices */ - if(tdata->table->type == CHTYPE_SATELLITE) { - tuner = bsdev; - num_devs = NUM_BSDEV; - } - else { - tuner = isdb_t_dev; - num_devs = NUM_ISDB_T_DEV; - } - - for(lp = 0; lp < num_devs; lp++) { - tdata->tfd = open(tuner[lp], O_RDONLY); - if(tdata->tfd >= 0) { - /* power on LNB */ - if(tdata->table->type == CHTYPE_SATELLITE) { - if(ioctl(tdata->tfd, LNB_ENABLE, tdata->lnb) < 0) { - fprintf(stderr, "Warning: Power on LNB failed: %s\n", tuner[lp]); - } - } - - /* tune to specified channel */ - if(ioctl(tdata->tfd, SET_CHANNEL, &freq) < 0) { - close(tdata->tfd); - tdata->tfd = -1; - continue; - } - - tdata->device_id = get_device_id_by_name(tuner[lp]); - break; /* found suitable tuner */ - } - } - - /* all tuners cannot be used */ - if(tdata->tfd < 0) { - fprintf(stderr, "Cannot tune to the specified channel\n"); - return 1; - } - else { - strncpy(tdata->ch, channel, sizeof(tdata->ch)); - } - } - - /* show signal strength */ - calc_cn(tdata->tfd, tdata->table->type); - - return 0; /* success */ -} - -int parse_time(char *rectimestr, thread_data *tdata) { /* indefinite */ @@ -1283,22 +1030,6 @@ return 0; /* success */ } -int -close_tuner(thread_data *tdata) -{ - int rv = 0; - - if(tdata->table->type == CHTYPE_SATELLITE) { - if(ioctl(tdata->tfd, LNB_DISABLE, 0) < 0) { - rv = 1; - } - } - close(tdata->tfd); - - return rv; -} - -thread_data *gp_tdata; int main(int argc, char **argv)
--- a/src/recpt1ctl.c Sat Oct 06 21:57:42 2012 +0900 +++ b/src/recpt1ctl.c Sun Oct 07 00:37:10 2012 +0900 @@ -31,41 +31,6 @@ fprintf(stderr, "--list: Show channel list\n"); } -void -show_channels(void) -{ - FILE *f; - char *home; - char buf[255], filename[255]; - - fprintf(stderr, "Available Channels:\n"); - - home = getenv("HOME"); - sprintf(filename, "%s/.recpt1-channels", home); - f = fopen(filename, "r"); - if(f) { - while(fgets(buf, 255, f)) - fprintf(stderr, "%s", buf); - fclose(f); - } - else - fprintf(stderr, "13-62: Terrestrial Channels\n"); - - fprintf(stderr, "101ch: NHK BS1\n"); - fprintf(stderr, "102ch: NHK BS2\n"); - fprintf(stderr, "103ch: NHK BShi\n"); - fprintf(stderr, "141ch: BS Nittele\n"); - fprintf(stderr, "151ch: BS Asahi\n"); - fprintf(stderr, "161ch: BS-TBS\n"); - fprintf(stderr, "171ch: BS Japan\n"); - fprintf(stderr, "181ch: BS Fuji\n"); - fprintf(stderr, "191ch: WOWOW\n"); - fprintf(stderr, "200ch: Star Channel\n"); - fprintf(stderr, "211ch: BS11 Digital\n"); - fprintf(stderr, "222ch: TwellV\n"); - fprintf(stderr, "CS2-CS24: CS Channels\n"); -} - int parse_time(char *rectimestr, int *recsec) {