Advertisement
Guest User

Untitled

a guest
Mar 8th, 2013
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 50.65 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # TV-B-Gone for N900
  5. # Copyright (C) 2010 Simon Budig  <simon@budig.de>
  6. #
  7. # Codes scanned by Limor Fried & Mitch Altman for the "TV-B-Gone Kit" project.
  8. #
  9. #  This program is free software; you can redistribute it and/or modify
  10. #  it under the terms of the GNU General Public License as published by
  11. #  the Free Software Foundation; either version 2 of the License, or
  12. #  (at your option) any later version.
  13. #
  14. #  This program is distributed in the hope that it will be useful,
  15. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. #  GNU General Public License for more details.
  18. #
  19. #  A copy of the GNU General Public License is available at
  20. #  http://www.fsf.org/licenses/gpl.txt, you can also write to the
  21. #  Free Software  Foundation, Inc., 59 Temple Place - Suite 330,
  22. #  Boston, MA 02111-1307, USA.
  23.  
  24. import os, fcntl, struct, time, math
  25. import gobject, cairo, gtk, gconf
  26. import hildon, hildondesktop, osso
  27.  
  28. GCONFPATH = "/apps/Maemo/budig.de/TVBGone"
  29.  
  30. # Collection of shutdown codes for various TV models.
  31. TVBGoneCodes = {
  32.    "Europe" : [
  33.       # code EU 0
  34.       [ 35714, "510040000000000031026100400000000000310",
  35.         [(430, 470), (430, 910), (430, 83240), (880, 470), (1330, 1330), (2640, 900), (2640, 910)]],
  36.       # code EU 1
  37.       [ 30303, "011111111143261111115326111111",
  38.         [(470, 2650), (510, 540), (510, 1080), (510, 2630), (510, 20530), (510, 116470), (1000, 1090)]],
  39.       # code EU 2
  40.       [ 33333, "0122111222123112211122212",
  41.         [(430, 2060), (460, 2040), (460, 4560), (460, 34880)]],
  42.       # code EU 3
  43.       [ 38400, "3202020020001320202002000",
  44.         [(600, 600), (600, 27000), (1200, 600), (2400, 600)]],
  45.       # code EU 4
  46.       [ 37037, "301000000000001000000000100000000101111001011110124010000000000010000000001000000001011110010111101",
  47.         [(440, 450), (440, 1310), (440, 74620), (3460, 1760), (3460, 1780)]],
  48.       # code EU 5
  49.       [ 38610, "011111221211121421111211212221232111112212111214211112112122212",
  50.         [(240, 1900), (250, 800), (250, 1900), (250, 41990), (250, 47990)]],
  51.       # code EU 6
  52.       [ 38462, "4111000001110000001000000101111112411100000111000000100000010111111",
  53.         [(530, 630), (530, 1720), (530, 44720), (540, 0), (4550, 4680)]],
  54.       # code EU 7
  55.       [ 38462, "311000000111010002110000001110100021100000011101000",
  56.         [(500, 540), (500, 1590), (500, 23070), (8380, 4220)]],
  57.       # code EU 8
  58.       [ 38462, "5000010101111010111101000000101112636",
  59.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  60.       # code EU 9
  61.       [ 35714, "04111111214314111111214",
  62.         [(880, 900), (880, 910), (880, 1810), (880, 89760), (1770, 910)]],
  63.       # code EU 10
  64.       [ 38610, "5000000101111110101001000101101112636",
  65.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  66.       # code EU 11
  67.       [ 38462, "4100011001001001011000110001110012535",
  68.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  69.       # code EU 12
  70.       [ 33445, "0011000111012001100011101",
  71.         [(460, 2060), (460, 4590), (460, 34470)]],
  72.       # code EU 13
  73.       [ 38462, "311011110000000010000111111000000001111111123110111100000000100001111110000000011111111",
  74.         [(530, 590), (530, 1710), (530, 23020), (8950, 4490)]],
  75.       # code EU 14
  76.       [ 38462, "4001010002101010003400101000210101000",
  77.         [(480, 520), (480, 1600), (480, 4000), (480, 23350), (7990, 4000)]],
  78.       # code EU 15
  79.       [ 38462, "301010101101010100011100011000111240101010110101010001110001100011124010101011010101000111000110001112401010101101010100011100011000111",
  80.         [(530, 540), (530, 1560), (530, 25420), (8510, 4250), (8530, 4240)]],
  81.       # code EU 16
  82.       [ 33333, "122000200200000032220002002000000",
  83.         [(280, 920), (280, 2130), (280, 2140), (280, 27710)]],
  84.       # code EU 17
  85.       [ 33333, "01222122212321222122212",
  86.         [(150, 8440), (160, 5570), (160, 8440), (160, 52240)]],
  87.       # code EU 18
  88.       [ 38462, "5000111001110001100111000110001112636",
  89.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  90.       # code EU 19
  91.       [ 38462, "4010000002011100003401000000201110000",
  92.         [(500, 540), (500, 1580), (500, 4180), (500, 24430), (8430, 4180)]],
  93.       # code EU 20
  94.       [ 35714, "020202000000000130202020000000001",
  95.         [(480, 3010), (480, 6510), (480, 10010), (480, 30010)]],
  96.       # code EU 21
  97.       [ 38462, "4110000010101111000010000111011112535",
  98.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  99.       # code EU 22
  100.       [ 38462, "5110010100011010111101000000101112636",
  101.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  102.       # code EU 23
  103.       [ 38462, "4000110000001100000000011111111002535",
  104.         [(530, 600), (530, 1750), (530, 44630), (530, 94530), (8920, 4500), (8950, 2250)]],
  105.       # code EU 24
  106.       [ 38462, "5000111001110001100001000111101112636",
  107.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  108.       # code EU 25
  109.       [ 31250, "21600043170005317000",
  110.         [(490, 520), (490, 1020), (490, 2500), (490, 2520), (490, 23770), (490, 120090), (1000, 520), (1000, 1020)]],
  111.       # code EU 26
  112.       [ 38462, "11111000100211111000100",
  113.         [(140, 4910), (140, 7430), (140, 49260)]],
  114.       # code EU 27
  115.       [ 38462, "5010101011010101010100011010111002636",
  116.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  117.       # code EU 28
  118.       [ 30303, "011111111143216211115321621111",
  119.         [(470, 2670), (500, 550), (500, 1100), (500, 2650), (500, 20550), (500, 121170), (1000, 570)]],
  120.       # code EU 29
  121.       [ 34483, "216000000000000431061000700000531061000700000",
  122.         [(500, 500), (500, 990), (500, 2510), (500, 2520), (500, 14450), (500, 110140), (1020, 490), (1020, 980)]],
  123.       # code EU 30
  124.       [ 38462, "5001000001101111100010000111011112636",
  125.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  126.       # code EU 31
  127.       [ 38462, "311111000111010112111110001110101121111100011101011",
  128.         [(530, 530), (530, 1600), (530, 16970), (8380, 4220)]],
  129.       # code EU 32
  130.       [ 33333, "0122111222113112211122211",
  131.         [(490, 2050), (490, 2060), (490, 4560), (490, 36900)]],
  132.       # code EU 33
  133.       [ 38462, "0222113122211",
  134.         [(480, 1500), (500, 1490), (500, 3470), (500, 29360)]],
  135.       # code EU 34
  136.       [ 38462, "5000110001110011100010000111011112636",
  137.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  138.       # code EU 35
  139.       [ 38462, "5100011100111000100010000111011112636",
  140.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  141.       # code EU 36
  142.       [ 38462, "10111100000210111100000",
  143.         [(140, 4910), (140, 7430), (140, 51780)]],
  144.       # code EU 37
  145.       [ 0, "0011120011",
  146.         [(30, 10020), (30, 14950), (30, 30590)]],
  147.       # code EU 38
  148.       [ 40161, "12222002200322222002200",
  149.         [(130, 4450), (130, 6740), (130, 6750), (130, 45830)]],
  150.       # code EU 39
  151.       [ 35714, "301101001010010010110101124011010010100100101101011",
  152.         [(850, 890), (850, 2640), (850, 34020), (3470, 3500), (3480, 3500)]],
  153.       # code EU 40
  154.       [ 33333, "031313122221141313131222211",
  155.         [(460, 3000), (490, 2980), (490, 6480), (490, 9970), (490, 30560)]],
  156.       # code EU 41
  157.       [ 38462, "4000000011111011001010000101011112535",
  158.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  159.       # code EU 42
  160.       [ 41667, "0",
  161.         [(10370, 42160), (10400, 0)]],
  162.       # code EU 43
  163.       [ 38462, "5000100101110110100000000111111112636",
  164.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  165.       # code EU 44
  166.       [ 41667, "011232112",
  167.         [(1520, 4710), (1540, 1560), (1540, 4690), (1540, 29470)]],
  168.       # code EU 45
  169.       [ 34602, "011222231112222",
  170.         [(150, 4930), (160, 4930), (160, 6980), (160, 14140)]],
  171.       # code EU 46
  172.       [ 0, "1001021001021001",
  173.         [(30, 4960), (30, 7450), (30, 14880)]],
  174.       # code EU 47
  175.       [ 38462, "4000000011101111011001000001101112535",
  176.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  177.       # code EU 48
  178.       [ 38462, "401110000011100000010100011010111251351",
  179.         [(550, 550), (550, 1670), (550, 45770), (550, 95060), (4480, 4450), (4500, 4440)]],
  180.       # code EU 49
  181.       [ 33333, "30000000000111111111110240000000000111111111110",
  182.         [(910, 880), (910, 2670), (910, 36210), (3610, 3580), (3610, 3590)]],
  183.       # code EU 50
  184.       [ 38462, "301010001010010101110101124010100010100101011101011",
  185.         [(840, 880), (840, 2610), (840, 33600), (3470, 3470), (3470, 3480)]],
  186.       # code EU 51
  187.       [ 31250, "01222122212321222122212",
  188.         [(160, 8380), (170, 5580), (170, 8390), (170, 63280)]],
  189.       # code EU 52
  190.       [ 34483, "021222231212222",
  191.         [(150, 4930), (160, 4930), (160, 6980), (160, 14140)]],
  192.       # code EU 53
  193.       [ 31250, "2001504300150",
  194.         [(490, 530), (490, 1040), (490, 2620), (490, 2640), (490, 80300), (1000, 1030)]],
  195.       # code EU 54
  196.       [ 38462, "4000000010111111000011000111001112535",
  197.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  198.       # code EU 55
  199.       [ 38462, "021",
  200.         [(1120, 1070), (1130, 1070), (6770, 27660)]],
  201.       # code EU 56
  202.       [ 38462, "4000000011010111001010000101011112535",
  203.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  204.       # code EU 57
  205.       [ 41667, "021",
  206.         [(3100, 6130), (3100, 6140), (6220, 83120)]],
  207.       # code EU 58
  208.       [ 38462, "021111212122112232211112121221122",
  209.         [(500, 1580), (530, 510), (530, 1560), (530, 21800)]],
  210.       # code EU 59
  211.       [ 35714, "04111124111314111124111",
  212.         [(880, 900), (880, 910), (880, 1810), (880, 89760), (1770, 910)]],
  213.       # code EU 60
  214.       [ 38462, "021121212122112232211212121221122",
  215.         [(500, 1580), (530, 510), (530, 1560), (530, 21800)]],
  216.       # code EU 61
  217.       [ 38462, "4000000011110101001010000101011112535",
  218.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  219.       # code EU 62
  220.       [ 30395, "0111111111431121627531121627",
  221.         [(470, 2670), (500, 550), (500, 1100), (500, 2650), (500, 20550), (500, 121170), (1000, 570), (1000, 1120)]],
  222.       # code EU 63
  223.       [ 30303, "011111111143111216115311121611",
  224.         [(470, 2670), (500, 550), (500, 1100), (500, 2650), (500, 20550), (500, 121170), (1000, 1120)]],
  225.       # code EU 64
  226.       [ 38462, "411010000110100000101000010101111250350",
  227.         [(550, 550), (550, 1670), (550, 45770), (550, 95060), (4480, 4450), (4500, 4440)]],
  228.       # code EU 65
  229.       [ 38462, "10010210010",
  230.         [(940, 4730), (940, 7280), (1020, 16370)]],
  231.       # code EU 66
  232.       [ 38610, "011111111143211116115321111611",
  233.         [(490, 2630), (500, 540), (500, 1080), (500, 2630), (500, 20290), (500, 101990), (1000, 1100)]],
  234.       # code EU 67
  235.       [ 0, "0011111000120011111000",
  236.         [(40, 4990), (40, 7500), (40, 49990)]],
  237.       # code EU 68
  238.       [ 0, "0110111000120110111000",
  239.         [(40, 4990), (40, 7500), (40, 49990)]],
  240.       # code EU 69
  241.       [ 38462, "10111010111210111010111",
  242.         [(140, 4910), (140, 7430), (140, 44220)]],
  243.       # code EU 70
  244.       [ 0, "1111101110121111101110",
  245.         [(50, 5680), (50, 8540), (50, 49990)]],
  246.       # code EU 71
  247.       [ 34483, "012111131121111",
  248.         [(150, 4930), (160, 4930), (160, 6980), (160, 14140)]],
  249.       # code EU 72
  250.       [ 35714, "0111111112143111111111214",
  251.         [(880, 890), (880, 900), (880, 1790), (880, 89770), (1770, 900)]],
  252.       # code EU 73
  253.       [ 0, "0011101110120011101110",
  254.         [(60, 5660), (60, 8510), (60, 54740)]],
  255.       # code EU 74
  256.       [ 38462, "02222122212322222122212",
  257.         [(140, 8430), (160, 5550), (160, 8410), (160, 49110)]],
  258.       # code EU 75
  259.       [ 30303, "011111111143112162115311216211",
  260.         [(470, 2670), (500, 550), (500, 1100), (500, 2650), (500, 20550), (500, 121170), (1000, 570)]],
  261.       # code EU 76
  262.       [ 0, "21000031000",
  263.         [(60, 9250), (60, 13390), (60, 20980), (60, 27870)]],
  264.       # code EU 77
  265.       [ 38462, "3000000011100011011110000000011112400000001110001101111000000001111",
  266.         [(530, 590), (530, 1700), (530, 43590), (8920, 4480), (8930, 4480)]],
  267.       # code EU 78
  268.       [ 38462, "3000000010010011010010010011011012400000001001001101001001001101101",
  269.         [(550, 570), (550, 1670), (550, 44160), (8950, 4480), (8970, 4470)]],
  270.       # code EU 79
  271.       [ 38462, "0122112212111213212212112122212321221122121112132122121121222123212211221211121",
  272.         [(260, 1850), (270, 800), (270, 1850), (270, 42490)]],
  273.       # code EU 80
  274.       [ 40000, "3010101011010101011011000001001112401010101101010101101100000100111",
  275.         [(510, 560), (510, 1620), (510, 28420), (8480, 4300), (8500, 4290)]],
  276.       # code EU 81
  277.       [ 33333, "03434041404230404044404",
  278.         [(160, 5590), (160, 8470), (160, 59000), (170, 5590), (170, 8470)]],
  279.       # code EU 82
  280.       [ 38462, "12222200000322222200000",
  281.         [(160, 4840), (160, 7380), (160, 7390), (160, 47950)]],
  282.       # code EU 83
  283.       [ 38462, "4110110002111110003411011000211111000",
  284.         [(480, 520), (480, 1600), (480, 4000), (480, 21200), (7990, 4000)]],
  285.       # code EU 84
  286.       [ 33333, "21303133013431330133010",
  287.         [(160, 8510), (170, 5540), (170, 8500), (170, 8510), (170, 48470)]],
  288.       # code EU 85
  289.       [ 38462, "11111100000211111100000",
  290.         [(140, 4910), (140, 7430), (140, 51260)]],
  291.       # code EU 86
  292.       [ 38462, "10111110100210111110100",
  293.         [(140, 4910), (140, 7430), (140, 48740)]],
  294.       # code EU 87
  295.       [ 38462, "4101010002101010003410101000210101000",
  296.         [(480, 520), (480, 1600), (480, 4000), (480, 23350), (7990, 4000)]],
  297.       # code EU 88
  298.       [ 0, "3000021000001343000021000001",
  299.         [(30, 90), (30, 190), (30, 290), (30, 390), (30, 99680)]],
  300.       # code EU 89
  301.       [ 38462, "20000001000002320000001000002",
  302.         [(150, 1380), (150, 4460), (150, 6050), (150, 65650)]],
  303.       # code EU 90
  304.       [ 40000, "102020000032020200000",
  305.         [(480, 500), (480, 1480), (480, 1490), (480, 14240)]],
  306.       # code EU 91
  307.       [ 35714, "0111212221",
  308.         [(870, 6390), (880, 2750), (880, 6390)]],
  309.       # code EU 92
  310.       [ 0, "3010021000000343010021000000",
  311.         [(30, 80), (30, 180), (30, 240), (30, 380), (30, 99690)]],
  312.       # code EU 93
  313.       [ 34483, "022222231222222",
  314.         [(150, 4930), (160, 4930), (160, 6980), (160, 14140)]],
  315.       # code EU 94
  316.       [ 38462, "01112113111124651112113111124",
  317.         [(130, 6080), (140, 1410), (140, 2960), (140, 4510), (140, 6060), (140, 6080), (140, 62070)]],
  318.       # code EU 95
  319.       [ 34483, "012122231121222",
  320.         [(150, 4930), (160, 4930), (160, 6980), (160, 14140)]],
  321.       # code EU 96
  322.       [ 0, "20000001000023201111010000",
  323.         [(30, 80), (30, 180), (30, 280), (30, 127310)]],
  324.       # code EU 97
  325.       [ 35714, "215000000000000321051000000060421051000000060",
  326.         [(460, 530), (460, 1060), (460, 2600), (460, 15020), (460, 109620), (930, 530), (930, 1060)]],
  327.       # code EU 98
  328.       [ 0, "20000010000023201111100000",
  329.         [(30, 80), (30, 180), (30, 280), (30, 127310)]],
  330.       # code EU 99
  331.       [ 38462, "11111100001211111100001",
  332.         [(140, 4910), (140, 7430), (140, 46740)]],
  333.       # code EU 100
  334.       [ 38462, "10111110000210111110000",
  335.         [(140, 4910), (140, 7430), (140, 51260)]],
  336.       # code EU 101
  337.       [ 34483, "02212122212322212122212",
  338.         [(440, 8150), (450, 5280), (450, 8150), (450, 50000)]],
  339.       # code EU 102
  340.       [ 38462, "10101000000210101000000",
  341.         [(140, 4910), (140, 7430), (140, 58810)]],
  342.       # code EU 103
  343.       [ 38610, "4101000010110001001001000101101112535",
  344.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  345.       # code EU 104
  346.       [ 38462, "0261111111111111432162111177625321621111776253216211117762",
  347.         [(480, 2460), (500, 470), (500, 940), (500, 2450), (500, 14880), (500, 109700), (1000, 470), (1000, 940)]],
  348.       # code EU 105
  349.       [ 33333, "30404240424144040204020",
  350.         [(160, 8470), (160, 59000), (170, 5590), (170, 8460), (170, 8470)]],
  351.       # code EU 106
  352.       [ 38462, "10111110011210111110011",
  353.         [(140, 4910), (140, 7430), (140, 46220)]],
  354.       # code EU 107
  355.       [ 38462, "012121111132121211111",
  356.         [(240, 1850), (270, 780), (270, 1830), (270, 15420)]],
  357.       # code EU 108
  358.       [ 38462, "3101000001010000001000000101111112410100000101000000100000010111111",
  359.         [(560, 550), (560, 1680), (560, 48500), (4470, 4530), (4480, 4530)]],
  360.       # code EU 109
  361.       [ 31250, "10500032060004206000",
  362.         [(490, 520), (490, 2500), (490, 2520), (490, 23770), (490, 120090), (1000, 520), (1000, 1020)]],
  363.       # code EU 110
  364.       [ 38462, "400010000000100001111000000001111251351",
  365.         [(550, 550), (550, 1670), (550, 50230), (550, 95060), (4480, 4450), (4500, 4440)]],
  366.       # code EU 111
  367.       [ 31250, "2150004315000",
  368.         [(490, 530), (490, 1040), (490, 2620), (490, 2640), (490, 80300), (1000, 1030)]],
  369.       # code EU 112
  370.       [ 30303, "011111111143216121115321612111",
  371.         [(470, 2670), (500, 550), (500, 1100), (500, 2650), (500, 20550), (500, 121170), (1000, 570)]],
  372.       # code EU 113
  373.       [ 58824, "4111100111011000011000100231111001110110000110001002311110011101100001100010",
  374.         [(480, 980), (480, 1960), (970, 8360), (3950, 3880), (19310, 3890)]],
  375.       # code EU 114
  376.       [ 0, "2000000100000232000000100000",
  377.         [(30, 90), (30, 310), (30, 420), (30, 109570)]],
  378.       # code EU 115
  379.       [ 31250, "1040003204000",
  380.         [(490, 530), (490, 2620), (490, 2640), (490, 80300), (1000, 1030)]],
  381.       # code EU 116
  382.       [ 34483, "02222122212322222122212",
  383.         [(440, 8150), (450, 5280), (450, 8150), (450, 47130)]],
  384.       # code EU 117
  385.       [ 38462, "10101010000210101010000",
  386.         [(140, 4910), (140, 7430), (140, 54300)]],
  387.       # code EU 118
  388.       [ 38462, "022222222221111211111111111111111111221132222222222211112111111111111111111112211",
  389.         [(190, 780), (210, 270), (210, 770), (210, 37850), (220, 0)]],
  390.       # code EU 119
  391.       [ 38462, "310000111100001111000011124100001111000011110000111",
  392.         [(840, 880), (840, 2610), (840, 33600), (3470, 3470), (3470, 3480)]],
  393.       # code EU 120
  394.       [ 38462, "011222222222111122111111111111111111221132112222222221111221111111111111111112211",
  395.         [(190, 780), (210, 270), (210, 770), (210, 37850), (220, 0)]],
  396.       # code EU 121
  397.       [ 40000, "12222200002322222200002",
  398.         [(130, 4900), (130, 7410), (130, 7420), (130, 54430)]],
  399.       # code EU 122
  400.       [ 38462, "4001010002111110003400101000211111000",
  401.         [(500, 540), (500, 1580), (500, 4070), (500, 21530), (8430, 4070)]],
  402.       # code EU 123
  403.       [ 38462, "4110000010101111000010000111011112511000001010111100001000011101111",
  404.         [(550, 560), (550, 1680), (550, 39290), (560, 0), (8820, 4540), (8840, 4520)]],
  405.       # code EU 124
  406.       [ 38462, "5000000001111111100000000111111112636",
  407.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  408.       # code EU 125
  409.       [ 38462, "10101000111210101000111",
  410.         [(140, 4910), (140, 7430), (140, 51260)]],
  411.       # code EU 126
  412.       [ 41667, "0134213",
  413.         [(1520, 4710), (1540, 1560), (1540, 4690), (1540, 7820), (1540, 29470)]],
  414.       # code EU 127
  415.       [ 38462, "21600000000000004310610000770753106100007707",
  416.         [(500, 500), (500, 990), (500, 2510), (500, 2520), (500, 14490), (500, 110140), (1020, 490), (1020, 980)]],
  417.       # code EU 128
  418.       [ 38462, "21600000000000004310610000761753106100007617",
  419.         [(500, 500), (500, 990), (500, 2510), (500, 2520), (500, 14490), (500, 110140), (1020, 490), (1020, 980)]],
  420.       # code EU 129
  421.       [ 38462, "11111111100211111111100",
  422.         [(140, 4910), (140, 7430), (140, 41700)]],
  423.       # code EU 130
  424.       [ 0, "0011110000120011110000",
  425.         [(40, 4990), (40, 7500), (40, 49990)]],
  426.       # code EU 131
  427.       [ 38462, "11111110010211111110010",
  428.         [(140, 4910), (140, 7430), (140, 44220)]],
  429.       # code EU 132
  430.       [ 40000, "10000022200320000022200",
  431.         [(130, 4900), (130, 7410), (130, 7420), (130, 59390)]],
  432.       # code EU 133
  433.       [ 0, "1110101110121110101110",
  434.         [(60, 5660), (60, 8510), (60, 51880)]],
  435.       # code EU 134
  436.       [ 38462, "5000000001111111110000000011111112636",
  437.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  438.       # code EU 135
  439.       [ 35714, "051125121531511251215",
  440.         [(860, 910), (870, 900), (870, 1800), (870, 88680), (880, 0), (1740, 900)]],
  441.       # code EU 136
  442.       [ 0, "0011120011",
  443.         [(40, 10360), (40, 15070), (40, 30050)]],
  444.       # code EU 137
  445.       [ 0, "31111112111113431111112111113",
  446.         [(0, 0), (140, 1410), (140, 4520), (140, 6070), (140, 63100)]],
  447.    ],
  448.  
  449.    "North America" : [
  450.       # code NA 0
  451.       [ 38400, "3202020020001320202002000",
  452.         [(600, 600), (600, 27000), (1200, 600), (2400, 600)]],
  453.       # code NA 1
  454.       [ 57143, "311110010101000001101010123111100101010000011010101",
  455.         [(500, 1000), (500, 2000), (500, 8000), (4000, 4000)]],
  456.       # code NA 2
  457.       [ 37037, "301000000000001000000000100000000101111001011110124010000000000010000000001000000001011110010111101",
  458.         [(420, 460), (420, 1330), (420, 75190), (3470, 1760), (3470, 1770)]],
  459.       # code NA 3
  460.       [ 38610, "011111221211121321111211212221232111112212111213211112112122212",
  461.         [(260, 1850), (270, 800), (270, 1850), (270, 45490)]],
  462.       # code NA 4
  463.       [ 38610, "5000000101111110101001000101101112636",
  464.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  465.       # code NA 5
  466.       [ 35714, "04111111214314111111214",
  467.         [(880, 900), (880, 910), (880, 1810), (880, 89760), (1770, 910)]],
  468.       # code NA 6
  469.       [ 38462, "3111000001110000001000000101111112411100000111000000100000010111111",
  470.         [(500, 620), (500, 1720), (500, 45410), (4480, 4660), (4500, 4650)]],
  471.       # code NA 7
  472.       [ 39216, "023121231231233141231212312312331",
  473.         [(490, 490), (490, 500), (490, 4100), (490, 5100), (490, 121070)]],
  474.       # code NA 8
  475.       [ 38462, "3100011100111000101010010101011012410001110011100010101001010101101",
  476.         [(560, 580), (560, 1700), (560, 40110), (8980, 4500), (9000, 4490)]],
  477.       # code NA 9
  478.       [ 38462, "4111000010100010000000111111110002535",
  479.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  480.       # code NA 10
  481.       [ 38462, "311000000111010002110000001110100021100000011101000",
  482.         [(510, 550), (510, 1580), (510, 22860), (8410, 4190)]],
  483.       # code NA 11
  484.       [ 38462, "5000010101111010111101000000101112636",
  485.         [(550, 550), (550, 1720), (550, 40390), (550, 93480), (560, 0), (8840, 4420), (8850, 2250)]],
  486.       # code NA 12
  487.       [ 38462, "310110101100001010010011124101101011000010100100111",
  488.         [(810, 870), (810, 2540), (810, 32800), (3310, 3360), (3310, 3370)]],
  489.       # code NA 13
  490.       [ 38462, "40011100010000110001110111101001000101101112535",
  491.         [(530, 550), (530, 1670), (530, 23040), (530, 93690), (8930, 4480), (8950, 4470)]],
  492.       # code NA 14
  493.       [ 38462, "5000001101111100111000000001111112636",
  494.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  495.       # code NA 15
  496.       [ 38462, "5010000101011110110000000011111112636",
  497.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  498.       # code NA 16
  499.       [ 34483, "111000100100000021110001001000000",
  500.         [(280, 900), (280, 2110), (280, 25070)]],
  501.       # code NA 17
  502.       [ 40000, "5000111001110001101001000101101112434",
  503.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  504.       # code NA 18
  505.       [ 38462, "301010101101010100011100011000111240101010110101010001110001100011124010101011010101000111000110001112401010101101010100011100011000111",
  506.         [(510, 550), (510, 1610), (510, 25660), (8490, 4290), (8490, 4300)]],
  507.       # code NA 19
  508.       [ 38462, "300101000110001100000000000100001001000010100000024001010001100011000000000001000010010000101000000",
  509.         [(400, 420), (400, 1240), (400, 46010), (3250, 1630), (3260, 1630)]],
  510.       # code NA 20
  511.       [ 38462, "5001000001101111100010000111011112636",
  512.         [(600, 550), (600, 1630), (600, 40990), (600, 96980), (610, 0), (8980, 4610), (9000, 2300)]],
  513.       # code NA 21
  514.       [ 38462, "4001010002101010003400101000210101000",
  515.         [(480, 520), (480, 1600), (480, 4000), (480, 23350), (7990, 4000)]],
  516.       # code NA 22
  517.       [ 38462, "4000110000001100000000011111111002535",
  518.         [(530, 600), (530, 1750), (530, 44630), (530, 94530), (8920, 4500), (8950, 2250)]],
  519.       # code NA 23
  520.       [ 40000, "2201012012012201012013220101201201220101201",
  521.         [(480, 520), (480, 4090), (480, 5040), (480, 104610)]],
  522.       # code NA 24
  523.       [ 38462, "3222202020001422220202000",
  524.         [(580, 600), (580, 25690), (1180, 600), (2370, 600), (2380, 600)]],
  525.       # code NA 25
  526.       [ 38462, "311111110000000000001111124111111100000000000011111",
  527.         [(840, 900), (840, 2640), (840, 34700), (3460, 3500), (3470, 3500)]],
  528.       # code NA 26
  529.       [ 39216, "023121233123123141231212331231231",
  530.         [(490, 490), (490, 500), (490, 4100), (490, 5100), (490, 125820)]],
  531.       # code NA 27
  532.       [ 57143, "301110010101010001101010123011100101010100011010101",
  533.         [(500, 1000), (500, 2000), (500, 8000), (4000, 4000)]],
  534.       # code NA 28
  535.       [ 38610, "30101011011000101230101011011000101",
  536.         [(1180, 1210), (1180, 2710), (1180, 47500), (2580, 2710)]],
  537.       # code NA 29
  538.       [ 35842, "031111232141311112321",
  539.         [(880, 900), (880, 910), (880, 1810), (1770, 910), (1770, 89760)]],
  540.       # code NA 30
  541.       [ 38462, "4000010101011010100000000111111112535",
  542.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  543.       # code NA 31
  544.       [ 35842, "01411111214311411111214",
  545.         [(880, 890), (880, 900), (880, 1790), (880, 89770), (1770, 900)]],
  546.       # code NA 32
  547.       [ 38462, "4000010101011010101000000101111112535",
  548.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  549.       # code NA 33
  550.       [ 38462, "300101000110001100000000000100001010100010000000024001010001100011000000000001000010101000100000000",
  551.         [(400, 430), (400, 1220), (400, 52970), (3340, 1560), (3360, 1550)]],
  552.       # code NA 34
  553.       [ 38462, "5000010101111010111111100000000112636",
  554.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  555.       # code NA 35
  556.       [ 41667, "011212121131112121211",
  557.         [(960, 930), (970, 930), (970, 2870), (970, 34310)]],
  558.       # code NA 36
  559.       [ 37037, "0111212221",
  560.         [(820, 5810), (840, 2500), (840, 5800), (850, 0)]],
  561.       # code NA 37
  562.       [ 41667, "2000101100",
  563.         [(390, 2630), (1640, 1630), (5140, 1640)]],
  564.       # code NA 38
  565.       [ 40000, "5101010000101011101001000101101112434",
  566.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  567.       # code NA 39
  568.       [ 40000, "010",
  569.         [(1130, 1010), (6880, 27070)]],
  570.       # code NA 40
  571.       [ 40000, "0012001",
  572.         [(1130, 1010), (1130, 2010), (1130, 27070)]],
  573.       # code NA 41
  574.       [ 76923, "3202020020001320202002000",
  575.         [(580, 620), (580, 27460), (1170, 620), (2420, 620)]],
  576.       # code NA 42
  577.       [ 40000, "5110000010101111000010000111011112434",
  578.         [(540, 650), (540, 1700), (540, 40990), (540, 86680), (8990, 2260), (8990, 4210)]],
  579.       # code NA 43
  580.       [ 40000, "01111311111211111311111",
  581.         [(430, 1200), (430, 1210), (430, 34910), (1310, 450)]],
  582.       # code NA 44
  583.       [ 40000, "4111000000001111101000000101111112535",
  584.         [(510, 510), (510, 1600), (510, 40960), (510, 95130), (4310, 4360), (8830, 2190)]],
  585.       # code NA 45
  586.       [ 38462, "401100000011000001111000000001111251351",
  587.         [(580, 530), (580, 1670), (580, 44940), (580, 96790), (4550, 4490), (4560, 4490)]],
  588.       # code NA 46
  589.       [ 29412, "0261114321111153211111",
  590.         [(510, 2770), (520, 530), (520, 1050), (520, 2770), (520, 25270), (520, 128090), (1030, 540)]],
  591.       # code NA 47
  592.       [ 40000, "5000010001111011111110111000010002434",
  593.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  594.       # code NA 48
  595.       [ 40000, "4000000001111111111110000000011112535",
  596.         [(510, 510), (510, 1600), (510, 40960), (510, 95130), (4310, 4360), (8830, 2190)]],
  597.       # code NA 49
  598.       [ 45455, "0110010110",
  599.         [(2740, 8540), (2740, 19860)]],
  600.       # code NA 50
  601.       [ 55556, "30000000000111111111110230000000000111111111110",
  602.         [(800, 880), (800, 2540), (800, 37500), (3590, 3310)]],
  603.       # code NA 51
  604.       [ 40000, "5001000111101110000011000111001112434",
  605.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  606.       # code NA 52
  607.       [ 40000, "5111011000001001101001000101101112434",
  608.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  609.       # code NA 53
  610.       [ 55556, "02020201100001302020201100001",
  611.         [(510, 2320), (510, 5120), (510, 7920), (510, 28830)]],
  612.       # code NA 54
  613.       [ 55556, "020202000111130202020001111",
  614.         [(510, 2320), (510, 5120), (510, 7920), (510, 28830)]],
  615.       # code NA 55
  616.       [ 0, "20011101011023200111010110",
  617.         [(30, 100), (30, 200), (30, 300), (30, 127780)]],
  618.       # code NA 56
  619.       [ 37175, "0222111",
  620.         [(550, 1930), (570, 1920), (570, 3840), (580, 0)]],
  621.       # code NA 57
  622.       [ 40000, "0222113122211",
  623.         [(450, 1480), (460, 1480), (460, 3510), (460, 27810)]],
  624.       # code NA 58
  625.       [ 33333, "43322010010022222",
  626.         [(220, 1010), (220, 2190), (230, 1010), (230, 2190), (310, 2180)]],
  627.       # code NA 59
  628.       [ 40000, "5101101100100100100101000110101112434",
  629.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  630.       # code NA 60
  631.       [ 40000, "5000001001111101110001000011101112434",
  632.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  633.       # code NA 61
  634.       [ 40000, "5000001011111101011010000001011112434",
  635.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  636.       # code NA 62
  637.       [ 40000, "5000101001110101111010000001011112434",
  638.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  639.       # code NA 63
  640.       [ 40000, "5111111110000000011111100000000112434",
  641.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  642.       # code NA 64
  643.       [ 57143, "300000011101111111100010023000000111011111111000100",
  644.         [(500, 1000), (500, 2000), (500, 8000), (4000, 4000)]],
  645.       # code NA 65
  646.       [ 59172, "41111001110110000110001002311110011101100001100010023111100111011000011000100",
  647.         [(480, 980), (480, 1970), (980, 8460), (3950, 3920), (19530, 3920)]],
  648.       # code NA 66
  649.       [ 38462, "30001011000200010110002000101100",
  650.         [(380, 2760), (1650, 1540), (4150, 1550), (7420, 1540)]],
  651.       # code NA 67
  652.       [ 40000, "4000111111110000001000000101111112535",
  653.         [(510, 510), (510, 1600), (510, 40960), (510, 95130), (4310, 4360), (8830, 2190)]],
  654.       # code NA 68
  655.       [ 40000, "20300300003130300300003",
  656.         [(430, 1210), (430, 94370), (1300, 450), (1310, 450)]],
  657.       # code NA 69
  658.       [ 40000, "5000000001111111111010000001011112434",
  659.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  660.       # code NA 70
  661.       [ 38462, "10000002002022023200000020020220",
  662.         [(270, 760), (270, 1820), (270, 1830), (270, 31990)]],
  663.       # code NA 71
  664.       [ 55556, "0101100",
  665.         [(370, 1810), (370, 2720)]],
  666.       # code NA 72
  667.       [ 40000, "5011000000110000000101000110101112434",
  668.         [(540, 650), (540, 1700), (540, 40990), (540, 86680), (8990, 2260), (8990, 4210)]],
  669.       # code NA 73
  670.       [ 40000, "5010101011010101000000001111111102434",
  671.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  672.       # code NA 74
  673.       [ 40000, "5100010100111010100010000111011112434",
  674.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  675.       # code NA 75
  676.       [ 41667, "300000010101011111101010124000000101010111111010101",
  677.         [(510, 980), (510, 1940), (1020, 9310), (3900, 3900), (3900, 3910)]],
  678.       # code NA 76
  679.       [ 40000, "5011101101000100100101000110101112434",
  680.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  681.       # code NA 77
  682.       [ 35714, "041211421431412114214",
  683.         [(880, 890), (880, 900), (880, 1790), (880, 89770), (1770, 900)]],
  684.       # code NA 78
  685.       [ 38462, "200010110010000101100100001011001",
  686.         [(400, 2750), (1600, 1540), (4800, 1550)]],
  687.       # code NA 79
  688.       [ 40000, "5010101011010101011100101000110102434",
  689.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  690.       # code NA 80
  691.       [ 0, "20011100100023200111001000",
  692.         [(30, 100), (30, 200), (30, 300), (30, 127780)]],
  693.       # code NA 81
  694.       [ 40000, "012010120120122010130120101201201220101",
  695.         [(480, 520), (480, 4090), (480, 5040), (480, 99780)]],
  696.       # code NA 82
  697.       [ 35714, "02411111125312411111125",
  698.         [(880, 890), (880, 900), (880, 1790), (880, 88880), (1770, 900), (1770, 1790)]],
  699.       # code NA 83
  700.       [ 35714, "04111111214314111111214",
  701.         [(880, 890), (880, 900), (880, 1790), (880, 89770), (1770, 900)]],
  702.       # code NA 84
  703.       [ 37037, "301000000000001000000100100000000101111001011010124010000000000010000001001000000001011110010110101",
  704.         [(410, 430), (410, 1280), (410, 74760), (3360, 1710), (3380, 1690)]],
  705.       # code NA 85
  706.       [ 38462, "3100000000000100001002410000000000010000100",
  707.         [(550, 600), (550, 1650), (550, 22840), (4450, 4370), (4480, 4360)]],
  708.       # code NA 86
  709.       [ 37175, "301010101010110101111000101001000011010001000101124010101010101101011110001010010000110100010001011",
  710.         [(420, 460), (420, 1260), (420, 69890), (3470, 1760), (3470, 1770)]],
  711.       # code NA 87
  712.       [ 38462, "5000110001110011100010000111011112434",
  713.         [(560, 690), (560, 1740), (560, 41650), (560, 95850), (8800, 2220), (8800, 4350)]],
  714.       # code NA 88
  715.       [ 38610, "4000010001011010011111000000001112535",
  716.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  717.       # code NA 89
  718.       [ 38462, "5000100001110111101001000101101112636",
  719.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  720.       # code NA 90
  721.       [ 35714, "0412542143141254214",
  722.         [(880, 900), (880, 910), (880, 1810), (880, 89760), (1770, 910), (1770, 1810)]],
  723.       # code NA 91
  724.       [ 58824, "311110011101100001100010023111100111011000011000100",
  725.         [(480, 1000), (480, 2000), (480, 10500), (4000, 4000)]],
  726.       # code NA 92
  727.       [ 38462, "3101000001010000001000000101111112310100000101000000100000010111111",
  728.         [(540, 560), (540, 1700), (540, 49270), (4510, 4470)]],
  729.       # code NA 93
  730.       [ 38462, "3011000010100000010010010011011012401100001010000001001001001101101",
  731.         [(550, 570), (550, 1670), (550, 44000), (8950, 4480), (8970, 4470)]],
  732.       # code NA 94
  733.       [ 35714, "041121421431411214214",
  734.         [(880, 900), (880, 910), (880, 1810), (880, 89760), (1770, 910)]],
  735.       # code NA 95
  736.       [ 38462, "400010000000100001101000000101111241341",
  737.         [(560, 580), (560, 1740), (560, 45490), (560, 94480), (4400, 4460)]],
  738.       # code NA 96
  739.       [ 38462, "4010010001111111101110000100011112535",
  740.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  741.       # code NA 97
  742.       [ 38462, "4110000011010101001000011101111002535",
  743.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  744.       # code NA 98
  745.       [ 38462, "5000000001111111110001010011101012636",
  746.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  747.       # code NA 99
  748.       [ 38462, "4000000001011110110000000011111112535",
  749.         [(530, 560), (530, 1710), (530, 39500), (530, 95990), (8980, 4510), (9000, 2260)]],
  750.       # code NA 100
  751.       [ 35842, "022111211211111132221112112111111",
  752.         [(430, 1710), (450, 600), (450, 1700), (540, 23010)]],
  753.       # code NA 101
  754.       [ 38462, "5000001101111100100000000111111112636",
  755.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  756.       # code NA 102
  757.       [ 40000, "310010100000101101011111024100101000001011010111110",
  758.         [(860, 870), (860, 2580), (860, 33380), (3460, 3480), (3480, 3470)]],
  759.       # code NA 103
  760.       [ 38462, "400010000000100001111000000001111251351",
  761.         [(580, 530), (580, 1670), (580, 44940), (580, 96790), (4550, 4490), (4560, 4490)]],
  762.       # code NA 104
  763.       [ 40000, "5100011100111000100010000111011112434",
  764.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  765.       # code NA 105
  766.       [ 40000, "5110000010011111011111111000000002434",
  767.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  768.       # code NA 106
  769.       [ 40000, "4000100001110111111110000000011112535",
  770.         [(510, 510), (510, 1600), (510, 40960), (510, 95130), (4310, 4360), (8830, 2190)]],
  771.       # code NA 107
  772.       [ 38462, "400000000000000001111000000001111251351",
  773.         [(580, 530), (580, 1670), (580, 44940), (580, 96790), (4550, 4490), (4560, 4490)]],
  774.       # code NA 108
  775.       [ 38462, "401101000011010001111000000001111251351",
  776.         [(580, 530), (580, 1670), (580, 44940), (580, 96790), (4550, 4490), (4560, 4490)]],
  777.       # code NA 109
  778.       [ 40000, "5000001011111101001010000101011113424",
  779.         [(580, 610), (580, 2110), (580, 95820), (730, 41640), (8830, 2110), (10500, 4940)]],
  780.       # code NA 110
  781.       [ 40161, "5110000010011111000010000111011112434",
  782.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  783.       # code NA 111
  784.       [ 40000, "4111111110000000011110000000011112535",
  785.         [(510, 510), (510, 1600), (510, 40960), (510, 95130), (4310, 4360), (8830, 2190)]],
  786.       # code NA 112
  787.       [ 38462, "5100000000111111110000000011111112636",
  788.         [(550, 570), (550, 1700), (550, 39490), (550, 96230), (560, 0), (8980, 4530), (9000, 2260)]],
  789.       # code NA 113
  790.       [ 40000, "3000000010001011010010010011011012400000001000101101001001001101101",
  791.         [(560, 540), (560, 1660), (560, 39450), (8960, 4420), (8960, 4430)]],
  792.       # code NA 114
  793.       [ 40000, "4101010002101010003510101000210101000",
  794.         [(440, 500), (440, 1470), (440, 4470), (440, 22360), (7910, 3980), (7930, 3970)]],
  795.       # code NA 115
  796.       [ 40000, "301010001010010101110101124010100010100101011101011",
  797.         [(810, 860), (810, 2960), (810, 33490), (3280, 3310), (3290, 3310)]],
  798.       # code NA 116
  799.       [ 40000, "5000010001111011110001000011101112434",
  800.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  801.       # code NA 117
  802.       [ 41667, "4100000002011100003510000000201110000",
  803.         [(490, 540), (490, 1580), (490, 4200), (490, 24460), (8190, 4200), (8210, 4190)]],
  804.       # code NA 118
  805.       [ 40000, "4111011110001000011110000000011112535",
  806.         [(510, 510), (510, 1600), (510, 40960), (510, 95130), (4310, 4360), (8830, 2190)]],
  807.       # code NA 119
  808.       [ 55556, "5001000001101111100010000111011112434",
  809.         [(550, 630), (550, 1710), (550, 40940), (550, 95080), (8810, 2190), (8810, 4380)]],
  810.       # code NA 120
  811.       [ 40000, "5001100001100111111111000000001112434",
  812.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  813.       # code NA 121
  814.       [ 40000, "5000010001111011100010000111011112434",
  815.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  816.       # code NA 122
  817.       [ 52632, "40000000000111111111001240000000000111111111001",
  818.         [(800, 950), (800, 2490), (800, 38670), (810, 0), (3290, 3220)]],
  819.       # code NA 123
  820.       [ 40000, "5000111001110001100111000110001112434",
  821.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  822.       # code NA 124
  823.       [ 40000, "4000011001111001100000000111111112535",
  824.         [(540, 560), (540, 1510), (540, 40920), (540, 86770), (9000, 4210), (9010, 2260)]],
  825.       # code NA 125
  826.       [ 55556, "5000111001110001101001000101101112434",
  827.         [(550, 630), (550, 1710), (550, 40940), (550, 95080), (8810, 2190), (8810, 4380)]],
  828.       # code NA 126
  829.       [ 40000, "5101000010101111000010000111011112434",
  830.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  831.       # code NA 127
  832.       [ 25641, "0123112",
  833.         [(1140, 1000), (1150, 1000), (1150, 2000), (1150, 27060)]],
  834.       # code NA 128
  835.       [ 40000, "300010100000111101011111024000101000001111010111110",
  836.         [(860, 870), (860, 2580), (860, 33380), (3460, 3480), (3480, 3470)]],
  837.       # code NA 129
  838.       [ 40000, "5111111110000000000010000111011112434",
  839.         [(560, 570), (560, 1750), (560, 41500), (560, 94990), (8980, 2270), (8980, 4490)]],
  840.       # code NA 130
  841.       [ 37037, "310000101110101111010001024100001011101011110100010",
  842.         [(880, 900), (880, 2580), (880, 22470), (3580, 3490), (3580, 3500)]],
  843.       # code NA 131
  844.       [ 40000, "5001010001101011111011000001001112434",
  845.         [(540, 650), (540, 1700), (540, 40990), (540, 86680), (8990, 2260), (8990, 4210)]],
  846.       # code NA 132
  847.       [ 83333, "0202020000000113020202000000011",
  848.         [(280, 1060), (280, 2380), (280, 3700), (280, 11730)]],
  849.       # code NA 133
  850.       [ 41667, "02222111221322222111221",
  851.         [(130, 7410), (150, 4890), (150, 7400), (170, 46410), (180, 0)]],
  852.       # code NA 134
  853.       [ 40000, "3011000011010000011110000000011112401100001101000001111000000001111",
  854.         [(560, 540), (560, 1660), (560, 39450), (8960, 4420), (8960, 4430)]],
  855.       # code NA 135
  856.       [ 38462, "300111110000001100000111111000000001111111124001111100000011000001111110000000011111111",
  857.         [(530, 590), (530, 1710), (530, 23010), (8920, 4500), (8950, 4480)]],
  858.       # code NA 136
  859.       [ 38610, "411011110000000010000111111000000001111111125110111100000000100001111110000000011111111",
  860.         [(530, 590), (530, 1710), (530, 23010), (550, 0), (8920, 4500), (8950, 4480)]],
  861.    ],
  862. }
  863.  
  864.  
  865. # main class implementing the hildon desktop applet
  866.  
  867. class TVBGone (hildondesktop.HomePluginItem):
  868.    def __init__ (self):
  869.       hildondesktop.HomePluginItem.__init__ (self)
  870.  
  871.       os.system ("sudo /sbin/modprobe lirc_rx51")
  872.       self.set_settings (True)
  873.       self.connect ('show-settings', self.settings_dialog)
  874.       self.connect ('button-release-event', self.button_release_event)
  875.       self.set_size_request (90, 90)
  876.       self.index = 0
  877.       self.progress = 0.0
  878.       self.timeout = None
  879.       self.lircdev = None
  880.       self.starttime = 0
  881.       # fix up codes for N900's poor driver by adjusting the times
  882.       for codelist in TVBGoneCodes.values():
  883.          for c in codelist:
  884.             timings = [(max (5, pulse - 141),
  885.                         max (5, gap - 104)) for pulse, gap in c[2]]
  886.             c[2] = timings
  887.  
  888.       conf_client = gconf.client_get_default ()
  889.       conf_client.add_dir (GCONFPATH, gconf.CLIENT_PRELOAD_NONE)
  890.       self.codeid = conf_client.get_string (GCONFPATH + "/codeid")
  891.       if not TVBGoneCodes.has_key (self.codeid):
  892.          self.codeid = "Europe"
  893.       self.codes = TVBGoneCodes[self.codeid]
  894.  
  895.  
  896.    def do_realize (self):
  897.       self.set_colormap (self.get_screen ().get_rgba_colormap ())
  898.       self.set_app_paintable (True)
  899.       hildondesktop.HomePluginItem.do_realize (self)
  900.  
  901.  
  902.    def do_expose_event (self, event):
  903.       a = event.area
  904.       cr = self.window.cairo_create()
  905.  
  906.       # rounded rectangle as a base
  907.       r = min (15, a.width / 2, a.height / 2)
  908.       cr.move_to (0, r)
  909.       cr.arc (r, r, r, math.pi, 1.5 * math.pi)
  910.       cr.line_to (a.width - r, 0)
  911.       cr.arc (a.width - r, r, r, 1.5 * math.pi, 0)
  912.       cr.line_to (a.width, a.height - r)
  913.       cr.arc (a.width - r, a.height - r, r, 0, 0.5 * math.pi)
  914.       cr.line_to (a.width - r, a.height)
  915.       cr.arc (r, a.height - r, r, 0.5 * math.pi, math.pi)
  916.       cr.close_path ()
  917.  
  918.       cr.set_source_rgba (0.0, 0.0, 0.0, 0.625)
  919.       cr.fill()
  920.  
  921.       cr.translate (a.width / 2, a.height / 2)
  922.       cr.rotate (-math.pi / 2)
  923.       cr.scale (min (a.width / 100., a.height / 100.),
  924.                 min (a.width / 100., a.height / 100.))
  925.  
  926.       angle = self.progress * 2 * math.pi
  927.  
  928.       r = 10
  929.       cr.set_line_width (r)
  930.       cr.set_line_cap (cairo.LINE_CAP_ROUND)
  931.  
  932.       # the circle segment. fades out before it becomes too short
  933.       cr.set_source_rgba (1.0, 1.0, 1.0, max (0.0, min (1.0,
  934.                           (math.pi * 14.5 / 8 - math.pi * 1.5 / 8 - angle))))
  935.       cr.arc (0, 0, 50 - 2.25 * r,
  936.               angle + math.pi * 1.5 / 8, math.pi * 14.5 / 8)
  937.       cr.stroke ()
  938.  
  939.       # the line in the middle: yellow when active.
  940.       if self.progress > 0.001:
  941.          cr.set_source_rgba (0.969, 0.522, 0.0, 1.0)
  942.       else:
  943.          cr.set_source_rgba (1.0, 1.0, 1.0, 1.0)
  944.  
  945.       cr.move_to (0, 0)
  946.       cr.line_to (math.cos (angle) * (50 - 1.5 * r),
  947.                   math.sin (angle) * (50 - 1.5 * r))
  948.       cr.stroke ()
  949.  
  950.       # the pie segment showing the completion state.
  951.       cr.set_source_rgba (1.0, 1.0, 1.0, 0.5)
  952.       cr.move_to (0, 0)
  953.       cr.arc (0, 0, 50 - 2.25 * r, 0, angle)
  954.       cr.close_path ()
  955.       cr.fill ()
  956.  
  957.       hildondesktop.HomePluginItem.do_expose_event (self, event)
  958.  
  959.  
  960.    def settings_dialog (self, widget):
  961.       dialog = gtk.Dialog ()
  962.       dialog.set_title ('TV-B-Gone for N900')
  963.       dialog.add_button ('Europe', 1)
  964.       dialog.add_button ('North America', 2)
  965.       label = gtk.Label ()
  966.       label.set_markup ('<b>TV-B-Gone for N900</b>\n' +
  967.                         'currently using codes for <span fgcolor="#f78500">%s</span>\n' % self.codeid +
  968.                         '<span size="xx-small">\n</span>' +
  969.                         '<span size="x-small">© 2010 Simon Budig, &lt;simon@budig.de&gt;\n' +
  970.                         'Codes scanned by Limor Fried &amp; Mitch Altman\n' +
  971.                         'for the “TV-B-Gone Kit” project.\n</span>')
  972.       dialog.vbox.add (label)
  973.       dialog.show_all ()
  974.       result = dialog.run ()
  975.       dialog.destroy ()
  976.       if result >= 1 and result <= 2:
  977.          if result == 1:
  978.             self.codeid = "Europe"
  979.          if result == 2:
  980.             self.codeid = "North America"
  981.          conf_client = gconf.client_get_default()
  982.          conf_client.add_dir (GCONFPATH, gconf.CLIENT_PRELOAD_NONE)
  983.          try:
  984.             conf_client.set_string (GCONFPATH + "/codeid", self.codeid)
  985.          except Exception:
  986.             pass
  987.  
  988.          self.codes = TVBGoneCodes [self.codeid]
  989.  
  990.  
  991.  
  992.    def send_code (self):
  993.       if self.index < len (self.codes):
  994.          try:
  995.             if not self.lircdev:
  996.                self.lircdev = file ("/dev/lirc0", "w")
  997.        
  998.             code = self.codes[self.index]
  999.        
  1000.             # set up carrier and duty cycle. Since the driver does not seem
  1001.             # to support continuous output, we try to use the fastest possible
  1002.             # carrier frequency and a duty cycle as "on" as possible.
  1003.             if code[0]:
  1004.                # ioctl: LIRC_SET_SEND_CARRIER
  1005.                fcntl.ioctl (self.lircdev, 0x40046913,
  1006.                             struct.pack ("<i", code[0]))
  1007.                # ioctl: LIRC_SET_SEND_DUTY_CYCLE
  1008.                fcntl.ioctl (self.lircdev, 0x40046915,
  1009.                             struct.pack ("<i", 50))
  1010.             else:
  1011.                # try to simulate no carrier
  1012.                fcntl.ioctl (self.lircdev, 0x40046913,
  1013.                             struct.pack ("<i", 500000))
  1014.                fcntl.ioctl (self.lircdev, 0x40046915,
  1015.                             struct.pack ("<i", 1))
  1016.        
  1017.             # the driver only supports up to 256 pulse/gap timings and needs
  1018.             # an odd number of times (starting/ending with pulse).
  1019.             # there os one bigger code in the set which would need breaking up
  1020.             # here (not yet done).
  1021.             if (len (code[1]) < 128):
  1022.                data = "".join ([struct.pack ("<ii", *code[2][ord(i) - ord ('0')]) for i in code[1]])
  1023.                # last gap must not be written
  1024.                self.lircdev.write (data[:-4])
  1025.                self.lircdev.flush ()
  1026.        
  1027.             self.index += 1
  1028.             self.progress = float (self.index) / len (self.codes)
  1029.             self.timeout = gobject.timeout_add (200, self.send_code)
  1030.  
  1031.          except IOError:
  1032.             hildon.hildon_banner_show_information (self, "", "troubles accessing IR device.")
  1033.             self.index = 0
  1034.             self.progress = 0.0
  1035.             self.timeout = None
  1036.       else:
  1037.          hildon.hildon_banner_show_information (self, "", "Sent %d standby codes in %.1fs." % (self.index, time.time() - self.start_time))
  1038.          self.index = 0
  1039.          self.progress = 0.0
  1040.          if self.lircdev:
  1041.             self.lircdev.close ()
  1042.             self.lircdev = None
  1043.          self.timeout = None
  1044.  
  1045.       self.queue_draw ()
  1046.       return False
  1047.  
  1048.  
  1049.    def button_release_event (self, widget, event):
  1050.       if self.timeout:
  1051.          gobject.source_remove (self.timeout)
  1052.          self.timeout = None
  1053.          hildon.hildon_banner_show_information (self, "", "Sent %d standby codes in %.1fs." % (self.index, time.time() - self.start_time))
  1054.          self.index = 0
  1055.          self.progress = 0.0
  1056.          if self.lircdev:
  1057.             self.lircdev.close ()
  1058.             self.lircdev = None
  1059.          self.queue_draw ()
  1060.       else:
  1061.          self.index = 0
  1062.          self.progress = 0.0
  1063.          self.start_time = time.time ()
  1064.          self.send_code ()
  1065.  
  1066.       return False
  1067.  
  1068.  
  1069.  
  1070. hd_plugin_type = TVBGone
  1071.  
  1072. if __name__ == '__main__':
  1073.    gobject.type_register (hd_plugin_type)
  1074.    obj = gobject.new (hd_plugin_type,
  1075.                       plugin_id = hd_plugin_type.__class__.__name__)
  1076.    obj.show_all()
  1077.    gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement