# # -------------------------------------------------------------------- # The CCF File Format # # The CCF File format begins with a CCF Header. The type of this header # depends on the values of header->version1 and header->version2. You # can read these values at fixed offsets to choose the correct format # for decoding. Once the header is read, the rest of the objects can # be found using absolute offset pointers. All formats are big endian. # -------------------------------------------------------------------- # # # -------------------------------------------------------------------- # Object types # # S* - 4 byte pointer to a length-string (1 byte len + string) # S# - where # is an int refers to inline string of specified length # N1 - 1 byte integer # N2 - 2 byte integer # N4 - 4 byte integer # Z* - 4 byte pointer to another object (see third column for type) # Z+ - array of objects starting at this offset in the object # - see third column for length of this array (object field) # B+ - inline array of bytes. length comes from another field. # # -------------------------------------------------------------------- # Colors # # There are two schemes for representing colors. In grayscale Prontos, # the foreground and background colors are stored in a single byte. In # color Prontos, the foreground is a single byte and the background is # three repeat bytes. Notice that foreground and background are switched # in color and grayscale representations. # # A grayscale 'color' byte looks like this: BG BG BG FG # Where BG and FG are bit pairs that represent one of four levels: # 00 = black # 01 = dark gray # 10 = light gray # 11 = white # # A color integer (4 bytes) looks like this; FG BG BG BG # where FG and BG are bytes which index into a 256-bit color table. # -------------------------------------------------------------------- # # # -------------------------------------------------------------------- # CCF Object class : Header # # ident1 = fixed string "@\245Z@_CCF" # ident2 = fixed string "CCF\000" # # capability = 32 bit field # bit 1 .... uses timers # bit 2 .... uses udb ir codes # bit 16 ... unknown - always set # bit 24 ... unknown - possible color flag # bit 25 ... unknown - always set on color and marantz x200 devices # bit 27 ... marantz x200 extended device keys # # attributes = 32 bit field # bit 1 .... config read only # bit 2 .... home read only # # attribPos = offset of attribute field. 60 or 64 # -------------------------------------------------------------------- # # # Greyscale Prontos: TSU1000, TSU2000, RU890, RU940, RC5000(i), RC5200 # [CCFHeader:gray:notimers] S* version N4 reserved1 S8 ident1 N4 crc1Pos N2 time_year N1 time_month N1 time_day N1 reserved2 N1 time_hour N1 time_minute N1 time_seconds N4 reserved3 S4 ident2 N4 capability N4 crc2Pos N4 attribPos Z* firstHome CCFDevice:nocolor Z* firstDevice CCFDevice:nocolor Z* firstMacro CCFDevice:nocolor N4 attributes N4 reserved4 Z* macroPanel CCFPanel:nocolor # # Greyscale Prontos: TSU2000, RU940, RC5000(i), RAV2000 # [CCFHeader:gray:timers] S* version N4 reserved1 S8 ident1 N4 crc1Pos N2 time_year N1 time_month N1 time_day N1 reserved2 N1 time_hour N1 time_minute N1 time_seconds N4 reserved3 S4 ident2 N4 capability N4 crc2Pos N4 attribPos Z* firstHome CCFDevice:nocolor Z* firstDevice CCFDevice:nocolor Z* firstMacro CCFDevice:nocolor Z* firstTimer CCFTimer N4 attributes Z* macroPanel CCFPanel:nocolor N2 reserved4 # # Color Prontos: TSU6000, RU970, RC9200 # [CCFHeader:color:timers] S* version N4 reserved1 S8 ident1 N4 crc1Pos N2 time_year N1 time_month N1 time_day N1 reserved2 N1 time_hour N1 time_minute N1 time_seconds N4 reserved3 S4 ident2 N4 capability N4 crc2Pos N4 attribPos Z* firstHome CCFDevice:color Z* firstDevice CCFDevice:color Z* firstMacro CCFDevice:color Z* firstTimer CCFTimer N4 attributes Z* macroPanel CCFPanel:color N4 reserved4 N3 reserved5 N1 channelID # # Color Prontos: TSU6000, RU970, RC9200 # [CCFHeader:color:notimers] S* version N4 reserved1 S8 ident1 N4 crc1Pos N2 time_year N1 time_month N1 time_day N1 reserved2 N1 time_hour N1 time_minute N1 time_seconds N4 reserved3 S4 ident2 N4 capability N4 crc2Pos N4 attribPos Z* firstHome CCFDevice:color Z* firstDevice CCFDevice:color Z* firstMacro CCFDevice:color N4 attributes Z* macroPanel CCFPanel:color N1 channelID # # -------------------------------------------------------------------- # CCF Object class : Device # # attributes = 32 bit field # bit 1 .... read only # bit 6 .... has separator # bit 7 .... is template # -------------------------------------------------------------------- # [CCFDevice:nocolor] Z* nextDevice CCFDevice:nocolor S* name Z* iconUnselected CCFIcon Z* iconSelected CCFIcon Z* action CCFActionList Z* keyLeft CCFActionList Z* keyRight CCFActionList Z* keyVolMinus CCFActionList Z* keyVolPlus CCFActionList Z* keyChanMinus CCFActionList Z* keyChanPlus CCFActionList Z* keyMute CCFActionList N4 reserved1 S* nameKeyLeft S* nameKeyRight Z* firstPanel CCFPanel:nocolor N1 attributes [CCFDevice:color] Z* nextDevice CCFDevice:color S* name Z* iconUnselected CCFIcon Z* iconSelected CCFIcon Z* action CCFActionList Z* keyLeft CCFActionList Z* keyRight CCFActionList Z* keyVolMinus CCFActionList Z* keyVolPlus CCFActionList Z* keyChanMinus CCFActionList Z* keyChanPlus CCFActionList Z* keyMute CCFActionList Z* keyFarLeft CCFActionList Z* keyFarRight CCFActionList N4 reserved1 S* nameKeyLeft S* nameKeyRight S* nameKeyFarLeft S* nameKeyFarRight Z* firstPanel CCFPanel:color N1 attributes N1 rfExtender N4 reserved2 [CCFDevice:marantz] Z* nextDevice CCFDevice:marantz S* name Z* iconUnselected CCFIcon Z* iconSelected CCFIcon Z* action CCFActionList Z* keyLeft CCFActionList Z* keyRight CCFActionList Z* keyMute CCFActionList Z* keyChanMinus CCFActionList Z* keyChanPlus CCFActionList Z* keyVolMinus CCFActionList Z* keyVolPlus CCFActionList Z* keyM CCFActionList Z* keyReturn CCFActionList Z* keyEx CCFActionList Z* arrowUp CCFActionList Z* arrowLeft CCFActionList Z* arrowRight CCFActionList Z* arrowDown CCFActionList N4 reserved1 N1 attributes N1 rfExtender N2 reserved2 S* nameKeyLeft S* nameKeyRight Z* firstPanel CCFPanel:color # # -------------------------------------------------------------------- # CCF Object class : Panel # # namePos = a 'S*' string pointer with the notable exception that if # the high bit is set, the panel is considered hidden. this makes it # somewhat difficult to use a normal 'S*' processing rule. # # count1 and count2 should be the same # -------------------------------------------------------------------- # [CCFPanel] Z* nextPanel CCFPanel N4 namePos N1 count1 N1 count2 Z+ child CCFChild ${count1} # # -------------------------------------------------------------------- # CCF Object class : Frame # # count1 and count2 should be the same # -------------------------------------------------------------------- # [CCFFrame:nocolor] N2 width N2 height S* name Z* icon CCFIcon N4 reserved N1 fontSize N1 colors N1 count1 N1 count2 Z+ child ${count1} [CCFFrame:color] N2 width N2 height S* name Z* icon CCFIcon N4 reserved N1 fontSize N4 colors N1 count1 N1 count2 Z+ child ${count1} # # -------------------------------------------------------------------- # CCF Object class : Child # # type = child class type where 0=frame and 1=panel # -------------------------------------------------------------------- # [CCFChild] N2 posX N2 posY Z* child [CCFFrame,CCFPanel] ${type} N1 type # # -------------------------------------------------------------------- # CCF Object class : Button # # type*Act*Sel where * = Y or N # Act = active (has an associated action) # Sel = selected (button pressed) # -------------------------------------------------------------------- # [CCFButton:nocolor] N2 width N2 height Z* actionList CCFActionList S* name S* idtag N1 fontSize N1 reserved1 Z* iconNActNSel CCFIcon Z* iconNActYSel CCFIcon Z* IconYActNSel CCFIcon Z* iconYActYSel CCFIcon N1 colorNActNSel N1 colorNActYSel N1 colorYActNSel N1 colorYActYSel [CCFButton:color] N2 width N2 height Z* actionList CCFActionList S* name S* idtag N1 fontSize N1 reserved1 Z* iconNActNSel CCFIcon Z* iconNActYSel CCFIcon Z* IconYActNSel CCFIcon Z* iconYActYSel CCFIcon N4 colorNActNSel N4 colorNActYSel N4 colorYActNSel N4 colorYActYSel # # -------------------------------------------------------------------- # CCF Object class : Timer # # startDays = bit field (0=Mon ... 6=Sun, 7=Weekly) # endDays = see startDays # startTime = hour * 60 + min # endTime = see startTime # -------------------------------------------------------------------- # [CCFTimer] Z* nextTimer CCFTimer N1 startDays N1 reserved1 N2 startTime N1 endDays N1 reserved2 N2 endTime Z1 startAction CCFAction Z1 endAction CCFAction # # -------------------------------------------------------------------- # CCF Object class : ActionList # # count1 and count2 should be the same # -------------------------------------------------------------------- # [CCFActionList] N1 count1 N1 count2 Z+ action ${count1} # # -------------------------------------------------------------------- # CCF Object class : Action # # type = action type # p1 = action specific # p2 = action specific # # type p1 p2 description # ---- ---- ---- ---- # 1 0 pointer to code IR Code # 2 (Z*) device (Z*) button Button Alias # 3 (Z*) device (Z*) panel Jump to Panel # 4 0 delay in millisecs Delay # 5 (Z*) device key code Hard Key Alias # 6 (Z*) device 0 Device Alias # 7 0 (Z*) timer Timer # 8 0 beep code Beep # 9 (Z*) device (Z*) panel same as 3, Marantz x200 # # Key Code Pronto ProntoPro Marantz # --------- ------ --------- ------- # 0 Left Left Left # 1 Right Right Right # 2 Vol- Vol- Mute # 3 Vol+ Vol+ CH- # 4 CH- CH- CH+ # 5 CH+ CH+ Vol- # 6 Mute Mute Vol+ # 7 Far Left Menu # 8 Far Right End # 9 Exit # 10 Up Arrow # 11 Left Arrow # 12 Right Arrow # 13 Down Arrow # 14 Home # 15 Light # 16 Back # 17 Ahead # # Panel Jump Exceptions (panel pointer is not a pointer) # ------------------------------------------------------ # 0xbbbbbbbb = Jump Forward # 0xcccccccc = Jump Back # 0xdddddddd = Scroll Down # 0xeeeeeeee = Scroll Up # 0xffffffff = Mouse Mode # # Beep Encoding - four bytes (a b b c) # ------------- # a = duration in milliseconds / 10 (0-255) # b = frequency in Hz (0-65535) # c = duty cycle (0-100) # -------------------------------------------------------------------- # [CCFAction] N1 type N4 p1 N4 p2 # # -------------------------------------------------------------------- # CCF Object class : IRCode # # 0x0000 = pulse width encoding # 0x0100 = pulse position encoding # 0x5000 = RC5 code # 0x5001 = RC5x code # 0x6000 = RC6 code # 0x6001 = RC6x code # 0x7000 = unknown # 0x8000 = unknown # 0x9000 = unknown # # 0x0000 Pulse Width Encoding # --------------------------- # 2 bytes - header (always 0x0000) # 2 bytes - frequency base (4194304/freq == Hz) # 2 bytes - # elements in base sequence (* 2 for # bytes) # 2 bytes - # elements in repeat sequence (* 2 for # bytes) # x byte pairs - where x is base sequence # x byte pairs - where x is repeat sequence # # each byte pair in the base and repeat sequence represents an 'off' # time and an 'on' time. each time is represented in cycles of the # frequency base (carrier wave frequency). most sequences consist of # an optional preamble, a set of two repeating code pairs which can be # interpreted as 0,1 bits for producing a numeric code and an optional # suffix. # -------------------------------------------------------------------- # [CCFIRCode] N2 size S* name B+ data ${size}-6 # # -------------------------------------------------------------------- # CCF Object class : Icon # # type = 16 bit field # bit 0 .... 4 level gray if set, otherwise 2 levels # bit 2,3 .. gray foreground # bit 4,5 .. gray background # bit 7 .... compressed # bit 8 .... 256 level color if set # # there are four types of icons since color icons are not compressed: # Gray 2-color, Gray 4-color (normal and compressed) and 256-Color # # Encodings # --------- # Gray 2-color takes it's foreground/background from the type1 attr. # Each bit represents 0=background, 1=foreground. Lines are padded to # the byte boundary. # # Gray 4-color uncompressed is like the 2-color icon except that it # uses two bits for each pixel. Each bit pair corresponds to the color # take at the beginning of this document. # # Gray 4-color compressed uses two encoding modes. Read a byte. If the # high bit is set, it's a repeating color. The color comes from bits # 0 and 1. Bits 2-6 represent the number of pixels - 4. Otherwise, use # bits 5,4 3,2 and 1,0 as the next three pixel colors. # # 256-color uncompressed. Each byte is a pixel. See 256 color index. # -------------------------------------------------------------------- # [CCFIcon] N2 size N2 width N2 height N2 type B+ data ${size}-8