Changeset 40413
- Timestamp:
- 05/13/17 12:26:36 (6 years ago)
- Location:
- titan/titan
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
titan/titan/cec.h
r39704 r40413 3 3 4 4 int cecon = 0; 5 struct stimerthread* hdmiEventthread = NULL; 6 7 8 void sendName(unsigned char address) 9 { 10 unsigned char cmd = 0x47; 11 char data[16] = "TitanNit"; 12 13 data[8] = '\0'; 14 sendMessage(address, cmd, data, strlen(data)); 15 16 } 17 18 void sendMenuInfo(unsigned char address) 19 { 20 unsigned char cmd = 0x8e; 21 char data[2]; 22 23 data[0] = 0x00; 24 if(status.standby > 0 || getconfigint("cec_menue", NULL) == 0) 25 data[0] = 0x01; 26 data[1] = '\0'; 27 sendMessage(address, cmd, data, 1); 28 } 29 30 void sendVendorid(unsigned char address) 31 { 32 unsigned char cmd = 0x87; 33 char data[4]; 34 35 data[0] = 0x00; 36 data[1] = 0x00; 37 data[2] = 0x00; 38 data[3] = '\0'; 39 sendMessage(address, cmd, data, 3); 40 } 41 42 void sendSource(unsigned char address) 43 { 44 unsigned char cmd = 0x82; 45 char data[4]; 46 47 data[0] = cec_physicalAddress[0]; 48 data[1] = cec_physicalAddress[1]; 49 data[2] = '\0'; 50 sendMessage(address, cmd, data, 2); 51 } 52 53 void sendVersion(unsigned char address) 54 { 55 unsigned char cmd = 0x9e; 56 char data[4]; 57 58 data[0] = 0x01; 59 data[1] = '\0'; 60 sendMessage(address, cmd, data, 2); 61 } 62 63 void sendTVon() 64 { 65 char data[3]; 66 unsigned char address = 0x00; 67 unsigned char cmd = 0x04; 68 data[0] = '\0'; 69 sendMessage(address, cmd, data, 0); 70 } 71 72 void sendswitch() 73 { 74 char data[3]; 75 unsigned char address = 0x0f; 76 unsigned char cmd = 0x82; 77 data[0] = cec_physicalAddress[0]; 78 data[1] = cec_physicalAddress[1]; 79 data[2] = '\0'; 80 sendMessage(address, cmd, data, 2); 81 } 82 83 int translateKey(unsigned char code) 84 { 85 int key = 0; 86 switch (code) 87 { 88 case 0x32: 89 key = 0x8b; 90 break; 91 case 0x20: 92 key = 0x0b; 93 break; 94 case 0x21: 95 key = 0x02; 96 break; 97 case 0x22: 98 key = 0x03; 99 break; 100 case 0x23: 101 key = 0x04; 102 break; 103 case 0x24: 104 key = 0x05; 105 break; 106 case 0x25: 107 key = 0x06; 108 break; 109 case 0x26: 110 key = 0x07; 111 break; 112 case 0x27: 113 key = 0x08; 114 break; 115 case 0x28: 116 key = 0x09; 117 break; 118 case 0x29: 119 key = 0x0a; 120 break; 121 case 0x30: 122 key = 0x192; 123 break; 124 case 0x31: 125 key = 0x193; 126 break; 127 case 0x44: 128 key = 0xcf; 129 break; 130 case 0x45: 131 key = 0x80; 132 break; 133 case 0x46: 134 key = 0x77; 135 break; 136 case 0x47: 137 key = 0xa7; 138 break; 139 case 0x48: 140 key = 0xa8; 141 break; 142 case 0x49: 143 key = 0xd0; 144 break; 145 case 0x53: 146 key = 0x166; 147 break; 148 case 0x54: 149 key = 0x16a; 150 break; 151 case 0x60: 152 key = 0xcf; 153 break; 154 case 0x61: 155 key = 0xa4; 156 break; 157 case 0x62: 158 key = 0xa7; 159 break; 160 case 0x64: 161 key = 0x80; 162 break; 163 case 0x00: 164 key = 0x160; 165 break; 166 case 0x03: 167 key = 0x69; 168 break; 169 case 0x04: 170 key = 0x6a; 171 break; 172 case 0x01: 173 key = 0x67; 174 break; 175 case 0x02: 176 key = 0x6c; 177 break; 178 case 0x0d: 179 key = 0xae; 180 break; 181 case 0x72: 182 key = 0x18e; 183 break; 184 case 0x71: 185 key = 0x191; 186 break; 187 case 0x73: 188 key = 0x18f; 189 break; 190 case 0x74: 191 key = 0x190; 192 break; 193 default: 194 key = 0x8b; 195 break; 196 } 197 return key; 198 } 199 200 void setVolumeForward() 201 { 202 unsigned char address = 0x00; 203 unsigned char cmd = 0x7d; 204 char data[2]; 205 data[0] = '\0'; 206 207 addconfiginttmp("ForwardVolume", 1); 208 data[0] = '\0'; 209 if(getconfigint("cec_volume", NULL) > 0) 210 { 211 if(getconfigint("cec_volume", NULL) == 1) 212 address = 0x05; 213 if(getconfigint("cec_volume", NULL) == 2) 214 address = 0x00; 215 216 //cmd = 0x72; 217 //data[0] = 0x01; 218 //data[1] = '\0'; 219 //m_lock(&status.cecmutex, 26); 220 //sendMessage(address, cmd, data, strlen(data)); 221 //m_unlock(&status.cecmutex, 26); 222 223 //cmd = 0x70; 224 //data[0] = 0x02; 225 //data[1] = 0x00; 226 //data[2] = '\0'; 227 //m_lock(&status.cecmutex, 26); 228 //sendMessage(address, cmd, data, 2); 229 //m_unlock(&status.cecmutex, 26); 230 231 cmd = 0x7d; 232 data[0] = '\0'; 233 sendMessage(address, cmd, data, strlen(data)); 234 235 } 236 } 5 237 6 238 void hdmiEvent() … … 8 240 fd_set rfds; 9 241 struct timeval tv; 10 struct cec_message rxmessage; 11 int ret = 0, len = 0; 12 13 while(1) 14 { 242 struct cec_rx_message rxmessage; 243 int ret = 0; 244 int hasdata = 0; 245 int keypressed = 0; 246 int transkey = 0; 247 unsigned char pressedkey = 0x00; 248 249 while (hdmiEventthread->aktion != STOP) 250 { 251 printf("**** start Thread\n"); 15 252 tv.tv_sec = 0x7fffffff; 16 253 tv.tv_usec = 0; … … 18 255 FD_SET(status.hdmiFd, &rfds); 19 256 257 hasdata = 0; 258 20 259 ret = select(status.hdmiFd + 1, &rfds, NULL, NULL, &tv); 21 22 260 if(ret > 0) 23 261 { … … 25 263 { 26 264 #ifdef DREAMBOX 27 ret = ioctl(status.hdmiFd, 2, &rxmessage);28 if(ret == 0)29 len = rxmessage.length;265 if (ioctl(status.hdmiFd, 2, &rxmessage) >= 0) 266 hasdata = 1; 267 30 268 unsigned int val = 0; 31 ioctl(status.hdmiFd, 4, &val); 269 ioctl(status.hdmiFd, 4, &val); 32 270 #else 33 len = read(status.hdmiFd, &rxmessage, sizeof(struct cec_message)); 271 if (read(status.hdmiFd, &rxmessage, 2) == 2) 272 { 273 if (read(status.hdmiFd, &rxmessage.data, rxmessage.length) == rxmessage.length) 274 hasdata = 1; 275 } 34 276 #endif 35 if( len > 0)277 if(hasdata) 36 278 { 37 printf("reveived adress: %02x datalen: %02x cmd: %02x\n", rxmessage.address, rxmessage.length, rxmessage.data[0]); 279 printf("CEC: rxmessage ->"); 280 printf(" %02x ", rxmessage.address); 281 for (int i = 0; i < rxmessage.length; i++) 282 printf(" %02x", rxmessage.data[i]); 283 printf("\n"); 284 285 switch (rxmessage.data[0]) 286 { 287 case 0x7e: 288 case 0x72: /* system audio mode status */ 289 { 290 if(rxmessage.data[1] == 0x01) 291 { 292 addconfiginttmp("ForwardVolume", 1); 293 printf("HDMI_CEC: Volume forward is acticated\n"); 294 } 295 else 296 { 297 printf("HDMI_CEC: Volume forward is not supported\n"); 298 addconfiginttmp("ForwardVolume", 0); 299 } 300 break; 301 } 302 303 case 0x46: /* request name */ 304 { 305 sendName(rxmessage.address); 306 break; 307 } 308 case 0x8c: /* request vendor id */ 309 { 310 sendVendorid(rxmessage.address); 311 break; 312 } 313 case 0x8d: /* menu request */ 314 { 315 //if(rxmessage.data[1] == 0x02) 316 sendMenuInfo(rxmessage.address); 317 break; 318 } 319 case 0x82: 320 { 321 //cecon = 0; 322 //sendTVon(); 323 sendswitch(); 324 setFixedPhysicalAddress(getconfigint("cec_fixedAddress", NULL)); 325 reportPhysicalAddress(0); 326 sendMenuInfo(0x00); 327 setVolumeForward(); 328 } 329 case 0x00: /* feature abort */ 330 { 331 if(rxmessage.data[1] == 0x44 || rxmessage.data[1] == 0x7d) 332 { 333 addconfiginttmp("ForwardVolume", 0); 334 printf("HdmiCec: volume forwarding not supported by device %02x\n", rxmessage.address); 335 } 336 break; 337 } 338 case 0x44: /* key pressed */ 339 { 340 keypressed = 1; 341 pressedkey = rxmessage.data[1]; 342 transkey = translateKey(pressedkey); 343 writerc(transkey); 344 break; 345 } 346 case 0x45: /* key released */ 347 { 348 printf("HdmiCec: key received -- %02x\n", pressedkey); 349 transkey = translateKey(pressedkey); 350 printf("HdmiCec: key TitanCode -- %i\n", transkey); 351 //writerc(transkey); 352 keypressed = 0; 353 break; 354 } 355 case 0x83: /* request address */ 356 { 357 reportPhysicalAddress(1); 358 break; 359 } 360 case 0x85: /* request active source */ 361 { 362 sendSource(rxmessage.address); 363 break; 364 } 365 case 0x9f: /* request cec version */ 366 { 367 sendVersion(rxmessage.address); 368 break; 369 } 370 } 38 371 } 39 372 } … … 46 379 sleep(1); 47 380 } 48 } 381 } 382 hdmiEventthread = NULL; 383 printf("**** stop Thread\n"); 49 384 } 50 385 … … 61 396 if (status.hdmiFd >= 0) 62 397 { 63 printf(" eHdmiCEC: send message\n");398 printf("HdmiCEC: send message\n"); 64 399 printf("%02x ", message.address); 65 400 for(i = 0; i < message.length; i++) … … 81 416 } 82 417 418 void sendMessageReal_thread(struct stimerthread* timernode, struct cec_message* message, int flag) 419 { 420 m_lock(&status.cecmutex, 26); 421 int i = 0; 422 if (status.hdmiFd >= 0) 423 { 424 printf("HdmiCEC: send message\n"); 425 printf("%02x ", message->address); 426 for(i = 0; i < message->length; i++) 427 { 428 printf(" %02X", message->data[i]); 429 } 430 printf("\n"); 431 int ret = 0; 432 #ifdef DREAMBOX 433 message->flag = 1; 434 ret = ioctl(status.hdmiFd, 3, message); 435 if(ret == 0) 436 ret = 1 + message->length; 437 #else 438 ret = write(status.hdmiFd, message, 2 + message->length); 439 #endif 440 printf("%i Bytes wurden gesendet\n", ret); 441 } 442 free(message); message=NULL; 443 usleep(100000); 444 m_unlock(&status.cecmutex, 26); 445 } 446 447 void sendMessageReal_add(struct cec_message message) 448 { 449 struct cec_message* smessage; 450 smessage = calloc(1, sizeof(struct cec_message)); 451 if(smessage == NULL) 452 { 453 err("no mem"); 454 return; 455 } 456 memcpy(smessage, &message, sizeof(struct cec_message)); 457 addtimer(&sendMessageReal_thread, START, 1000, 1, (void*)smessage, NULL, NULL); 458 } 459 460 83 461 void sendMessage(unsigned char address, unsigned char cmd, char *data, int length) 84 462 { … … 89 467 message.data[0] = cmd; 90 468 memcpy(&message.data[1], data, length); 91 sendMessageReal (message);92 } 93 94 void reportPhysicalAddress( )469 sendMessageReal_add(message); 470 } 471 472 void reportPhysicalAddress(int flag) 95 473 { 96 474 struct cec_message txmessage; … … 101 479 txmessage.data[3] = cec_deviceType; 102 480 txmessage.length = 4; 103 sendMessageReal(txmessage); 104 sleep(1); 481 sendMessageReal_add(txmessage); 105 482 } 106 483 … … 163 540 cec_deviceType = addressinfo.type; 164 541 cec_logicalAddress = addressinfo.logical; 165 printf(" eHdmiCEC: detected deviceType: %02X\n", addressinfo.type);166 printf(" eHdmiCEC: detected logical address: %02X\n", addressinfo.logical);167 printf(" eHdmiCEC: detected physical address: %02X%02X\n", addressinfo.physical[0], addressinfo.physical[1]);542 printf("HdmiCEC: detected deviceType: %02X\n", addressinfo.type); 543 printf("HdmiCEC: detected logical address: %02X\n", addressinfo.logical); 544 printf("HdmiCEC: detected physical address: %02X%02X\n", addressinfo.physical[0], addressinfo.physical[1]); 168 545 if (status.cec_fixedAddress == 0) 169 546 { 547 //if(cecon > 0) 170 548 if (memcmp(cec_physicalAddress, addressinfo.physical, sizeof(cec_physicalAddress))) 171 549 { 172 printf(" eHdmiCEC: detected physical address change: %02X%02X --> %02X%02X\n", cec_physicalAddress[0], cec_physicalAddress[1], addressinfo.physical[0], addressinfo.physical[1]);550 printf("HdmiCEC: detected physical address change: %02X%02X --> %02X%02X\n", cec_physicalAddress[0], cec_physicalAddress[1], addressinfo.physical[0], addressinfo.physical[1]); 173 551 memcpy(cec_physicalAddress, addressinfo.physical, sizeof(cec_physicalAddress)); 174 reportPhysicalAddress( );552 reportPhysicalAddress(0); 175 553 /* emit */ //addressChanged((cec_physicalAddress[0] << 8) | cec_physicalAddress[1]); 176 554 } … … 195 573 struct skin* tvswitch = getscreennode(cec, "tvswitch"); 196 574 struct skin* cecfix = getscreennode(cec, "cecfix"); 575 struct skin* volume = getscreennode(cec, "volume"); 576 struct skin* menue = getscreennode(cec, "menue"); 197 577 int rcret = 0; 198 578 int help = 0; … … 240 620 else 241 621 setchoiceboxselection(cecfix, "1"); 622 623 addchoicebox(volume, "0", _("none")); 624 addchoicebox(volume, "1", _("Receiver")); 625 addchoicebox(volume, "2", _("TV")); 626 setchoiceboxselection(volume, getconfig("cec_volume", NULL)); 627 628 addchoicebox(menue, "0", _("off")); 629 addchoicebox(menue, "1", _("on")); 630 setchoiceboxselection(menue, getconfig("cec_menue", NULL)); 242 631 243 632 … … 253 642 tvswitch->hidden = YES; 254 643 cecfix->hidden = YES; 644 volume->hidden = YES; 645 menue->hidden = YES; 255 646 } 256 647 else … … 265 656 tvswitch->hidden = NO; 266 657 cecfix->hidden = NO; 658 volume->hidden = NO; 659 menue->hidden = NO; 267 660 } 268 661 … … 289 682 tvswitch->hidden = YES; 290 683 cecfix->hidden = YES; 684 volume->hidden = YES; 685 menue->hidden = YES; 291 686 } 292 687 else … … 301 696 tvswitch->hidden = NO; 302 697 cecfix->hidden = NO; 698 volume->hidden = NO; 699 menue->hidden = NO; 303 700 } 304 701 } … … 316 713 addconfig("cec_rec_on", recon->ret); 317 714 addconfig("cec_tv_switch", tvswitch->ret); 715 addconfig("cec_volume", volume->ret); 716 addconfig("cec_menue", menue->ret); 318 717 if(ostrcmp(cecfix->ret, "0") == 0) 319 718 { 320 719 addconfig("cec_fixedAddress", "0"); 321 setFixedPhysicalAddress(0);720 //setFixedPhysicalAddress(0); 322 721 } 323 722 else … … 326 725 help = (cec_physicalAddress[0] << 8) | cec_physicalAddress[1] ; 327 726 addconfigint("cec_fixedAddress", help); 328 setFixedPhysicalAddress(help);727 //setFixedPhysicalAddress(help); 329 728 } 729 if(getconfigint("cec_activ", NULL) == 0 || getconfigint("cec_on", NULL) == 0) 730 cecinit(); 330 731 break; 331 732 } … … 344 745 cec_physicalAddress[1] = address & 0xff; 345 746 /* report our (possibly new) address */ 346 reportPhysicalAddress( );747 reportPhysicalAddress(0); 347 748 } 348 749 else … … 362 763 cec_logicalAddress = 1; 363 764 cec_deviceType = 1; /* default: recorder */ 364 765 766 if(getconfigint("cec_on", NULL) == 0) 767 { 768 addconfiginttmp("cec_activ", 0); 769 if(hdmiEventthread != NULL) 770 hdmiEventthread->aktion = STOP; 771 return; 772 } 773 addconfiginttmp("cec_activ", 1); 774 775 365 776 #ifdef DREAMBOX 366 777 status.hdmiFd = open("/dev/misc/hdmi_cec0", O_RDWR | O_NONBLOCK); … … 372 783 #endif 373 784 374 setFixedPhysicalAddress(getconfigint("cec_fixedAddress", NULL)); 785 if(hdmiEventthread == NULL) 786 hdmiEventthread = addtimer(&hdmiEvent, START, 10000, 1, NULL, NULL, NULL); 787 788 getAddressInfo(); 789 375 790 if(checkbox("DM900") == 1 && getwaswakuptimer() != 1) 376 791 { … … 381 796 return; 382 797 } 383 798 384 799 void cecstandby() 385 800 { … … 396 811 address = 0x0f; 397 812 sendMessage(address, cmd, data, strlen(data)); 398 sleep(1);399 813 } 400 814 if(getconfigint("cec_tv_off", NULL) == 1) … … 402 816 address = 0x00; 403 817 sendMessage(address, cmd, data, strlen(data)); 404 sleep(1);818 //sleep(1); 405 819 } 406 820 if(getconfigint("cec_rec_off", NULL) == 1) … … 408 822 address = 0x05; 409 823 sendMessage(address, cmd, data, strlen(data)); 410 sleep(1);824 //sleep(1); 411 825 } 412 826 } … … 427 841 address = 0x0f; 428 842 sendMessage(address, cmd, data, 0); 429 sleep(1);843 //sleep(1); 430 844 } 431 845 if(getconfigint("cec_rec_on", NULL) == 1) … … 433 847 address = 0x05; 434 848 sendMessage(address, cmd, data, 0); 435 sleep(1);849 //sleep(1); 436 850 } 437 851 if(getconfigint("cec_tv_on", NULL) == 1) … … 439 853 address = 0x00; 440 854 sendMessage(address, cmd, data, 0); 441 sleep(1);855 //sleep(1); 442 856 } 443 857 if(getconfigint("cec_tv_switch", NULL) == 1) … … 449 863 data[2] = '\0'; 450 864 sendMessage(address, cmd, data, 2); 451 sleep(1);865 //sleep(1); 452 866 } 453 867 cecon = 1; 454 } 455 } 456 868 printf("**********wakeup\n"); 869 } 870 if(cecon < 2) 871 { 872 //setFixedPhysicalAddress(getconfigint("cec_fixedAddress", NULL)); 873 //setVolumeForward(); 874 //sendMenuInfo(0x00); 875 cecon = 2; 876 } 877 } 878 879 void forwardKey(int key) 880 { 881 char data[3]; 882 unsigned char address = 0x00; 883 unsigned char cmd = 0x44; 884 885 data[0] = '\0'; 886 887 if(getconfigint("cec_volume", NULL) == 1) 888 address = 0x05; 889 else if(getconfigint("cec_volume", NULL) == 2) 890 address = 0x00; 891 892 if(key == getrcconfigint("rcvolup", NULL)) 893 data[0] = 0x41; 894 else if(key == getrcconfigint("rcvoldown", NULL)) 895 data[0] = 0x42; 896 else if(key == getrcconfigint("rcmute", NULL)) 897 data[0] = 0x43; 898 899 data[1] = '\0'; 900 sendMessage(address, cmd, data, 1); 901 data[0] = '\0'; 902 cmd = 0x45; 903 sendMessage(address, cmd, data, 0); /* release */ 904 } 905 457 906 #endif -
titan/titan/mute.h
r31946 r40413 11 11 struct skin* mute = getscreen("mute"); 12 12 13 if(getconfigint("ForwardVolume", NULL) == 1) 14 { 15 forwardKey(getrcconfigint("rcmute", NULL)); 16 return; 17 } 18 13 19 if(getconfig("stepmute", NULL) == NULL) 14 20 addconfig("stepmute", "0");
Note: See TracChangeset
for help on using the changeset viewer.