INTERACTIVE TOY

Abstract: An interactive toy apparatus including a toy (10) having a fanciful physical appearance (17, 18, 19, 20), a speaker (58) mounted on the toy (10), a user input receiver (28), a user information storage unit (74) storing information relating to at least one user, a content controller (82) operative in response to current user inputs received via the user input receiver (28) and to information stored in the storage unit (74) for providing audio content to the user via the speaker (58).

Description: INTERACTIVE TOY FIELD OF THE INVENTION The present invention relates to computer systems and methods generally and more particularly to development of interactive constructs, to techniques for teaching such development, and to verbally interactive toys . BACKGROUND OF THE INVENTION Various types of verbally interactive toys are known in the art. Generally speaking, these toys may be divided into two categories, computer games and stand-alone toys. The stand-alone toys, which typically have electronic circuitry embedded therein, normally provide a relatively low level of speech recognition and a very limited vocabulary, which often lead to child boredom and frustration during play. Computer games enjoy the benefit of substantial computing power and thus can provide a high level of speech recognition and user satisfaction. They are characterized by being virtual in their non-verbal dimensions and thus lack the capacity of bonding with children. The following patents are believed to represent the state of the art in verbally interactive toys : US Patent 4,712,184 to Haugerud describes a computer controlled educational toy, the construction of which teaches the user computer terminology and programming and robotic technology. Haugerud describes computer control of a toy via a wired connection, wherein the user of the computer typically writes a simple program to control movement of a robot. US Patent 4,840,602 to Rose describes a talking doll responsive to an external signal, in which the doll has a vocabulary stored in digital data in a memory which may be accessed to cause a speech synthesizer in the doll to simulate speech. US Patent 5,021,878 to Lang describes an animated character system with real-time control. US Patent 5,142,803 to Lang describes an animated character system with real-time control. US Patent 5,191,615 to Aldava et al. describes an interrelational audio kinetic entertainment system in which movable and audible toys and other animated devices spaced apart from a television screen are provided with program synchronized audio and control data to interact with the program viewer in relationship to the television program. US Patent 5,195,920 to Collier describes a radio controlled toy vehicle which generates realistic sound effects on board the vehicle. Communications with a remote computer allows an operator to modify and add new sound effects. US Patent 5,270,480 to Hikawa describes a toy acting in response to a MIDI signal, wherein an instrument-playing toy performs simulated instrument playing movements. US Patent 5,289,273 to Lang describes a system for remotely controlling an animated character. The system uses radio signals to transfer audio, video and other control signals to the animated character to provide speech, hearing vision and movement in real-time. US Patent 5,388,493 describes a system for a housing for a vertical dual keyboard MIDI wireless controller for accor- dionists . The system may be used with either a conventional MIDI cable connection or by a wireless MIDI transmission system. German Patent DE 3009-040 to Neuhierl describes a device for adding the capability to transmit sound from a remote control to a controlled model vehicle. The sound is generated by means of a microphone or a tape recorder and transmitted to the controlled model vehicle by means of radio communications. The model vehicle is equipped with a speaker that emits the received sounds . The disclosures of all publications mentioned in the specification and of the publications cited therein are hereby incorporated by reference. SUMMARY OF THE INVENTION The present invention seeks to provide verbally interactive toys and methods thereto which overcome disadvantages of the prior art as described hereinabove. There is thus provided in accordance with a preferred embodiment of the present invention interactive toy apparatus including a toy having a fanciful physical appearance, a speaker mounted on the toy, a user input receiver, a user information storage unit storing information relating to at least one user a content controller operative in response to current user inputs received via the user input receiver and to information stored in the storage unit for providing audio content to the user via the speaker. Further in accordance with a preferred embodiment of the present invention the user input receiver includes an audio receiver. Still further in accordance with a preferred embodiment of the present invention the current user input includes a verbal input received via the audio receiver. Additionally in accordance with a preferred embodiment of the present invention the user input receiver includes a tactile input receiver. Moreover in accordance with a preferred embodiment of the present invention the storage unit stores personal information relating to at least one user and the content controller is operative to personalize the audio content. Further in accordance with a preferred embodiment of the present invention the storage unit stores information relating to the interaction of at least one user with the interactive toy apparatus and the content controller is operative to control the audio content in accordance with stored information relating to past interaction of the at least one user with the interactive toy apparatus. Still further in accordance with a preferred embodiment of " the present invention the storage unit also stores information relating to the interaction of at least one user with the interactive toy apparatus and the content controller also is operative to control the audio content in accordance with information relating to past interaction of the at least one user with the interactive toy apparatus. Additionally in accordance with a preferred embodiment of the present invention the storage unit stores information input verbally by a user via the user input receiver. Moreover in accordance with a preferred embodiment of the present invention the storage unit stores information input verbally by a user via the user input receiver. Further in accordance with a preferred embodiment of the present invention the storage unit stores information input verbally by a user via the user input receiver. Still further in accordance with a preferred embodiment of the present invention the interactive toy apparatus also includes a content storage unit storing audio contents of at least one content title to be played to a user via the speaker, the at least one content title being interactive and containing interactive branching. Additionally in accordance with a preferred embodiment of the present invention the at least one content title includes a plurality of audio files storing a corresponding plurality of content title sections including at least one two alternative content title sections, and a script defining branching between the alternative user sections in response to any of a user input, an environmental condition, a past interaction, personal information related to a user, a remote computer, and a time-related condition. Moreover in accordance with a preferred embodiment of the present invention the interactive toy apparatus also includes a content storage unit storing audio contents of at least one content title to be played to a user via the speaker, the at least one content title being interactive and containing interactive branching. Further in accordance with a preferred embodiment of the present invention the at least one content title includes a plurality of parallel sections of content elements including at least two alternative sections and a script defining branching between alternative sections in a personalized manner. Still further in accordance with a preferred embodiment of the present invention the user information storage unit is located at least partially in the toy. Additionally in accordance with a preferred embodiment of the present invention the user information storage unit is located at least partially outside the toy. Moreover in accordance with a preferred embodiment of the present invention the content storage unit is located at least partially in the toy. Further in accordance with a preferred embodiment of the present invention the content storage unit is located at least partially outside the toy. Still further in accordance with a preferred embodiment of the present invention the user input receiver includes a microphone mounted on the toy, and a speech recognition unit receiving a speech input from the microphone. Additionally in accordance with a preferred embodiment of the present invention the user information storage unit is operative to store the personal information related to a plurality of users each identifiable with a unique code and the content controller is operative to prompt any of the users to provide the user's code. Moreover in accordance with a preferred embodiment of the present invention the user information storage unit is operative to store information regarding a user ' s participation performance . There is also provided in accordance with a preferred embodiment of the present invention toy apparatus having changing facial expressions, the toy including multi-featured face apparatus including a plurality of multi-positionable facial features, and a facial expression control unit operative to generate at least three combinations of positions of the plurality of facial features representing at least two corresponding facial expressions. Further in accordance with a preferred embodiment of the present invention the facial expression control unit is operative to cause the features to fluctuate between positions at different rates, thereby to generate an illusion of different emotions . Still further in accordance with a preferred embodiment of the present invention the toy apparatus also includes a speaker device, an audio memory storing an audio pronouncement, and an audio output unit operative to control output of the audio pronouncement by the speaker device, and the facial expression control unit is operative to generate the combinations of positions synchronously with output of the pronouncement. There is also provided in accordance with a preferred embodiment of the present invention toy apparatus for playing an interactive verbal game including a toy, a speaker device mounted on the toy, a microphone mounted on the toy, a speech recognition unit receiving a speech input from the microphone, and an audio storage unit storing a multiplicity of verbal game segments to be played through the speaker device, and a script storage defining interactive branching between the verbal game segments. Further in accordance with a preferred embodiment of the present invention the verbal game segments include at least one segment which prompts a user to generate a spoken input to the verbal game. Still further in accordance with a preferred embodiment of the present invention the at least one segment includes two or more verbal strings and a prompt to the user to reproduce one of the verbal strings. Additionally in accordance with a preferred embodiment of the present invention the at least one segment includes a riddle. Moreover in accordance with a preferred embodiment of the present invention the at least one of the verbal strings has educational content. Further in accordance with a preferred embodiment of the present invention the at least one of the verbal strings includes a feedback to the user regarding the quality of the user's performance in the game. Still further in accordance with a preferred embodiment of the present invention the interactive toy apparatus further includes multi-featured face apparatus assembled with the toy including a plurality of multi-positionable facial features, and a facial expression control unit operative to generate at least three combinations of positions of the plurality of facial features representing at least two corresponding facial expressions. Additionally in accordance with a preferred embodiment of the present invention the facial expression control unit is operative to cause the features to fluctuate between positions at different rates, thereby to generate an illusion of different emotions . Moreover in accordance with a preferred embodiment of the present invention the interactive toy apparatus also includes an audio memory storing an audio pronouncement, and an audio output unit operative to control output of the audio pronouncement by the speaker device, and the facial expression control unit is operative to generate the combinations of positions synchronously with output of the pronouncement. Further in accordance with a preferred embodiment of the present invention the interactive toy apparatus further includes a microphone mounted on the toy, a speech recognition unit receiving a speech input from the microphone, and an audio storage unit storing a multiplicity of verbal game segments of a verbal game to be played through the speaker device, and a script storage defining interactive branching between the verbal game segments . Still further in accordance with a preferred embodiment of the present invention the verbal game segments include at least one segment which prompts a user to generate a spoken input to the verbal game. Additionally in accordance with a preferred embodiment of the present invention the at least one segment includes two or more verbal strings and a prompt to the user to reproduce one of the verbal strings. Moreover in accordance with a preferred embodiment of the present invention the at least one segment includes a riddle. Further in accordance with a preferred embodiment of the present invention the at least one of the verbal strings has educational content. Still further in accordance with a preferred embodiment of the present invention and further including a microphone mounted on the toy; a speech recognition unit receiving a speech input from the microphone, and an audio storage unit storing a multiplicity of verbal game segments of a verbal game to be 10 played through the speaker device and a script storage defining interactive branching between the verbal game segments. Moreover in accordance with a preferred embodiment of the present invention the verbal game segments include at least one segment which prompts a user to generate a spoken input to the verbal game. Additionally in accordance with a preferred embodiment o£ the present invention wherein at least one segment includes two or more verbal strings and a prompt to the user to reproduce one of the verbal strings. Additionally or alternatively at least one segment comprises a riddle. Still further in accordance with a preferred embodiment of the present invention at least one of the verbal strings has educational content. Additionally in accordance with a preferred embodiment of the present invention the at least one of the verbal strings includes a feedback to the user regarding the quality of the user's performance in the game. There is also provided in accordance with a preferred embodiment of the present invention a method of toy interaction including providing a toy having a fanciful physical appearance, providing a speaker mounted on the toy, providing a user input receiver, storing in a user information storage unit information relating to at least one user providing, via a content controller operative in response to current user inputs received via the user input receiver and to information stored in the storage unit, audio content to the user via the speaker. Further in accordance with a preferred embodiment of 11 the present invention the storing step includes storing personal information relating to at least one user and personalizing, via the content controller, the audio content. Still further in accordance with a preferred embodiment of the present invention the storing step includes storing information relating to the interaction of at least one user with the interactive toy apparatus and controlling, via the content controller, the audio content in accordance with stored information relating to past interaction of the at least one user with the interactive toy apparatus. Additionally in accordance with a preferred embodiment of the present invention the method further includes storing, in a content storage unit, audio contents of at least one content title to be played to a user via the speaker, the at least one content title being interactive and containing interactive branching. Moreover in accordance with a preferred embodiment of the present invention the method further includes storing personal information related to a plurality of users each identifiable with a unique code and prompting, via the content controller, any of the users to provide the user's code. Further in accordance with a preferred embodiment of the present invention the method further includes storing information regarding a user's participation performance. Still further in accordance with a preferred embodiment of the present invention the method further includes providing multi-featured face apparatus including a plurality of multi- 12 positionable facial features, and generating at least three combinations of positions of the plurality of facial features representing at least two corresponding facial expressions. Additionally in accordance with a preferred embodiment of the present invention the method further includes causing the features to fluctuate between positions at different rates, thereby to generate an illusion of different emotions. Moreover in accordance with a preferred embodiment of the present invention the method also includes storing an audio pronouncement, and providing the audio pronouncement by the speaker, and generating combinations of facial positions synchronously with output of the pronouncement. There is also provided, in accordance with a preferred embodiment of the present invention, a system for teaching programming to students, such as school-children, using interactive objects, the system including a computerized student interface permitting a student to breathe life into an interactive object by defining characteristics of the interactive object, the computerized student interface be being operative to at least partially define, in response to student inputs, interactions between the interactive object and humans; and a computerized teacher interface permitting a teacher to monitor the student ' s progress in defining characteristics of the interactive object. Further in accordance with a preferred embodiment of the present invention, the computerized teacher interface permits the teacher to configure the computerized student interface. Also provided, in accordance with a preferred embodiment of the present invention, is a teaching system for teaching 13 engineering and programming of interactive objects to students, the system including a computerized student interface permitting a student to breathe life into an interactive object by defining characteristics of the interactive object, the computerized user interface being operative to at least partially define, in response to student inputs, interactions between the interactive object and humans, and a computerized teacher interface permitting a teacher to configure the computerized student interface. Also provided, in accordance with another preferred embodiment of the present invention, is a computer system for development of emotionally perceptive computerized creatures including a computerized user interface permitting a user to develop an emotionally perceptive computer-controlled creature by defining interactions between the emotionally perceptive computer-controlled creature and natural humans including at least one response of the emotionally perceptive computer-controlled creature to at least one parameter, indicative of natural human emotion, derived from a stimulus provided by the natural human and a creature control unit operative to control the emotionally perceptive creature in accordance with the characteristics and interactions defined by the user. Further in accordance with a preferred embodiment of the present invention, the parameter indicative of natural human emotion includes a characteristic of natural human speech other than language content thereof. Also provided, in accordance with a preferred embodiment of the present invention, is a method for development of 14 emotionally perceptive computerized creatures, the method including defining interactions between the emotionally perceptive computer-controlled creature and natural humans including at least one response of the emotionally perceptive computer-controlled creature to at least one parameter, indicative of natural human emotion, derived from a stimulus provided by the natural human, and controlling the emotionally perceptive creature in accordance with the characteristics and interactions defined by the user. Additionally provided, in accordance with a preferred embodiment of the present invention, is a method for teaching programming to school-children, the method including providing a computerized visual-programming based school-child interface permitting a school-child to perform visual programming and providing a computerized teacher interface permitting a teacher to configure the computerized school-child interface. Also provided is a computerized emotionally perceptive computerized creature including a plurality of interaction modes operative to carry out a corresponding plurality of interactions with natural humans including at least one response to at least one natural human emotion parameter, indicative of natural human emotion and an emotion perception unit operative to derive at least one natural human emotion parameter from a stimulus provided by the natural human, and to supply the parameter to at least one of the plurality of interaction modes, and, optionally, a physical or virtual, e.g. on-screen, body operative to participate in at least one of the plurality of interactions. 15 BRIEF DESCRIPTION OF THE DRAWINGS The present invention will be understood and appreciated from the following detailed description, taken in conjunction with the drawings in which: Fig. 1A is a simplified pictorial illustration of a toy forming at least part of an interactive toy system constructed and operative in accordance with a preferred embodiment of the present invention; Fig. IB is a back view of the toy of Fig. 1; Fig. 2 is a partially cut away pictorial illustration of the toy of Figs. 1A and IB; Fig. 3 is a simplified exploded illustration of elements of the toy of Figs. 1A, IB, and 2; Figs. 4A, 4B, 4C, 4D and 4E are illustrations of the toy of Figs. 1A - 3 indicating variations in facial expressions thereof; Fig. 5 is a simplified block diagram illustration of the interactive toy apparatus of a preferred embodiment of the present invention; Fig. 6 is a functional block diagram of a base station forming part of the apparatus of Fig. 5; Fig. 7 is a functional block diagram of a circuitry embedded in a toy forming part of the apparatus of Fig. 5; Figs. 8A - 8G, taken together, comprise a schematic diagram of base communication unit 62 of Fig. 5; Figs. 8H - 8N, taken together, comprise a schematic diagram of base communication unit 62 of Fig. 5, according to an 16 alternative embodiment; Figs. 9A - 9G, taken together, comprise a schematic diagram of toy control device 24 of Fig. 5; Figs. 9H - 9M, taken together, comprise a schematic diagram of toy control device 24 of Fig. 5, according to an alternative embodiment; Figs. 10 - 15, taken together, are simplified flowchart illustrations of a preferred method of operation of the interactive toy system of Figs. 1 - 9G; Figs. 16A and 16B, taken together, form a simplified operational flow chart of one possible implementation of the opening actions of a script executed by the "Play" sub-module of Fig. 10; Figs. 17A - 17E, taken together, form a simplified operational flow chart of one possible implementation of a story script executed by the "Play" sub-module of Fig. 10; Figs. 18A - 18G, taken together, form a simplified operational flow chart of one possible implementation of a game script executed by the "Play" sub-module of Fig. 10; Figs. 19A - 19C, taken together, form a simplified operational flow chart of one possible implementation of a song script executed by the "Play" sub-module of Fig. 10; Figs. 20A - 20C, taken together, form a simplified operational flow chart of one possible implementation of the "Bunny Short" story script of Figs. 17A - 17E and executed by the "Play" sub-module of Fig. 10; Figs. 21A - 2IF, taken together, form a simplified 17 operational flow chart of one possible implementation of the "Bunny Long" story script of Figs. 17A - 17E and executed by the "Play" sub-module of Fig. 10; Fig. 22 is a simplified operational flow chart of the "Theme Section" referred to in Figs. 17D, 18C, 19B, and 19C; Fig. 23A is a pictorial illustration of the development and operation of a physical toy living creature in accordance with a preferred embodiment of the present invention; Fig. 23B is a pictorial illustration of the development and operation of a virtual living creature in accordance with a preferred embodiment of the present invention; Fig. 23C is a simplified semi-pictorial semi-block diagram illustration of a system which is a variation on the systems of Figs. 23A - 23B in that a remote content server is provided which serves data, programs, voice files and other contents useful in breathing life into a computerized living creature; Fig. 24A is a pictorial illustration of a school-child programming a computerized living creature; Fig. 24B is a pictorial illustration of human, at least verbal interaction with a computerized living creature wherein the interaction was programmed by a student as described above with reference to Fig. 24A; Figure 24C is a pictorial illustration of a creature equipped with a built in video camera and a video display such as a liquid crystal display (LCD); Fig. 25 is a simplified software design diagram of preferred functionality of a system administrator; 18 Fig. 26 is a simplified software diagram of preferred functionality of teacher workstation 312 in a system for teaching development of interactive computerized constructs such as the system of Figs. 23A - 23C; Fig. 27 is a simplified software diagram of preferred functionality of student workstation 10 in a system for teaching development of interactive computerized constructs such as the system of Figs. 23A - 23C; Figs. 28 - 31 are examples of screen displays which are part of a human interface for the Visual Programming block 840; Fig. 32 is a screen display which includes an illustration of an example of a state machine view of a project; Fig. 33 is a screen display which enables a student to create an environment in which a previously generated module can be tested; Figs. 34 - 37 are examples of display screens presented by the teacher workstation 312 of any of Figs. 23A, 23B or 23C; Fig. 38 is a simplified flowchart illustration of the process by which the student typically uses the student workstation of any of Figs. 23A, 23B or 23C; Fig. 39 is an example of a display screen generated by selecting Event in the Insert menu in the student workstation 310; Fig. 40 is an example of a display screen generated by selecting Function in the Insert menu in the student workstation 310; Fig. 41 is a simplified flowchart illustration of 19 processes performed by the student in the course of performing steps 910 and 920 of Fig. 38; Fig. 42 is a simplified flowchart illustration of an emotional interaction flowchart design process; Figs. 43 - 102 illustrate preferred embodiments of a computerized programming teaching system constructed and operative in accordance with a preferred embodiment of the present invention. Fig. 103 is a table illustration of an emotional analysis database; Fig. 104 is an emotional analysis state chart; Fig. 105 illustrates typical function calls and callback notifications; Fig. 106 illustrates typical input data processing suitable for a media BIOS module; Fig. 107 illustrates typical input data processing suitable for a UCP implementation module; Fig. 108 illustrates typical data processing suitable for user applications and an API module; Fig. 109 illustrates a typical UCP implementation module and media BIOS output data processing; Fig. 110 illustrates output data processing for a protocol implementation module and media BIOS module; Fig. Ill illustrates typical figure configuration; and Figs. 112 - 115 illustrate typical install-check up (BT 1/4, 2/4, 3/4 and 4/4 respectively). Attached herewith are the following appendices which aid in the understanding and appreciation of one preferred embod- 20 iment of the invention shown and described herein: Appendix A is a computer listing of a preferred software implementation of the interactive toy system of the present invention; Appendix B is a preferred parts list for the apparatus of Figs. 8A - 8G; and Appendix C is a preferred parts list for the apparatus of Figs. 9A - 9G. 21 DETAILED DESCRIPTION OF PREFERRED EMBODIMENTS Reference is now made to Fig. 1A which is a simplified pictorial illustration of a toy, generally designated 10, forming at least part of an interactive toy system constructed and operative in accordance with a preferred embodiment of the present invention. While toy 10 may be implemented in any number of physical configurations and still maintain the functionality of an interactive toy system as is described herein, for illustration purposes only toy 10 is shown in Fig. 1A as typically having a fanciful physical appearance and comprising a body portion 12 having a number of appendages, such as arms 14, legs 16, eyelids 17, eyes 18, a nose 19, and a mouth 20. Arms 14 and legs 16 may be passive "appendages" in that they are not configured to move, while eyelids 17, eyes 18 and mouth 20 may be "active" appendages in that they are configured to move as is described in greater detail hereinbelow with reference to Figs. 3 - 4E. Fig. IB is a back view of the toy of Fig. 1 and additionally shows toy 10 as typically having an apertured area 22, behind which a speaker may be mounted as will be described in greater detail hereinbelow. Fig. 2 is a partially cut away pictorial illustration of the toy of Figs. 1A and IB showing a toy control device 24, typically housed within body potion 12, and a number of user input receivers, such as switches 26 in arms 14 and legs 16 for receiving tactile user inputs, and a microphone 28 for receiving audio user inputs. It is appreciated that the various user input receivers described herein may be located anywhere within toy 10, 22 such as behind nose 19, provided that they may be accessed by a tactile or audio user input, such as verbal input, as required. It is appreciated any of a multitude of known sensors and input devices, such as accelerometers, orientation sensors, proximity sensors, temperature sensors, video input devices, etc., although not particularly shown, may be incorporated into toy 10 for receiving inputs or other stimuli for incorporation into the interactive environment as described herein regarding the interactive toy system of the present invention. Additional reference is now made to Fig. 3 which is a simplified exploded illustration of elements of the toy 10 of Figs. 1A, IB, and 2. A facial portion 30 of body portion 12 of Fig. 1 is shown together with nose 19 and mouth 20, and having two apertures 32 for receiving eyelids 17 and eyes 18. Facial portion 30 typically sits atop a protective cover 34 which is mounted on a protective box 36. Eyelids 17, eyes 18, and mouth 20 each typically cooperate with a motion element 38 which provides a movement to each appendage. Motion elements 38 are typically driven by a gear plate 40 which is in turn controlled by a gear shaft 42 and a motor 44. Circuitry 24 effects a desired movement of a specific appendage via a corresponding motion element 38 by controlling motor 44 and gear shaft 42 to orient and move gear plate 40 depending on the desired rotational orientation of gear plate 40 relative to the current rotational orientation as determined by an optical positioning device 46. Gear plate 40 preferably selectably cooperates with a single one of motion elements 38 at a time depending on specific rotational orientations of gear plate 40. A speaker 58 is also provided for 23 audio output. Power is typically provided by a power source 48, typically a DC power source. Figs. 4A, 4B, 4C, 4D and 4E are illustrations of toy 10 of Figs. 1A - 3 indicating variations in facial expressions thereof. Fig. 4A shows eyes 18 moving in the direction indicated by an arrow 50, while Fig. 4B shows eyes 18 moving in the direction indicated by an arrow 52. Fig. 4C shows eyelids 17 having moved to a half-shut position, while Fig. 4D shows eyelids 17 completely shut. Fig. 4E shows the lips of mouth 20 moving in the directions indicated by an arrow 54 and an arrow 56. It is appreciated that one or both lips of mouth 20 may move. Reference is now made to Fig. 5 which is a simplified block diagram illustration of the interactive toy apparatus constructed and operative in accordance with a preferred embodiment of the present invention. Typically, a computer 60, such as a personal computer based on the PENTIUM microprocessor from Intel Corporation, is provided in communication with a base communication unit 62, typically a radio-based unit, via a RS-232 serial communications port. It is appreciated that communication between the computer 60 and the base unit 62 may be effected via parallel port, MIDI and audio ports of a sound card, a USB port, or any known communications port. Unit 62 is typically powered by a power supply 64 which may be fed by an AC power source. Unit 62 preferably includes an antenna 66 for communication with toy control device 24 of toy 10 (Fig. 2) which is similarly equipped with an antenna 68. Toy control device 24 typically controls motor 44 (Fig. 3), switches 26 (Fig. 2), one or more 24 movement sensors 70 for detecting motion of toy 10, microphone 28 (Fig. 2), and speaker 58 (Fig. 3). Any of the elements 24, 44, 26, 28, 58 and 70 may be powered by power source 48 (Fig. 3). Computer 60 typically provides user information storage, such as on a hard disk or any known and preferably nonvolatile storage medium, for storing information relating to a user, such as personal information including the user's name, a unique user code alternatively termed herein as a "secret name" that may be a made-up or other fanciful name for the user, typically predefined and selected by the user, the age of the user, etc. Computer 60 also acts as what is referred to herein as a "content controller" in that it identifies the user interacting with toy 10 and controls the selection and output of content via toy 10, such as via the speaker 58 as is described in greater detail hereinbelow. The content controller may utilize the information relating to a user to personalize the audio content delivered to the user, such as by referring to the user with the user ' s secret name or speaking in a manner that is appropriate to the gender of the user. Computer 60 also typically provides content storage for storing content titles each comprising one or more content elements used in response to user inputs received via the user input receivers described above with reference to toy 10, in response to environmental inputs, or at random. For example, a content title may be a joke, a riddle, or an interactive story. An interactive story may contain many content elements, such as audio elements, generally arranged in a script for sequential output. The interactive story is typically divided 25 into several sections of content element sequences, with multiple sections arranged in parallel to represent alternative interactive branches at each point in the story. The content controller selects a branch according to a current user input with toy 10, previous branch selections, or other user information such as past interactions, preferences, gender, or environmental or temporal conditions, etc. Computer 60 may be in communication with one or more other computers, such as a remote computer by various known means such as by fixed or dial-up connection to a BBS or to the Internet. Computer 60 may download from the remote server, either in real-time or in a background or batch process, various types of content information such as entirely new content titles, additional sections or content elements for existing titles such as scripts and voice files, general information such as weather information and advertisements, and educational material. Information downloaded from a remote computer may be previously customized for a specific user such as by age, user location, purchase habits, educational level, and existing user credit. The content controller may also record and store user information received from a user via a user input receiver such as verbal or other audio user inputs. Computer 60 preferably includes speech recognition capabilities, typically implemented in hardware and/or software, such as the Automatic Speech Recognition Software Development Kit for WINDOWS 95 version 3.0, commercially available from Lernout & Hauspie Speech Products, Sint-Krispisnstraat 7, 8900 Leper, Belgium. Speech recognition 26 may be used by the content controller to analyze speech inputs from a user to determine user selections, such as in connection with an interactive story for selecting a story branch. Speech recognition may also be used by the content controller to identify a user by the secret name or code spoken by the user and received by microphone 28. The content controller also provides facial expression control. The facial mechanism (Fig. 5) may provide complex dynamic facial expressions by causing the facial features to fluctuate between various positions at different rates. Preferably, each facial feature has at least two positions that it may assume. Two or more facial features may be moved into various positions at generally the same time and at various rates in order to provide a variety of facial expression combinations to generate a variety different emotions. Preferably, the content controller controls the facial feature combinations concurrent with a user interaction or a content output to provide a natural accompanying expression such as lip synchronization and natural eye movements. The content controller preferably logs information relating to content provided to users and to the interactions between each user and toy 10, such as the specific jokes and songs told and sung to each user, user responses and selections to prompts such as questions or riddles or interactive stories, and other user inputs . The content may utilize the information relating to these past interactions of each user to subsequently select and output content and otherwise control toy 10 as appropriate, such as play games with a user that were not previously 27 played with that user or affect the level of complexity of an interaction. It is appreciated that computer 60 may be housed within or otherwise physically assembled with toy 10 in a manner in which computer 60 communicates directly with toy control device 24 not via base unit 62 and antennae 66 and 68, such as through wired means or optical wireless communications methods. Alternatively, computer 60 may be electronically integrated with toy control device 24. Fig. 6 is a functional block diagram of base communication unit 62 of Fig. 5. Unit 62 typically comprises a micro controller unit 72 having a memory 74. Unit 72 communicates with computer 60 of Fig. 5 via an adapter 76, typically connected to computer 60 via an RS-232 port or otherwise as described above with reference to Fig. 5. Unit 72 communicates with toy control device 24 of toy 10 (Fig. 2) via a transceiver 78, typically a radio transceiver, and antenna 66. Fig. 7 is a functional block diagram of toy control device 24 of Fig. 5. Device 24 typically comprises a micro controller unit 82 which communicates with base unit 72 of Fig. 5 via a transceiver 84, typically a radio transceiver, and antenna 68. Power is supplied by a power supply 86 which may be fed by power source 48 (Fig. 5). Unit 82 preferably controls and/or receives inputs from a toy interface module 88 which in turn controls and/or receives inputs from the speaker, microphone, sensors, and motors as described hereinabove. Transceiver 84 may additionally or alternatively communicate with interface module 28 88 for direct communication of microphone inputs and speaker outputs . Reference is now made to Figs. 8A - 8G, which, taken together, comprise a schematic diagram of base communication unit 62 of Fig. 5. Appendix B is a preferred parts list for the apparatus of Figs. 8A - 8G. Figs. 8H - 8N, taken together, comprise a schematic diagram of base communication unit 62 of Fig. 5, according to an alternative embodiment. Reference is now made to Figs. 9A - 9G which, taken together, comprise a schematic diagram of toy control device 24 of Fig. 5. Appendix C is a preferred parts list for the apparatus of Figs. 9A - 9G. Figs. 9H - 9M, taken together, comprise a schematic diagram of toy control device 24 of Fig. 5, according to an alternative embodiment. Reference is now made to Figs. 10 - 15 which, taken together, are simplified flowchart illustrations of a preferred method of operation of the interactive toy system of Figs. 1 9G. It is appreciated that the method of Figs. 10 - 15 may be implemented partly in computer hardware and partly in software, or entirely in custom hardware. Preferably, the method of Figs. 10 - 15 is implemented as software instructions executed by computer 60 (Fig. 5). It is appreciated that the method of Figs. 10 - 15, as well as other methods described hereinbelow, need not necessarily be performed in a particular order, and that in fact, for reasons of implementation, a particular implementation of the methods may be performed in a different order than another par- 29 ticular implementation. Fig. 10 describes the main module of the software and high-level components thereof. Operation typically begins by opening the communication port to the base unit 62 and initiating communication between computer 60 and toy control device 24 via base unit 62. The main module also initiates a speech recognition engine and displays, typically via a display of computer 60, the main menu of the program for selecting various sub-modules. The main module typically comprises the following sub-modules : 1) "About You" is a sub-module that enables a user to configure the system to the users preferences by entering parameters such as the users real name, secret name, age and date of birth, color of the hair and eyes, gender, and typical bed-time and wake-up hours; 2) "Sing Along" is another sub-module that provides specific content such as songs with which the user may sing along; 3) "How To Play" is a sub-module tutorial that teaches the user how to use the system and play with the toy 10; 4) "Play" is the sub-module that provides the interactive content to the toy 10 and directs toy 10 to interact with the user; 5) "Toy Check-Up" is a sub-module that helps the user to solve technical problems associated with the operation of the system, such as the toy having low battery power and lack of sufficient electrical power supply to the base station; and 6) "Exit" is a sub-module that enables the user to 30 cease the operation of the interactive toy system software and clear it from the computers memory. Fig. 11 shows a preferred implementation of the "open communication" step of Fig. 10 in greater detail. Typical operation begins with initialization of typical system parameters such as setting up the access to the file system of various storage units. The operation continues by loading the display elements, opening the database, initializing the toy and the communication drivers, initializing the speech recognition software engine, and creating separate threads for various concurrently-operating activities such that one user may interact with the toy while another user may use the computer screen and keyboard for other purposes, such as for word processing. Fig. 12 shows a preferred implementation of the "About You" sub-module of Fig. 10 in greater detail. Typical operation begins when the user has selected the "About You" option of the main menu on the computers screen. The user is then prompted to indicate whether the user is an existing user or a new user. The user then provides the users identification and continues with a registration step. Some or all of the operations shown in Fig. 12 may be performed with verbal guidance from the toy. Fig. 13 shows a preferred implementation of the registration step of Fig. 12 in greater detail. Typical operation begins by loading a registration data base, selecting a secret name, and then selecting and updating parameters displayed on the computers screen. When the exit option is selected the user returns to the main menu described in Fig. 10. Fig. 14 shows a preferred implementation of the "Sing 31 Along" sub-module of Fig. 10 in greater detail. Typical operation begins with displaying a movie on the computer screen and concurrently causing all the toys 10 within communication range of the base unit to provide audio content, such as songs associated with the movie, through their speakers. The user can choose to advance to the next song or exit this module and return to the marin module, such as via keyboard entry. Fig. 15 shows a preferred implementation of the "How To Play" and "Play" sub-modules of Fig. 10. Typical operation begins with the initialization of the desired script, described in greater details hereinbelow, minimizing the status window on the computer screen, closing the thread, and returning to the main menu. The computer continues to operate the thread responsible for the operation of the toy, and continues to concurrently display the status of the communication medium and the script on the computer screen. Reference is now made to Figs. 16A and 16B which, taken together, form a simplified operational flow chart of one possible implementation of the opening actions of a script executed by the "Play" sub-module of Fig. 10. The implementation of Figs. 16A and 16B may be understood in conjunction with the following table of action identifiers and actions: 32 OPENING Audio Text Op002 Squeeze my foot please op015m "Hi! Good morning to you! Wow, what a morning! I'm Storyteller! What's your Secret Name, please? op020m Hi! Good afternoon! Wow, what an afternoon! I'm Storyteller! What's your Secret Name, please? Op025m "Hi! Good evening! Wow, what a night. I'm Storyteller! What's your Secret Name, please? op036m O.K. From now on I'm going to call you RAINBOW. So, hi Rainbow, whaddaya know! O.K., Rainbow, you're the boss. You choose what we do. Say: STORY, GAME or SONG. op040m Ace, straight from outer space ! O.K., Ace, you're the boss. You choose what we do. Say: STORY, GAME or SONG. Op045m Rainbow, well whaddaya know! O.K., Rainbow, you're the boss. You choose what we do. Say: STORY, GAME or SONG. Op050m Bubble Gum, well fiddle de dum ! O.K., Bubble Gum, you're the boss. You choose what we do. Say: STORY, GAME or SONG. op060 Don't be shy. We'll start to play as soon as you decide. Please say out loud: STORY, GAME or SONG. Typical operation of the method of Figs. 16A and 16B begins by playing a voice file identified in the above table as op002. This is typically performed by instructing the toy to begin receiving a voice file of a specific time length. The voice file is then read from the storage unit of the computer and communicated via the radio base station to the toy control device that connects the received radio input to the toys speaker where it is output. Voice file op002 requests that the user press the microswitch located in the nose or the foot of the toy. If the user presses the microswitch the script then continues by playing either of voice files op015m, op020m or op025m, each welcoming the user in accordance with the current time of the day, and then requests that the user pronounce his or her secret name to identify himself or herself to the system. The script then records the verbal response of the user for three seconds. The recording is performed by the computer, by sending a command to the toy to connect the toy ' s microphone to the toys radio transmitter and transmit the received audio input for three seconds. The radio communication is received by the radio base station, communicated to the computer and stored in the computer's storage unit as a file. The application software then performs speech recognition on the recorded file. The result of the speech recognition process is then returned to the script program. The script continues according to the user response by playing a personalized welcome message that corresponds to the identified secret name or another message where an identification is not successfully made. This welcome message also requests the 34 user to select between several options such as a story, a game or a song. The selection is received by recording the user verbal response and performing speech recognition. More detailed description of a simplified preferred implementation of a story, a game, and a song are provided in Figs 17A to 17E, 18A to 18G, and 19A to 19C respectively. Figs. 17A - 17E, taken together, form a simplified operational flow chart of one possible implementation of a story script executed by the "Play" sub-module of Fig. 10. The implementation of Figs. 17A - 17E may be understood in conjunction with the following table of action identifiers and actions : 35 STORY MENU Audio Text stml05 "Hey Ace, it looks like you like stories as much as I do. I know a great story about three very curious bunnies. stml 10 "Hey Rainbow, it looks like you like stories as much as I do. I know a great story about three very curious bunnies. Stml l5 "Hey Bubble Gum, it looks like you like stories as much as I do. I know a great story about three very curious bunnies. stml25m A story. What a great idea! I love stories! Let's tell one together. Let's start with "Goldilocks and the Three Bears." Stml30m Once upon a time, there was a young girl who got lost in the forest. Hungry and tired, she saw a small, cozy little house. The door was open, so she walked right in. stml35m On the kitchen table were three bowls of porridge. She walked up to one of the bowls and put a spoonful of porridge in her mouth. Stml40m Oooh! You tell me. How was the porridge? Too Hot, Too Cold or Just Right? Go ahead, say the words: TOO HOT, TOO COLD, or JUST RIGHT stml50 (Sputtering) Too hot! That was Papa Bear's bowl. The porridge was too hot. Stml55 (Sputtering) Too cold! That was Mama Bear's bowl. The porridge was too cold Stml 60 Hmmm. Just right! That was Baby Bear's bowl. The porridge was just right! And Goldilocks ate it all up! stml 70 Telling stories with you makes my day! Do you want to hear another story? Say: YES or NO. stml 80 If you want to hear another story, just say YES. If you want to do something else, just say NO. stml 95 I'm going to tell you a story about three very curious little bunnies. stm205m Uh-oh! It looks like the bunnies are in a bit of trouble! Do you want to hear the rest of the Bunny story now? Say YES or NO. stm206m Remember the Bunny story? The bunnies were eating something yummy, and then they heard someone coming. Do you want to hear what happens? Say YES or NO. staι215m If you want to hear the rest of the Bunny story, say YES. If you want to do something else, say NO. 36 else, say NO. stm225 No? - OK, that's enough for now. Remember that you can play with the Funny Bunny Booklet whenever you want. Let's see, what would you like to do now? Stm230 Would you like to play a game or hear a song now? Say GAME or SONG. stm245 Now, let's play a game or sing a song. You decide. Please - GAME or SONG. 37 Figs. 18A - 18G, taken together, form a simplified operational flow chart of one possible implementation of a game script executed by the "Play" sub-module of Fig. 10. The implementation of Figs. 18A - 18G may be understood in conjunction with the following table of action identifiers and actions: 38 GAME MENU Audio Text gm805 Hey Ace, so you're back for more games. Great! Let's play the Jumble Story again. gm810 Hey Rainbow, so you're back for more games. Great! Let's play the Jumble Story again. Gm815 Hey Bubble Gum, so you're back for more games. Great! Let's play the Jumble Story again. Gm820m A game! What a great idea! I love playing games. Especially games that come out of stories. Gm840 This game is called Jumble Story. The story is all mixed up and you're going to help me fix it. Gm845m Listen to the sentences I say when you squeeze my nose, my hand or my foot. Then squeeze again in the right order so that the story will make sense. gm847m Here goes, Press my nose please. gm855m (sneezes) oh, sorry, (sniffles) it's o.k. now, you can press my nose. Gm860 A woman came to the door and said she was a princess gm865m "O.k. - now squeeze my foot" gm875m "Don't worry, I won't kick. Squeeze my foot please." Gm890 Soon after they got married and lived happily ever after gm895 One more, now squeeze my hand please. gm905m "Just a friendly squeeze shake if you please." Gm910 . Once upon a time, a prince was looking for a princess to marry gm915 "Now try to remember what you squeezed to hear each sentence. Then squeeze my hand, my foot or press my nose in the right order to get the story right." gm921 A woman came to the door and said she was a princess gm922 Soon after they got married and lived happily ever after gm923 . Once upon a time, a prince was looking for a princess to marry gm924 If you want to play the Jumble Story, press my nose, squeeze my hand and squeeze my foot in the right order. Gm925 The right order is HAND, NOSE then FOOT. Try it. gm926m "You did it! Super stuff! What a jumble Story player you are!" gm930m "And that's the way the story goes! Now it's not a jumbled story anymore! In fact, it's the story of the "Princess and the Pea." If you want, I can tell you the whole story 39 from beginning to end. What do you say: YES or NO?" gm932 "You played Jumble Story very well! Do you want to play a different game now? Say YES or NO." gm933 We can try this game another time. Do you want to play a different game now? Say YES or NO gm940 "OK, then, enough games for now. There's so much more to do. Should we tell a story or sing a song? Say: STORY or SONG. gm945 You tell me what to do! Go ahead. Say: STORY or SONG. gm965m This is another of my favorite games. It's called the Guessing Game. gm970 OK, let's begin. I'm thinking about something sticky. Guess - Is it A LOLLIPOP or PEANUT BUTTER? Say LOLLIPOP or PEANUT BUTTER. gm972 Guess which sticky thing I'm thinking about. A LOLLIPOP or PEANUT BUTTER gm975 That's right! I'm thinking about a lollipop It's sticky and it also has a stick. Gm980 That's right! I'm thinking about Peanut Butter that sticks to the roof of your mouth. gm984 That was fantasticky. Let's try another. What jumps higher a RABBIT or a Bear ? Say RABBIT or BEAR. gm982 Let's see. What jumps higher - a RABBIT or a BEAR gm985m A rabbit, that's right, a rabbit jumps (SERIES OFBOINGS) with joy unless it is a toy. Gm990 I'd like to see a bear jump but I'd hate to have it land on me. gml005 That was excellent game playing. Let's try something different. How about a story or a song now? You tell me: STORY or SONG. gm997 Choose what we shall do. Say STORY or SONG. 40 Figs. 19A - 19C, taken together, form a simplified operational flow chart of one possible implementation of a song script executed by the "Play" sub-module of Fig. 10. The implementation of Figs. 19A - 19C may be understood in conjunction with the following table of action identifiers and actions: 41 SONG MENU Audio Text Sng305 "In the mood for a song, Ace from outer space?. Super! Let's do the porridge song again. Come on. Sing along with me." Sng310 "In the mood for a song, Rainbow well whaddaya know? Super! Let's do the porridge song again. Come on. Sing along with me." Sng315 "In the mood for a song, Bubble Gum, fiddle de dum? Super! Let's do the porridge song again. Come on. Sing along with me." Sng320 A song, a song, we're in the mood to sing a song. Sng_prog Short "Pease Porridge" Sng370 "Do you want me to sing the rest of the song? Just say: YES or NO. Sng390 That song reminds me of the Goldilocks story. Remember? - Goldilocks liked her porridge JUST RIGHT! Sng395 "I just thought of another great song. We can hear another song, play a game, or tell a story. Just say :SONG or GAME or STORY. Sng410 + All right, We're going to do a great song now. Here goes ..." [SINGS short HEAD SNG_HAND AND SHOULDERS] sng415 What a song! What a great way to get some excercise! Do you want to play a game or hear a story now? Say: GAME or STORY. sng425 I'm in the mood for a great game or a cool story. You decide what we do. Tell me: GAME or STORY. 42 Figs. 20A - 20C, taken together, form a simplified operational flow chart of one possible implementation of the "Bunny Short" story script of Figs. 17A - 17E and executed by the "Play"sub-module of Fig. 10. The implementation of Figs. 20A - 20C may be understood in conjunction with the following table of action identifiers and actions: 43 BUNNY SHORT Audio text rb3005m music Rb005m (Sighing) "Dear me," said the Hungry Woman as she looked in her cupboard. (Squeaky noise of cupboard opening). It was nearly empty, with nothing left except a jar of... You decide what was in the jar? HONEY, PEANUT BUTTER or MARSHMALLOW FLUFF? rb015 You decide what was in the jar. Say HONEY, PEANUT BUTTER or MARSHMALLOW FLUFF rb026 It was HONEY rb0301 Honey!! Sweet, delicious, sticky honey, made by bees and looooved by bears. rb0302 Peanut butter!! Icky, sticky peanut butter that sticks to the roof of your mouth. rb0303 Marshmallow fluff. Gooey, white, and sticky inside-out marshmallows that tastes great with peanut butter! rb3050m She reached up high into the cupboard for the one jar which was there. (Sound of woman stretching, reaching.), but she wasn't very careful and didn't hold it very well... the jar crashed to the floor, and broke. (Sound of glass crashing and breaking.) rb3055 And sticky Honey started spreading all over the floor. rb3060 And sticky Peanut butter started spreading all over the floor. rb3065 And sticky Marshmallow fluff started spreading all over the floor. rb090m "Now I have to clean it up before the mess gets worse, so where is my mop?" [Sounds of doors opening and closing.] Oh, yes! I lent the mop to the neighbor, Mr. Yours-Iz-Mine, who never ever returns things rb3075 She put on her going-out shoes and rushed out of the house Then, a tiny furry head with long pointed ears, a pink nose and cotton-like tail popped up over the window sill. (Sound effect of something peeping, action.) rbl lO What do you think it was? An elephant? A mouse? or A bunny? You tell me: GIRAFFE, ELEPHANT, or BUNNY. rbl20 no... Elephants have long trunks, not long ears Rbl25 , no... Giraffes have long necks, not long ears. Rbl30 It was a bunny! The cutest bunny you ever did see! And the bunny's name was BunnyOne. 44 (Sniffing) There's something yummy-smelling in here." Rbl95 Now when bunnies get excited, they start hopping up an down which is exacdy what BunnyOne started to do. rb200 Can you hop like a bunny? When I say, "BOING," hop like a bunny. Everytime I "Boing" you hop again. When you want to stop, squeeze my hand. 3-boings rb220m While BunnyOne was boinging away, another bunny came around. BunnyTwo, was even more curious than BunnyOne and immediately peeked over the window sill. "Hey, BunnyOne," BunnyTwo said rb230 Let's go in and eat it all up. "Oh, I don't know if that's a good idea.." said BunnyOne. "We could get into trouble.". 231m music Rb235 No sooner had BunnyOne said that , when a third pair of long ears peeked over the windowsill. Who do you think that was? Rb245 Right you are! How did you know that! This is fun, we're telling the story together! rb3155 His name was BunnyThree! rb3160 BunnyThree looked at BunnyOne and BunnyTwo and he hopped smack in the middle of the honey And started licking away rb3165 BunnyThree looked at BunnyOne and BunnyTwo and he hopped smack in the middle of the peanut butter. And started licking away rb3170 BunnyThree looked at BunnyOne and BunnyTwo and he hopped smack in the middle of the marshmallow fluff. And started licking away rb3175 BunnyOne and BunnyTwo saw BunnyThree licking away and hopped in as well. rb2751 But even as the three bunnies were nibbling away at the honey, they heard footsteps. rb2752 But even as the three bunnies were nibbling away at the peanut butter, they heard footsteps. rb2753 But even as the three bunnies were nibbling away at the marshmallow fluff, they heard footsteps. rb280m Music 45 Figs. 21A - 2IF, taken together, form a simplified operational flow chart of one possible implementation of the "Bunny Long" story script of Figs. 17A - 17E and executed by the "Play" sub-module of Fig. 10. The implementation of Figs. 21A - 2IF may be understood in conjunction with the following table of action identifiers and actions : 46 BUNNY LONG Audio Text rb280m (Suspenseful music) rb285 "hey Bunnies - let's go" whispered BunnyOne, who as we know was the most cautious of the bunch. "Yeah, we're out of here" answered BynnyTwo and BunnyThree. But as they tried to get away, they saw to their dismay, that they were — stuck Λ2901 Stuck in a honey puddle Λ2902 Stuck in peanut butter freckle-like blobs Λ2903 Stuck in a gooey cloud of sticky marshmallow fluff. Rb295 "What do we do?" asked BunnyTwo? rb2961 (aside) BUBLLE GUM, don't worry, these three rabbits always manage to get away rt>2962 (aside) ACE,, don't worry, these three rabbits always manage to get away rb2963 (aside)RAINBOW, don't worry, these three rabbits always manage to get away rb297m rb300 The door opened, and in walked the Hungry Man, who had met the Hungry Woman coming back with the mop from YoursIsMines house.. rb3051 'So you mean to tell me that all we have for dinner is bread and honey rb3052 'So you mean to tell me that all we have for dinner is bread and peanut butter rb3053 'So you mean to tell me that all we have for dinner is bread and marhmallow fluff Rb315 That's not even enough for a Rabbit?" Which was what he said when he walked into the door and saw the three bunnies stuck to the floor. rb316m Rb320 "Sweetie, I should have known you were kidding but you should never kid around with mc when I'm hungry. Rabbit for dinner- my favorite." Rb330 "Hey, let's go," whispered BunnyOne. "Yeah, we've got to get out of here," whispered BunnyTwo and Bunny Three. But when they tried to move, they found their feet firmly stuck. Rb335 The Hungry Woman came in, she had no idea what the Hungry Man was talking about, until she saw the rabbits and said: "(giggle) - yes dear, I was just joking. Yummy rabbits for you dinner. Why don't, you catch the rabbits while I get wood for a fire." 47 rb345 "No need to catch them," said the Hungry Man. "Those rabbits are good and stuck... right where they are. I'll go out to the garden and pick some potatoes. By the time the fire is hot, I'll be back to help you put the rabbits in the pot. And he hurried off. rb346m (Sounds of footsteps receding, door shutting.) Rb350m "What are we going to do?" asked BunnyThree - he wasn't so brave any more. "Let's try to jump out" said BunnyOne. So they tried to (boing - distorted) and tried to (boing) but they couldn't budge. Rb355m The Hungry Woman and Hungry Man came in with wood for the fire. They were whistling happily because they knew they were going to eat well. They started the fire and put on a pot of water, whistling as the fire grew hotter (whistling in the background). All this time, the rabbits stood frozen like statues. Rb360 Can you stand as still as a statue? If you want to practice being a statue, just like the bunnies, squeeze my hand and then stand still. When you're finished being a statue, squeeze my hand again. rb370 "Right , so now you're a statue and I'll wait until you squeeze my hand." Λ375 "Squeeze my hand before you play Statue." rb382 That was a long time to be a statue. rb385 "A little more wood and the fire will be hot enough to cook in," the Hungry Woman said to her husband, and they both went out to gather more wood.. rb386 (sound effect) Rb390 "Did you hear that?" whispered BunnyTwo fiercely. "What oh what are we going to do?" "Let's try to jump one more time," said BunnyOne. Rb395m Rainbow, You know, you can help them. When you hear [BOING], hop as high as you can. Rb400m Ace, You know, you can help them. When you hear [BOING], hop as high as you can. Rb405m Bubble gum, You know, you can help them. When you hear [BOING], hop as high as you can. Rb410m Sound of BOING] And up the bunnies hopped. [BOING] And again they hopped. [BOING] And again they hopped. rb4151m One more [BOING] and they were free of the puddle of honey. rb4152m One more [BOING] and they were free of the peanut butter blob. rb4153m One more [BOING] and they were free of the marshmallow fluff sticky cloud. 48 rb4201 You know why? Because as the fire grew hotter, the honey grew thinner, thin enough for the rabbits to unstick their feet. rb2402 You know why? Because as the fire grew hotter, the peanut butter grew thinner, thin enough for the rabbits to unstick their feet. R 203 You know why? Because as the fire grew hotter, the marshmallow fluff grew thinner, thin enough for the rabbits to unstick their feet. Rb425m One more [BOING] and they were on the window sill, and then out in the garden and scurrying away. rb426m (music) rb435m Just then, the Hungry Man and the Hungry Woman walked in the door with the wood and potatoes , singing their favorite song (Peas Porridge Hot in background) Rb440 They walked in, just in time to see their boo hoo hoo rabbit dinner hopping out and away in the garden. rb445m As the hopped, they were singing happily (Honey on the Table in background) 49 Fig. 22 is a simplified operational flow chart of the "Theme Section" referred to in Figs. 17D, 18C, 19B, and 19C. The Theme Section presents the user with a general introduction and tutorial to the overall application. Appendix A is a computer listing of a preferred software embodiment of the interactive toy system described hereinabove. A preferred method for implementing software elements of the interactive toy system of the present invention is now described: 1) Provide a computer capable of running the WINDOWS 95 operating system; 2 ) Compile the source code of the sections of Appendix A labeled: * Installation Source Code * Application Source Code * ActiveX Source Code for Speech Recognition * CREAPI.DLL * CRPRO.DLL * BASEIO.DLL * Toy Configuration Source Code into corresponding executable files onto the computer provided in step 1 ) ; 3) Install the "Automatic Speech Recognition Software Development Kit" for WINDOWS 95 version 3.0 from Lernout & Hauspie Speech Products, Sint-Krispisnstraat 7, 8900 Leper, Belgium; 4 ) Compile the source code of the sections of Appen- 50 dix A labeled : * Base Station Source Code * Toy Control Device Source Code into corresponding executable files and install into the base communication unit 62 of Fig. 5 and into the toy control device 24 of Fig. 5 respectively; 5) Run the executable file corresponding to the Installation Source Code; 6) Run the executable file corresponding to the Toy Configuration Source Code; 7 ) Run the executable file corresponding to the Application Source Code; It is appreciated that the interactive toy system shown and described herein may be operative to take into account not only time of day but also calendar information such as holidays and seasons and such as a child's birthday. For example, the toy may output special messages on the child's birthday or may generate a "tired" facial expression at night-time. Preferably, at least some of the processing functionalities of the toy apparatus shown and described herein are provided by a general purpose or household computer, such as a PC, which communicates in any suitable manner with the toy apparatus, typically by wireless communication such as radio communication. Preferably, once the toy has been set up, the PC program containing the processing functions of the toy runs in background mode, allowing other users such as adults to use the household computer for their own purposes while the child is playing with the toy. Preferred techniques and apparatus useful in generating 51 computerized toys are described in copending PCT application No. PCT/IL96/00157 and in copending Israel Patent Application No. 121,574 and in copending Israel Patent Application No. 121,642, the disclosures of which are incorporated herein by reference. A portion of the disclosure of this patent document contains material which is subject to copyright protection. The copyright owner has no objection to the facsimile reproduction by anyone of the patent document or the patent disclosure, as it appears in the Patent and Trademark Office patent file or records, but otherwise reserves all copyright rights whatsoever. In the present specification and claims, the term "computerized creature" or "computerized living creature" is used to denote computer-controlled creatures which may be either virtual creatures existing on a computer screen or physical toy creatures which have actual, physical bodies. A creature may be either an animal or a human, and may even be otherwise, i.e. an object. "Breathing life" into a creature is used to mean imparting life-like behavior to the creature, typically by defining at least one interaction of the creature with a natural human being, the interaction preferably including sensing, on the part of the creature, of emotions exhibited by the natural human being. A "natural" human being refers to a God-created human which is actually alive in the traditional sense of the word rather than a virtual human, toy human, human doll, and the like. Reference is now made to Figs. 23A and 23B, which are 52 illustrations of the development and operation of a computerized living creature in accordance with a preferred embodiment of the present invention. Fig. 23A shows a physical creature, while Fig. 23B shows a virtual creature. As seen in Figs. 23A and 23B, a facility for teaching the development of interactive computerized constructs is provided, typically including a plurality of student workstations 310 and a teacher workstation 312, which are interconnected by a bus 314 with a teaching facility server 316 serving suitable contents to the teacher workstation 312 and the student workstations 310. Preferably, a creature life server 318 (also termed herein a "creature support server" or "creature life support server) is provided which provides student-programmed life-like functions for a creature 324 as described in detail below. Alternatively servers 316 and 318 may be incorporated in a single server. As a further alternative, multiple creature support servers 318 may be provided, each supporting one or more computerized living creatures. As a further alternative (not shown), a single central computer may be provided and the student and teacher workstations may comprise terminals which are supported by the central computer. As seen in Fig. 23A, creature life support server 18 is preferably coupled to a computer radio interface 320 which preferably is in wireless communication with a suitable controller 322 within the computerized living creature 324, whereby the actions and responses of the computerized living creature 324 are controlled and stored as well as its internalized experiences are preferably retained and analyzed. 53 It is appreciated that the computerized living creature 324 preferably is provided, by creature life server 318, with a plurality of different anthropomorphic senses, such as hearing, vision, touch, temperature, position and preferably with composite, preferably student-programmed senses such as feelings. These senses are preferably provided by means of suitable audio, visual, tactile, thermal and position sensors associated with the computerized living creature. Additionally in accordance with a preferred embodiment of the invention, the computerized living creature 324 is endowed with a plurality of anthropomorphic modes of expression, such as speech, motion and facial expression as well as composite forms of expression such as happiness, anger, sorrow, surprise. These expression structures are achieved by the use of suitable mechanical and electromechanical drivers and are generated in accordance with student programs via creature life server 318. Referring now to Fig. 23B, it is seen that a virtual computerized living creature 334 may be created on a display 336 of a computer 338 which may be connected to bus 314 either directly or via a network, such as the Internet. The virtual computerized living creature 334 preferably is endowed with a plurality of different anthropomorphic senses, such as hearing, vision, touch, position and preferably with composite senses such as feelings. These senses are preferably provided by associating with computer 338, a microphone 340, a camera 342, and a tactile pad or other tactile input device 344. A speaker 346 is also preferably associated with com- 54 puter 338. A server 348 typically performs the functionalities of both teaching facility server 316 and creature life server 318 of Fig. 23A. Additionally in accordance with a preferred embodiment of the invention, the virtual computerized living creature 334 is endowed with a plurality of anthropomorphic modes of expression, such a speech, motion and facial expression as well as composite expressions such as happiness, anger, sorrow, surprise. These are achieved by suitable conventional computer techniques. It is a preferred feature of the present invention that the computerized living creature can be given, by suitable programming, the ability to interact with humans based on the aforementioned anthropomorphic senses and modes of expression both on the part of the computerized living creature and on the part of the human interacting therewith. Preferably, such interaction involves the composite senses and composite expressions mentioned above . Fig. 23C is a simplified semi-pictorial semi-block diagram illustration of a system which is a variation on the systems of Figs. 23A - 23B in that a remote content server 342 is provided which serves data, programs, voice files and other contents useful in breathing life into the creature 324. Fig. 24A is a pictorial illustration of a student programming the creature 324 (not shown), preferably using a simulation display 350 thereof. Programming is carried out by the student in interaction with the student workstation 310. Interaction may be verbal or alternatively may take place via any other suitable input device such as keyboard and mouse. 55 The command "play record", followed by speech, followed by "stop", means that the student workstation should record the speech content generated by the student after "play record", up to and not including "stop" and store the speech content in a voice file and that the creature life server 318 should instruct the creature 324 to emit the speech content stored in the voice file. "If - then -endif", "speech recognition", "speech type", "and" and "or" are all control words or commands or programming instructions, as shown in Fig. 31. Fig. 24B is a pictorial illustration of human, at least verbal interaction with a computerized living creature wherein the interaction was programmed by a student as described above with reference to Fig. 24A. Figure 24C is a pictorial illustration of a creature 324 equipped with a built in video camera 342 and a video display 582 such as a liquid crystal display (LCD). The video camera provides visual inputs to the creature and via the creature and the wireless communication to the computer. The display enables the computer to present the user with more detailed information. In the drawing the display is used to present more detailed and more flexible expressions involving the eyes and eye brows. Color display enables the computer to adopt the color of the eyes to the user or subject matter. It is a particular feature of the present invention that an educational facility is provided for training engineers and programmers to produce interactive constructs. It may be 56 appreciated that a teacher may define for a class of students an overall project, such as programming the behavior of a policeman. He can define certain general situations which may be broken down into specific events. Each event may then be assigned to a student for programming an interaction suite. For example, the policema ' s behavior may be broken up into modules such as interaction with a victim's relative, interaction with a colleague, interaction with a boss, interaction with a complainer who is seeking to file a criminal complaint, interaction with a suspect, interaction with an accomplice, interaction with a witness. Each such interaction may have sub- modules depending on whether the crime involved is a homicide, a non-homicidal crime of violence, a crime of vice, or a crime against property. Each module or sub-module may be assigned to a different child. Similarly, a project may comprise programming the behavior of a schoolchild. In other words, the emotionally perceptive creature is a schoolchild. This project may be broken into modules such as behavior toward teacher, behavior toward module and behavior toward other children. Behavior toward other children may be broken up into submodules such as forming of a secret club, studying together, gossiping, request for help, etc. To program a particular submodule, the student is typically expected to perform at least some of the following operations : a. Select initial events which trigger entry into his submodule. For example, hearing the word "club" may trigger entry 57 into a "Forming Secret Club" submodule. These initial events may form part of the state machine of the module or preferably may be incorporated by the students jointly or by the teacher into a main program which calls various modules upon occurrence of various events . b. List topics appropriate to the dialogue to be maintained between the schoolchild and a human approaching the schoolchild. For example, in order to form a club, the club typically needs a name, a list of members, a password, a flag, rules, etc. c. Determine relationships between these topics. For example, the password needs to be conveyed to all members on the list of members, once the list of members has been established. d. Formulate a branched dialogue between the schoolchild and the human, designed such that each utterance of the schoolchild tends to elicit a response, from the human, which is easily categorizable. For example, the schoolchild may wish to ask only limited-choice questions rather than open-ended questions. If, for example, the schoolchild asks, "What color should the flag be: white or black or red?" then the system merely needs to recognize one of three words. e. Determine how to detect emotion and determine the roles of different emotions in the schoolchild-human relationship. For example, if the school-child is defining, in conjunction with the human, the list of members, the schoolchild may notice that the human is becoming emotional. The schoolchild may therefore elect to recommend that the list of members be terminated and/or may 58 express empathy. Alternatively or in addition, each utterance of the schoolchild may have a slightly different text for each of three or four different emotional states of the human. Other projects include programming the behavior of a teacher, parent, pet, salesperson, celebrity, etc. It is appreciated that the range of projects is essentially limitless. It is appreciated that the complexity of programming an emotionally perceptive being is anticipated to cause amusing situations whereby the emotionally perceptive being performs in a flawed fashion. This is expected to enhance the learning situation by defusing the tension typically accompanying a student error or student failure situation by associating student error with a humorous outcome. The difficulty of programming an emotionally perceptive being is not a barrier to implementation of the system shown and described herein because the system's objective is typically solely educational and correct and complete functioning of the emotionally perceptive being is only an artifact and is not the aim of the system. Furthermore, although programming a being which is emotionally perceptive at a high level is extremely difficult, even simplistic emotional sensitivity, when featured by a machine, has a tremendous effect on the interaction of humans with the machine. Therefore, programming of emotional perceptiveness, even at the elementary level, is a rewarding activity and consequently is capable of motivating students to enhance their programming abilities through practice. Fig. 25 is a simplified software diagram of preferred functionality of a system administrator. Preferably, one of the 59 teacher workstations 312 doubles as a system administrator workstation. Fig. 26 is a simplified software diagram of a preferred functionality of teacher workstation 312 in a system for teaching development of interactive computerized constructs such as the system of Figs. 23A - 23C. Student administration functionality (unit 715 in Fig. 25) typically includes conventional functionalities such as student registration, statistical analysis of student characteristics, student report generation, etc. Integration (unit 740) may be performed by groups of students or by the teacher. Preferably, the teacher workstation provides the teacher with an integration scheme defining the order in which the various modules should be combined. Run-time administration functionality (unit 750) refers to management of a plurality of creature life servers 318. For example, a teacher may have at his disposal 15 creatures controlled by 3 creature life servers and 30 projects, developed by 300 students and each including several project modules. Some of the project modules are alternative. The run-time administration functionality enables the teacher to determine that at a particular day and time, a particular subset of creatures will be controlled by a particular creature life server, using a particular project. If the project includes alternative modules, the teacher additionally defines which of these will be used. Fig. 27 is a simplified software diagram of preferred functionality of student workstation 310 in a system for teaching 60 development of interactive computerized constructs such as the system of Figs. 23A - 23C. The Analysis and Design block 815 in Fig. 27 typically comprises a word processing functionality, a flowchart drawing functionality and a database schema design functionality allowing the student to document his analysis of the project module. The Visual Programming block 840 in Fig. 27 is preferably operative to enable a student to define and parametrize software objects and to associate these objects with one another. Software objects preferably include: Sub-modules; events such as time events, verbal events, database events, sensor events, and combinations of the above; functions such as motion functions, speech (playback) functions; states for a state machine; and tasks performed in parallel. A typical session of visual programming may, for example, comprise the following steps: a. Student selects "view" and then "state machine" in order to view the state machine currently defining his module of the project that his class has been assigned. In response, the system displays the current state machine to the student. b. Student selects "insert" and then selects "state", thereby to add a new state to the state machine. c. Student selects "insert" and "connection" in order to connect the new state to an existing state in the state machine. d. Student defines an event and function for the selected connection. The function may be selected from among existing functions listed under the Functions option or may be generated, using the Program Block option, and using a third generation 61 programming language such as Basic or by opening a state machine within the function. Selection may be implemented by any suitable interface mechanism such as drag-and-drop of icons from a toolbox or such as selection from a menu bar and subsequent selection from menus associated with menu bar items. The visual programming block 840 preferably allows a student to select one of a plurality of "views" each comprising a different representation of the module as programmed thus far by the student. The views may, for example, include: a. sub-modules within the module assigned to the student; b. a list of events within the module. Events typically include time events, sensor events, verbal events, database events e.g. that a particular counter in the database has reached zero, and combinations of the above. An event can be generated from scratch, modified or associated with an existing connection between a source state and a destination state. c. a state machine illustrating states in the module and connections therebetween; d. a list of tasks, wherein each task includes a sequence of functions and/or modules and wherein an association is defined between tasks in order to allow the sequences of the various tasks to be performed in parallel. e. a list of functions within the module. Functions typically include verbal functions e.g. talking, speech recognition and recording, actuator functions such as motor functions and lighting functions, database functions such as computations 62 performed on data stored in the database. A function can be generated from scratch, modified or associated with an existing connection between a source state and a destination state. Within each view, the student may modify or add to any aspect of the module represented in the view. For example, in order to modify an event associated with an individual connection in the state machine, the student may typically access the event list and change the definition of the event. Alternatively, the student may access the state machine and select a different event to associate with the individual connection. Figs. 28 - 31 are examples of screen displays which are part of a human interface for the Visual Programming block 840. As shown in the menu bar of Fig. 28, the student is preferably given the option of performing one of the following types of activity: Conventional file operations, conventional editing operations, viewing operations, insert operations, simulation operations and conventional Window and Help operations. Using the View menu, also shown in Fig. 28, the student may elect to view various representations of the module he has developed, such as a project map representation, module chart representation, list of tasks, etc. In Fig. 28, the student has selected Connections in the View menu. In response, the student typically is shown, on the screen, a list of the existing state machine connections in his or her module. The student may then select one or another of the connections. As shown, the student has selected connection t6. In 63 response, the student sees a screen display of the parameters of connection t6, including the connection's source and destination states, and the event and function associated with the connection. Typically, each function is a combination of one or more function primitives such as "play", "record", "set expression", etc. A list of the currently defined function primitives and their parameters is typically displayed to the student response to a student selection of the "function primitive" option in the View menu. Fig. 29 is an illustration of a state machine view of a module, generated in response to the student's selection of State Machine from the View menu. As shown, interactions are shown in state form, wherein the creature moves from state to state, wherein transition from state to state is conditional upon occurrence of the event which appears between the states, and is accompanied by occurrence of the function which appears between the states. For example, the transition between State 2 to State 6 is associated with Function 7 and Event 7. This means that when the creature is in State 2, then if it detects Event 7, it performs Function 7 and moves to State 7. Event 7 may, for example, be that the natural human is happy. This is a complex event being a combination of several primitive events such as Loud Voice, High Pitch, Intonation Rises at End of Sentence, "happy" detected by speech recognition unit, 64 etc. Function 7 may, for example, be emission of the following message: "It looks like you're in a great mood today, right?" State 6 may, for example, be a Waiting For Confirmation Of Emotional Diagnosis state in which the creature waits for the natural human to confirm or reject the creature's perception that the natural human is "in a great mood". State 2 may, for example, be an Emotion Change state in which a change in emotion has been detected but the new emotion has not yet been characterized. "U" denotes an unconditional transition from one state to another. In Fig. 30, the student is modifying the module by inserting a new function intended to be associated with a state- to-state connection within the state machine. The function which the student is shown to be inserting is the function "record for 2 seconds". It is appreciated that the Functions option under the View option (Fig. 28) may be employed to define functions which are a sequence of existing functions. The screen display of Fig. 32 includes an illustration of an example of a state machine view of a project. As shown, each connection between states is characterized by an event and by a function. Occurrence of an event causes the function to be performed and the process to flow from the current state to the next state. For example, if event El occurs when the system is in State 1, then the system performs FI and advances to state 6. 65 In Fig. 32, states are represented by ovals, events by diamonds and functions by rectangles . To insert an event and a function for a connection, the student selects the desired connection from the display of Fig. 32, then selects Insert in the main menu bar of Visual Programming and then selects, in turn, Function and Event. The screen display of Fig. 33 enables a student to create an environment in which a previously generated module can be tested. To do this, the student typically does as follows: a. the student generates a simulation of the software that actuates the module (launch setup); b. the student generates a simulation of the environment which deals with inputs to the module and outputs from the module. In other words, the environment simulation generated in step (b) simulatively provides inputs to the module and accepts and acts upon, simulatively, outputs by the module which would have caused the environment to act back onto the module; c . the student defines a setup for monitoring the module ' s performance. Typically, the student defines that certain detected events will be displayed on the screen and certain detected events will be logged into a log file. d. the student executes the simulation, simultaneously monitoring the screen; and e. the student views the contents of the log file. Figs. 34 - 37 are examples of display screens presented by the teacher workstation 312 of Figs. 23A, 23B or 23C. Specifically, Fig. 34 is an example of a display screen 66 generated within the Student Administration unit 715 of Fig. 26. As shown, the display screen enables a teacher to enter and modify student identification particulars and also to view the project and module assigned to each student and preferably, the status of the project and module. The display screen also allows the teacher to assign a mark to the student. Alternatively, assigning marks may be part of execution monitoring (unit 760). Assignment of students to projects and modules is typically carried out within the project module assignment unit 730 as described below with reference to Fig. 35. Fig. 35 is an example of a display screen generated within the project module assignment unit 730 of Fig. 26. As shown, the teacher typically selects a project from among a menu of projects which typically displays characteristics of each project such as level of difficulty, number of modules, etc. In Fig. 13, the teacher has selected the "policeman" project. As shown, there are several modules within the project. The teacher also selects a class to perform the project. In Fig. 35, the teacher has selected Class 3A and in response, the screen display has displayed to the teacher, a list of the students in Class 3A. The screen display also displays to the teacher a list of the modules in the "policeman" project and the teacher assigns one or more students to each module, typically by clicking on selected students in the student menu. Fig. 36 is an example of a display screen generated within the integration supervising unit 740 of Fig. 26. As shown, the teacher typically determines at least an order in which 67 modules will be integrated to form the finished project. The system typically draws graphic representations of connections between modules which are to be integrated with one another. Each such connection is typically marked with a date and with a status indication (integrated/not-integrated) . Fig. 37 is an example of a display screen generated within the assign run-time unit 755 of Fig. 26. The assign runtime unit is particularly important if the creature generated is a physical creature rather than a virtual creature. If this is the case, then the physical creature typically is a scarce resource shared by a large number of students. As shown, the teacher typically selects a physical creature, such as a red policeman, from among an available pool of physical creatures. The selected physical creature performs the functionalities defined by the teacher's students when working on the policeman project, at a teacher-determined time. If two different modules are assigned to the same time and the same creature, i.e. if the red policeman is instructed to operate in his "victim's relative" module and in his "suspect" module, then the teacher typically defines a priority system such that overriding is minimal. Fig. 38 is a simplified flowchart illustration of the process by which the student typically uses the student workstation 310 of Fig. 23. A preferred flowchart illustration of processes performed by the student in the course of performing steps 910 and 920 of Fig. 38 is described hereinbelow with reference to Fig. 41. 68 As shown, initially, a teacher or project delineator defines states, i.e. categories of emotion (happy, sad, angry). A student operationally defines each emotion category in terms of contents of and/or characteristics of verbal inputs recorded/received from human. The student defines events to partition emotions into categories. Characteristics of verbal inputs include: voice amplitude, voice pitch, rate of speech and diction quality. The student defines explicit interrogations confirming various categories of emotion. The student defines each interrogation as a state, each interrogation as a function, and each result of interrogation as an event. The student and/or teacher determines modification of interaction with human according to category of human's emotion. Fig. 39 is an example of a display screen generated by selecting Event in the Insert menu in the student workstation 10. As shown, the event which is being selected comprises closure of various switches. Specifically, the event comprises closure of a switch in the right hand of the creature 324 or closure of a switch in the right foot of the creature. Fig. 40 is an example of a display screen generated by selecting Function in the Insert menu in the student workstation 10. As shown, the function which is being selected comprises an eye-motion. Specifically, the function comprises movement of the eyeballs to the left. Preferred embodiments of the present invention and technologies relevant thereto are now described with reference to Figs. 42 - 68. 69 A preferred architecture of the LOLA application is described in chart form in Figs. 42 - 68. The LOLA system is a distributed application that is composed of several main processes. Address and data spaces boundaries are separating these processes which can reside on one computer or on different computers in the network. These processes use a standard middleware (MW) like CORBA/DCOM/RMI in order to communicate transparently with each other. The main processes are: Task dispatcher: This component runs on every radio base station that communicates with living objects. The main sub-components in this component are described in Figs. 42 - 68. Proxy Objects: Responsibilities: Every living object in the system has a corresponding object that represents it. All operation invocations that are done on a living object are first invoked on its proxy object, and all events generated by a living object are first received in its proxy object. In addition, the proxy object is responsible to store and track the state of each living object. The proxy object is a remote object in order to allow interprocess communication. Services used by the proxies (collaborators): * The proxies are using the provided Java Bean in order to invoke operations and receive events from the living object. * The security manager in order to verify if a requested operation is legal. 70 * The log and event service in order to log messages and generate events . Services provided to other components: * The tasks that are spawned by the dispatcher interact locally with the proxies. * The IDE can interact with the proxies in order to allow remote debugging or executions . * The management console can remotely interact with the proxy in order to invoke diagnostics and monitoring operations. Dispatcher engine: Responsibilities: Gets from the task manager the registered tasks for execution, and executes each task in a separate thread. The tasks run in a sandbox in order to enforce security policies. Services used by the dispatcher: * The task manager in order to receive the registered tasks. * The spawned tasks use the proxy objects in order to invoke operations on the living objects. * The timer, in order to receive time events. * The log and event service in order to log messages and generate events . Services provided to other components : * The IDE can interact with the dispatcher in order to coordinate remote debugging or executions . * The management console can remotely interact with the dispatcher in order to invoke diagnostics and monitoring operations. Timer: Responsibilities: Generate time events to the registered listen- 71 ers . Services used by the timer: * The timer doesn't use any service provided by the LOLA system. It only uses OS services. Services provided to other components : * The dispatcher registers in the timer in order to receive time events . LOLA Servers This component supplies the required services to all other components in the system. The main sub-components in this component are described in Figs. 42 - 68. Log server: Responsibilities: The log server is responsible to log messages of other components in the system, and to retrieve those messages according to several criteria. Log messages, unlike events are just logs, i.e. they only log information, rather then expect that some action will be triggered from that log messages. Services used by the log server: * The persistent storage service in order to keep the logs in a persistent storage. Services provided to other components: * The dispatcher and the proxies log certain events during task executions. * The management console and the students IDE in order to track the execution of particular tasks . * The teacher management console in order to receive statistics about task executions. Monitor engine: 72 Responsibilities: The monitor engine is responsible to receive events from other components in the system, and to act upon them according to event-condition-action logic . The monitor engine supplies such logic on a system wide basis, even though this component can in addition reside on every radio base station in order to allow local handling of events. Services used by the monitor engine: * The persistent storage service in order to keep the policies and the received events in a persistent storage. Services provided to other components : * The dispatcher and the proxies generate events during task executions, or when pooling the system for its sanity. * The management console in order to receive the events and act appropriately upon them. Security manager: Responsibilities: The security manager keeps in a repository all the users, groups, and roles in the system, and according to that decides who has the permission to do what action. Services used by the security manager: * The persistent storage service in order to keep the users, groups and roles in a persistent storage. Services provided to other components : * The proxies in order to confirm remote operations that are invoked on them. * The task manager in order to confirm that a specific task registration is allowed. 73 Task Manager: Responsibilities: The task manager keeps in a repository all the tasks in the system, and according to that supplies the appropriate radio base stations the tasks that they should execute. Services used by the task manager: * The persistent storage service in order to keep the tasks in a persistent storage. * The security manager in order to confirm task registration. Services provided to other components: * The radio base stations in order to receive the registered tasks. Management Console This component is the console of the administrator that monitors and controls the system behavior, and configures the system appropriately. In addition, it provides the teacher a console from which it can query the system in order to do tasks such as evaluate students works, or assign permissions to its students to execute particular tasks. The main sub-components in this component are illustrated in Figs. 42 - 68. An on-line view of these components is also shown in these figures. Responsibilities: The console for on-line monitoring and control of the system. View of things like the tasks that are running on each radio base station, and the state and status of each living object. The ability to invoke operations such as 74 changing the channel of a particular living object. The ability to view all the events that are generated in the system. Services used by the on-line view typically include: * The proxy object in order to invoke operations on them, and receive events from them. * The dispatcher in order to monitor and control tasks executions in an on-line manner. * The monitor engine in order to receive events on a system wide basis. Services provided to other components : * The on-line view is only a GUI client. A configuration view is illustrated in the figures. Responsibilities : The console for configuring the system during its run-time. Configurations such as definitions of users, groups, and roles are done from this console. Services used by the configuration view * The security manager in order to authorize the invoked operations. Services provided to other components : * The configuration view is only a GUI client. Off-line view: Responsibilities: Configurations done to the system not during its normal executions, such as upgrade, adding living objects, and others. Services used by the configuration view Services provided to other components : 75 * The configuration view is only a GUI client. Teacher Console Responsibilities: The console to be used by the teacher in order to evaluate the students ' works . The teacher will be provided with information such as the popularity of the students ' works , and other statistics about the task executions. In addition, the teacher will be able to view the source of all the tasks that were written by its students . Services used by the configuration view * The task manager in order to view the source of its students tasks. * The log server in order to obtain statistics about tasks executions . Services provided to other components : * The off-line view is only a GUI client. Integrated Development Environment (IDE) This component runs on each student programming station. The architecture support the following three possibilities: * A standalone PC residing in the student home and not connected to the Internet. * A PC residing in the students home, and connected to the LOLA system via the Internet. A firewall can reside between the PC in the student home, and the LOLA system. * A PC residing in an internal intranet, and connected to other LOLA components via a standard middleware. 76 IDE core : Responsibilities: The integrated development environment that is used by the students to write tasks that will be executed by the task dispatcher. Services used by the IDE core: * The IDE core use the living object simulator in order to test the task before register is for execution. * The IDE core can use the proxy object in order to execute the task on a real living object. This feature can be used only if the IDE core can communicate with the proxy object via the middleware, i.e. only if the PC resides on the same intranet, or remotely from home if a firewall doesn't restrict packets of the middleware port, and the available bandwidth allows that. Services provided to other components: * The IDE core is only a client of services. Proxies Simulator: Responsibilities: Simulate the proxies of the living object in order to allow local debugging and executions of tasks. Services used by the configuration view * Services provided to other components : * The IDE core uses the simulator for local task execution and debugging. Tasks registration: Responsibilities: Browser based component that provides 77 the students the ability to add or delete tasks for execution on a radio-based PC. Services used by the configuration view * The task registration server. Services provided to other components: * Deployment This component is responsible for the deployment of all other components in the system. In particular, it is responsible for the deployment of all proxy objects and their corresponding simulators, and the building of these objects if necessary. The building of these objects is optional, and basically there are three alternatives regarding this issue: * All objects are of the same type, i.e. all objects have the same interface regardless the living object they represent. Operations that are specific to a particular living object are executed via a common interface like "send_cmd". The advantage of this approach is simple deployment, maintenance and configuration of the system. The disadvantage, is a command set that is less meaningful to its users, and more important, that improper use of the command will be detected only when the task is executed on the living object, rather than being detected before on the simulator or at compile time. * All objects are of the same type in the API level, but every object knows its type. All types in the system reside in a repository. Thus, from deployment and maintenance perspective this approach is less simple, the API of the command set is still not meaningful, but errors can be detected when the task is executed on the simulator. 78 * Objects from different types have different API to access them. Thus, the deployment and maintenance of the system is even less simple because code is generated and build according to the types of the living objects, rather than just being kept in a repository, or not kept at all. However, the command set is more meaningful to its users, and errors will be detected as soon as, the task is compiled. Thus, this approach is the preferred approach. However, implementing this approach requires more development efforts, and thus can be implemented only in a secondary iteration. Task and security managers data model Figs. 42 - 68 include a chart which describes the data models of the task and security managers. * User: * Name. * Password: encrypted using one-way function. * Group/s: one or more groups the user belongs to. * Group: * Name. * Users: zero or more users that belong to this group. * Roles: zero or more roles that are associated with this group. * Role: * Name. * Permissions: According to the following criteria: * Living object types. * Living objects. * Computers. 79 * Times: capabilities like UNIX crontab. * Task: * Name . * Location. * Users: One or more users that wrote this task. * Execution time: Where and when this task will execute. Must match the roles that associated with the user's group. * Living object: * Name * Type * Host * Tasks: zero or more tasks that operate this living object. * Living object type: * Name. Components descriptions Security Manager The security manager exports two main servers for other components : * ConfigAuthorization: Responsible to build the repository of users, groups and roles. Its exported operations are remote operations. The administrator triggers the invocation of these operations whenever she decides to update the definitions of pupils, groups and roles. The administrator makes these changes through its GUI-based console that acts as a clients that uses the above mentioned operations. * ConfirmAuthorization: Responsible to check whether a 80 specific operation is legal, by using the data in the repository. The clients of this service are: * The task manager - it asks for confirmations whenever a pupil registers a task. * The proxy objects - is asks for confirmations whenever a pupil invoke a remote operation. Task Manager The task manager keeps in a repository all the tasks in the system, and according to that supplies the appropriate radio base stations the tasks that they should execute. Figs. 42 - 68 include a diagram illustration of the scenario where a pupil registers a task for execution. She first enters her user and password, and the security manager checks the authorization of the pupil. If authorized, the pupil gets a menu of all the allowed operations, i.e. she get a menu with the following operations : * Add task * Remove task * Update task * List all registered tasks Suppose that the pupil decides to register a task for execution, so she chooses the "Add task" operation. The task manager receives the task content and the task info, and asks the security manager whether the pupil is permitted to register a task with the specified task info. If so, the task manager registers the task, and notifies the pupil that the registration ended successfully. 81 Task scheduler: The task scheduler is responsible for the scheduling of all the registered tasks. Whenever the execution time of a task arrives, the task scheduler is responsible to notify the appropriate dispatcher that it should download the task and spawn it. When the scheduler starts, it iterates through all the list of registered task, and for every Schedlnfo object it builds a simple object that contains the next time that this task should be started and stopped. The task scheduler keeps a list of indexes of all the registered tasks, according to their execution time. It then registers in the timer to receive events whenever the execution time of a task arrives . Upon receiving such event it notifies the appropriate dispatcher that it should download and execute the task. Task dispatcher: The task dispatcher gets from the scheduler a registered task, whenever the start time of the task arrives. Then, it executes the task in a separate thread. Each task runs in a sandbox in order to enforce security policies. The following state diagram describes the task dispatcher. A diagram included in Figs. 42 - 68 describes the data flow among the task dispatcher, task scheduler and other components in the system. The task scheduler can receive time events from the timer, and taskListChange event from the task manager. The time event is generated when the start execution time of a task arrives. This event triggers the downloading and 82 spawning of a task from the scheduler to the dispatcher. The taskListChange event actually changes the list of the scheduled task, thus changes the registrations in the timer. The management console can browse and change manually the tasks that are executing. General consdierations relating to preferred LOLA system implementations are now described. The LOLA (Living Object LAboratory) is a computer class that enables pupils to build and experience animation of physical figures called living objects. The animation provides the living objects with the ability to interact with users in a human voice, in a human-like and intelligent manner. The Living Objects Laboratory teaches pupils to analyze, design and program "Natural Intelligence" (NI) into physical objects - the Living Objects figures. The NI developed by the pupils over time accumulates and increases the ability of the Living Objects to interact with the pupils. The Living Objects figures are distributed over the schoolyard and are used as playing and educational objects for all the children in the schoolyard. Natural Intelligence Natural Intelligence is the ability of a computerized object to present "human-like behavior". Human beings, even the very young are highly adaptive to their ever-changing environment. This skill enables a significant amount of freedom in the interaction between humans . Computer based systems have strict interaction 83 protocol. The behavior of a computerized machine is highly predictable and very accurate as long as the communicator (user or another computerized machine) strictly follows the rules of the protocol. Deviation from the protocol should lead to immediate cessation of the interaction. Programming of computers and computer-based machines is oriented to "problem solving". The program ends (or pauses, waiting for a new input or event) when an well-identified target is reached. Human interaction is oriented towards building a growing shared understanding. Even when the final goal of the interaction is to solve a problem,, the "continuous goal" of each step of the interaction is to collect and add relevant information to the collective pool of knowledge. This can be done until the final goal is reached. In many situations, the final goal is not known before the interaction begins, and is identified only later, as a result of the interaction. Implementing Natural Intelligence into a machine enables the machine to perform the following loop: 1. Identify a situation. 2. Respond to a human being. 3. Deliver information that describes the accumulated or additional understanding of the situation. 4. Identify what information is missing. 5. Suggest additional information. 6. Request additional information. 7. Receive the human response and analyze it. Goals of LOLA 84 The first implementation of LOLA is targeted at high schools for educational purposes. These are the high level goals of the project: * Teaches pupils to analyze, design and program "Natural Intelligence" (NI) into physical objects. * Friendly and easy to use system that will attract pupils to learn high technology subjects. * Support teachers in tasks assignments and grading. * Serves as content-based objects that amuse and provide information to the pupils and staff. Services and their Use Case Analysis The main actors in the system are pupil, teacher, administrator and user. This document specifies the important use-cases of the actors of the system. The use-cases are grouped by the actors targeted by the service: pupil, teacher, administrator and user. One person can act as one or more actors. In particular, every pupil, teacher and administrator is also a user of the system. It might be that the same person acts as a teacher and an administrator. The major components in the system are: * Programming station: every station that contains the IDE (Integrated Development Environment) that provide the ability to program NI into Living Objects. The computer at the pupils' home can also be such a programming station, if Creator IDE was installed on it. * Radio based station: every station that communicates with one or more Living Objects (via RF communication), and sends 85 these objects commands. * LOLA servers: Station that hosts the servers of the LOLA system, e.g. task server, security server. * Teacher and administrator console: stations in the lab that are used by the teacher and administrator respectively. * Living objects: Living objects are toys equipped with a control device. The control device contains a micro-controller, a radio transceiver and I/O ports. The I/O ports connect to various peripheral components also contained within the Living Objects, such as: speaker(s), microphone ( s ) , sensors, actuators, motor(s), lamps, video camera, etc. The peripherals enable the Living Object to interact with humans in a human-like manner. The peripherals are operated by the micro-controller. The micro-controller receives its program instruction in real time from a radio-based PC via the built-in transceiver. Two more secondary actors that provide data for building an internal database are later introduced. An information server that provides data for building an internal database that support queries made from pupils tasks, and a contents provider that provides contents that will be kept in a contents database. These contents will be scheduled for execution as determined. We describe the services, and an analysis of the related use cases. Pupil Services The main services offered to pupils, who build the behaviors of the living objects, are illustrated in the drawings. 86 Name Creator IDE Installation Actors Pupil if installed on her home PC, administrator if installed on a PC at school. Teacher might also install the IDE on her home PC in order to browse her pupils ' tasks . Goal That Creator IDE will be installed correctly. Forces in Context 1) There could have been previous installations. In such a case, this installation will be an upgrade of previous installations . 2) Installshield type installation. 3) Pupil typically works on Windows 95/98 based PC, but might also work on other environments such as Macintosh, Windows3.il/DOS, Linux or NC (in such a case the installation will take place in the server). Trigger Actor starts the installation process from a CD, or from a downloaded file. Summary This use case captures the first, and later installations of Creator IDE: 1) Actor is asked for several configurations parameters. 2 ) Actor advances to regular usage of Creator IDE . Pre-conditions Actor downloaded the package, or has a CD. 87 Post-conditions Creator IDE is installed. Related use cases Create or Update living object types on a PC at home should be followed immediately, or be deferred to a later time at the users convenience. Name Add living object type at home Actors Pupil. Teacher might also be an actor of this use-case if she has installed the IDE on her home PC. Administrator is not an actor here: Administrator has a separate use case dealing with living object updates. Goal That the types of all living objects in the system will be known to Creator IDE, in order to support a simulator for every living object type. Forces in Context 1 ) The information source will be typically the LOLA system installed at school, and the update process will be browser based and be done via the Internet. A firewall might reside between the pupil browser at home, and the LOLA system. 2) The pupil can put the required data on a floppy disk (or other media) at school, and then install it on her PC at home. Trigger 88 Can be either one of the following triggers : 1) The Creator IDE has been just being installed. 2) New type of living object has been connected to the system. Summary Create or update the types of the living objects known to' the IDE installed at the pupil's home. Pre-conditions Creator IDE has been Installed. Post-conditions 1) The simulators in Creator IDE are matching the types of the available living objects. 2) Pupil can commence to build a decision tree. Related use cases 1 ) Creator IDE Installation 2) LOLA installation Name Build a decision tree Actors Pupil Goal Build a task that is ready for compilation. Forces in Context 1 ) No programming knowledge is required 2) Easy to use friendly GUI. 3) Can reuse decision trees or sub-trees made in previous tasks . 89 4) Can use built-in decision trees or sub-trees. 5 ) Pupil wants to use high level commands that are specific to the toy she is working with. Trigger 1) Teacher assigns homework to her pupils. 2) Pupil builds the decision tree during a class in the larb, or by his own free choice. Summary This use case captures the scenario where a pupil builds a decision tree in order to program NI into a living object. 1 ) Pupil launch Creator IDE . 2) Pupil builds a decision tree. Pre-conditions 1) Creator IDE is installed on the pupil desktop. Post-conditions 1) A task that is ready for compilation. Related use cases 1) Creator IDE installation: is a requirement. 2) Create or Update living object types on a PC at home: is a requirement. Name Build a highly customized decision tree Actors Pupil Goal Build a task that is ready for compilation. 90 Forces in Context 1) Basic programming skills are required. 2 ) Easy to use programming language and libraries . 3) Reuse decision trees or sub-trees made in previous tasks. 4) Use built-in decision trees or sub-trees. 5 ) Pupil wants to use high level commands that are specific to the toy she is working with. Trigger 1) Teacher assigns homework to her pupils. 2) Pupil builds the decision tree during a class in the lab, or by his own free choice. Summary This use case captures the scenario where a pupil builds a decision tree in order to program NI into a living object. 1 ) Pupil launch Creator IDE . 2) Pupil builds a decision tree. Pre-conditions 1) Creator IDE is installed on the pupil desktop. 2) Simulators simulate the living objects that exist in school. Post-conditions 1) A task that is ready for compilation. Related use cases 1) Creator IDE installation: is a requirement. 2) Create or Update living object types on a PC at 91 home: is a requirement. Name Compile a task Actors Pupil Goal Produce a task that is ready for execution on a living object, which behaves according to the decision tree built by the pupil. Forces in Context 1) Pupil should not be familiar with the internal implementation of the decision tree. 2) If the pupil only built a decision tree without the addition of pupil's defined macros/code, then the compilation process should be expected to pass in most cases. 3) Compilation errors/warning should be displayed by a view of a decision tree. Only in cases that the pupil added macros, these lines should be displayed either. 4) Friendly, easy to use. Trigger 1) Pupil has built a decision tree. Summary This use case captures the scenario where a pupil built a decision tree, and wants to compile it. 1) Pupil launch Creator IDE. 2) Pupil builds a decision tree. 3) Pupil compiles the task. Pre-conditions 92 1) Pupil has built a decision tree. Post-conditions 1) If compilation passes - a task that is ready for execution. Related use cases 1 ) Build a highly customize decision tree or Build a decision tree is a requirement. Name Execute a task Actors Pupil Goal Execute a task locally on the pupil PC in order to check it. The task is interacting with a living object simulator resides on the pupil PC, or if available with a physical living object connected either to the pupil PC, or to other PC in the network . Forces in Context 1) Living object simulator should simulate accurately a physical living-object behavior. In particular, it should point on all errors that can occur when this task is executed alone on a living object. 2 ) Look as an integral part of Creator IDE . 3) Friendly, easy to use GUI. 4) Security: check pupil permission in case she is trying to execute the task on a living object connected to a remote PC. 93 Trigger 1) Pupil built and compiled a task, and wants to execute it. Summary This use case captures the scenario where a pupil has built a decision tree, and wants immediately to run it, typically in. order to check the task. 1) Pupil launch Creator IDE. 2) Pupil builds a decision tree. 3) Pupil compiles the task. 4) Pupil executes the task. Pre-conditions 1) Pupil has built a decision tree and compiled it. Post-conditions 1 ) A task that is ready for execution on a living object. Related use cases 1) Build a highly customize decision tree or Build a decision tree and compile a task is a requirement. Name Debug a task Actors Pupil Goal Debug a task locally on the pupil PC. The task is interacting with a living object simulator resides on the pupil PC, or if available with a physical living object connected to 94 the pupil PC, or to other computer in the network. Forces in Context 1) Living object simulator should simulate accurately a physical living-object behavior. In particular, it should point on all errors that can occur when this task is executed with the living object alone. 2) Look as an integral part of Creator IDE. 3) Friendly, easy to use GUI. 4 ) Security checks if pupil executes the task on a living object connected to a remote PC. 5) Pupil can trace task execution in steps, and can see in a graphical way what node in the decision tree is being executed now. 6) Pupil can step into lines of code added to the decision tree. 7) Usual debug capabilities like step into, step over, run to cursor, set breakpoint, continue, watch, etc... Trigger 1) Pupil built and compiled a task, and wants to debug it. Summary This use case captures the scenario where a pupil has built a decision tree, and wants to debug it. 1) Pupil launch Creator IDE. 2) Pupil builds a decision tree. 3) Pupil compiles the task. 4) Pupil debugs the task. 95 Pre-conditions 1) Pupil has built a decision tree. Post-conditions 1) A task that is ready for execution on a living object. Related use cases 1) Build a highly customize decision tree or Build a decision tree and compile a task is preferably a requirement. Name Task registration Actors Pupil Goal That the task will be installed correctly, and run when scheduled. Forces in Context 1 ) Browser-based registration via the Internet or intranet. 2) Security, privacy. 3) Firewall can reside between the web-based client and the servers. Trigger Pupil starts the registration process, typically after she has built, executed and debugged a task. Summary This use case captures the case where pupil registers a task for execution. 96 1) Pupil is asked for a user-name and password. 2) Pupil is asked to send the file of the task. 3) Pupil can browse all her registered tasks, and perform additional operations such as remove previously registered tasks. Pre-conditions Pupil has built, executed and debugged her task. Post-conditions Task is registered for execution as scheduled. Related use cases 1) Debug a task or Execute a task. Name Browse task's executions logs Actors The main actor is a pupil. A teacher or an administrator might also be the actors of this use-case, typically in order to help in problems solving. Goal Browse the logs of a task that has been already executed, typically in order to diagnose problems. Forces in Context 1 ) Pupils can browse the logs from every PC that is connected to the intranet. 2) Browser-based logs browsing via the Internet, where a firewall resides between the PC at home and the LOLA system is a nice to have feature. 3) Pupil can browse logs according to several criteria. Trigger 97 1) Pupil's task has been executed, and pupil wants to browse the execution logs . Summary This use case captures the scenario where a pupil has built a decision tree, registered it for execution, and wants to browse the logs of the execution. 1 ) Pupil launch Creator IDE . 2) Pupil builds a decision tree. 3) Pupil debugs the task. 4) Pupil registers the task. 5 ) Pupil browses the execution ' s logs . Pre-conditions 1) Pupil has registered a task, and that task has already been executed. Post-conditions 1) Pupil understands how her task has been executed. Related use cases 1) Task registration is a requirement. Teacher Services Teacher is responsible for all aspects of task assignments, checking and evaluation. Name Browse pupils tasks Actors Teacher Goal 98 Browse pupils tasks in order to evaluate their tasks, or help with problem solving. Forces in Context 1) Security, privacy - only a teacher can browse pupils tasks. 2) Teacher can browse every registered task. 3) Teacher uses creator IDE as the task browser. 4) According to the configuration, teacher can or can not change pupils tasks. Trigger Teacher wants to evaluate her pupils tasks, or help them in problems solving. Summary 1 ) Teacher launch creator IDE . 2) Teacher logs into the task manager. 3) Teacher loads a task from the server to her IDE. Pre-conditions 1) Creator IDE is installed on the teacher desktop. Post-conditions A pupil task appears on the teacher console. Related use cases Creator IDE Installation is a requirement. The use case of Executed tasks statistics is either used as a measure to evaluate pupils tasks. Name Executed tasks statistics Actors 99 Teacher Goal Teacher browses through the statistics gathered about her pupils tasks, typically in order to evaluate their works. Forces in Context 1) Security, privacy - only a teacher can browse pupils tasks . 2 ) Teacher can browse every statistics related to her pupils tasks. Trigger 1) Teacher wants to evaluate her pupils tasks. Summary 1) Teacher logs into the statistics server. 2) Teacher queries the server for data, and browses this data. Pre-conditions Pupils tasks have been already executed in the system. Post-conditions Teacher has more measures to evaluate her pupils tasks. Related use cases The use case of browse pupils tasks is either used as a measure to evaluate pupils tasks. Administrators Services The administrator is responsible for the installation, deployment, maintenance, diagnostics, monitoring and controlling of the system. Name 100 Installation Actors Administrator Goal That the LOLA system will be installed correctly Forces in Context 1 ) Application components should be deployed in such a way that no bottlenecks will occur, and the system will run in an efficient way. 2) Installation process can be done from a central location. 3 ) There could have been previous installations . In such case, this installation will be upgrade of previous installations . 4) Installshield like installation. 5 ) System should scale to support tens of living objects, and hundreds of pupils. Trigger Administrator starts the installation process from CD, or from a downloaded file. Summary This use case captures the first, and later installations of the LOLA system: 1 ) Administrator is asked for several configurations parameters . 2) Administrator advances to the update living object use case. Pre-conditions 101 Administrator downloaded the package, or has a CD. Post-conditions Everything is setup for defining living object types. Related use cases 1) Update living object types can follow immediately, or be deferred to a later time at the user's convenience. Name Add living object types Actors Administrator Goal That the types and objects of all living objects in the system will be known to the system, and appropriate application components will be deployed according to that. Forces in Context 1) Done from a central location. 2) Living objects and objects types can be added or removed from the system during its lifetime, and not only after the installation. 3) In particular, the simulators residing in the IDE on the pupils PCs at home should be updated. Trigger 1) The LOLA system has been just being installed. 2) New type of living object should be connected to the system. Summary The system is configured according to the available living ob- 102 jects. Pre-conditions Installation of the system. Post-conditions All living object types are known in the system. Related use cases 1 ) Installation 2 ) Trigger the use case of Create or update living object types on a PC at home. Name Pupils, groups and roles definitions Actors Administrator Goal Pupils can log into the system, and perform actions according to their permissions. Forces in Context 1 ) Flexibility - pupil can be belong to one or more groups, and each group can have one or more roles. The same role can be assigned to several groups. 2) This process can be done after installation, and configuration of the living object, as well as on a regular basis whenever new pupils, groups or roles should be added or removed. 3) Users definition is independent of the OS users. Trigger The teacher asks the administrator to open accounts to her pupils, so that they will start using the system. 103 Summary This use case captures the scenario where a teacher of a class wants that her pupils will be granted with permission to use the system. 1) Administrator defines roles: each role definition consists of role name and the permissions that the owner of this ro.le is granted. Permissions can be granted according to the following criteria: * Living object types. * Living objects. * Times: capabilities like UNIX crontab. 2) Administrator defines groups: each group definition consists of group name, and zero or more roles that are associated with this group. 3) Administrator defines users: each user definition consists of user name, password (encrypted with one-way function) and zero or more roles that are associated with this group. Pre-conditions 1) Installation. 2) Update living objects types. Post-conditions Pupils can log into the system according to their permissions. Related use cases 1) Installation and Update living object types are required. Name 104 Diagnose, monitor and control the system. Actors Administrator Goal That the actor be able to diagnose, monitor and control the system. Forces in Context 1 ) Potential problems should be detected in advance when possible. 2) Isolate problems through diagnostics tools. 3 ) Resolve problems through corrective measures . 4 ) Automatic sanity checks . 5 ) Allow the administrator to define automatic action to certain events, e.g. change the RF channel upon receiving a specific time event. 6) Administrator can invoke operations on living objects, and receive events from them in an on-line manner. 7) Administrator can browse all events in the system. 8) Browser-based management console. 9) Security. 10) Integration with enterprise management console if exists. Trigger Management of the system on a regular basis, or after a pupil or a teacher complains of problems. Summary 1 ) Administrator launch browser-based management 105 station. 2) Administrator diagnoses, monitors, and controls the system. Pre-conditions 1) System has been already installed Post-conditions System functions correctly. Related use cases 1) Installation. 2 ) Browse and change scheduling time of tasks . Name Browse and change scheduling time of tasks. Actors Administrator Goal Control the execution time of tasks from a central location, and from a view of the whole system. Forces in Context 1 ) Potential problems that stem from task scheduling should be detected in advance when possible. 2) Administrator should be able to see the scheduling time of all tasks in the system, and in several views. 3 ) Administrator should be able to change scheduling time of tasks, or to schedule unscheduled tasks for execution. 4) Security. Trigger 1) Pupils have just registered their tasks for 106 execution. Administrator wants to verify that they scheduled their tasks appropriately. Note: Pupils can only register tasks according to their permissions. However, they still can register tasks not appropriately - for example - if two or more pupils have registered tasks on the same living object and with overlapping times, and those tasks acts on same sensors. 2) Pupils have registered tasks, but didn't specify the scheduling time, typically because the administrator wants to avoid conflicts and specify it herself. Thus, the administrator specifies the scheduling times of all tasks. 3 ) Tasks had been downloaded from a content provider server on the Internet. Administrator wants to schedule those tasks for execution. Summary 1) Administrator launches browser-based management station. 2) Administrator browses all tasks in the system, and their scheduling times if schedules. 3) Administrator changes scheduling times of tasks, or scheduled new tasks for execution. Pre-conditions 1 ) System has been already installed 2 ) Tasks have been already registered in the system, or downloaded into the system. Post-conditions Tasks are scheduled for execution as desired. Related use cases 107 1) Installation. 2) Diagnose, monitor and control the system. Users Services The users can be everyone in the schoolyard that interacts with a living object. In particular it can be. a pupil, teacher, administrator or none of them. Name Interaction with living object Actors User Goal The purpose of the interaction can be for amusement, education, task checking (pupil or teacher), or system checking (administrator) . Forces in Context 1) Friendly interaction. 2) Living object operated according to the registered tasks and the scheduler that schedule these tasks for executions. Trigger User sees a living object in the schoolyard and decides to interact with it. Summary This use case captures the scenario where a user interacts with a living object. User interacts with the living object by voice (listening or talking to it), by watching its reactions, or by triggering its sensors. Pre-conditions 108 One or more tasks are executing with the living object. Post-conditions One or both of the followings: 1) The user is amused, more educated. 2) A task has been checked with a physical living object (student or teacher). 3) Living object has been checked of its functionality (administrator) . Related use cases 1) Execute a task. 2) Debug a task. 3) Task registration. Contents providers Services External servers that interact with the system in order to push data into LOLA database, or supply such data upon a request from a LOLA client. Name Build contents database Actors Contents providers Goal Push or supply tasks (contents) that will run on living objects. Forces in Context 1 ) Leverage the capabilities developed for the LOIS system. 109 2 ) Contents can be pushed automatically on a regular basis, or can be pulled upon a request. 3) Tasks written by contents providers are scheduled for execution in a similar way to tasks written by pupils. Trigger Depends on the configuration: 1) Generally, administrator will configure the push client to run updates at specific intervals, so the trigger is the push client scheduler. 2) Administrator may manually initiate a download. Summary This use case captures the scenario where the administrator at school wants to schedule for execution tasks that were written by contents providers, and to update these tasks on a regular basis. These tasks are scheduled for execution in a similar way to tasks written by pupils. All the use-cases that support that action, e.g. registration, billing, content-provider side are considered part of the LOIS system. Pre-conditions 1) The LOLA system has been installed. 2 ) The installation and registration use cases of the LOIS system. Post-conditions 1) New content that is ready for execution resides now in the tasks database. Related use cases 1 ) Installation 110 Information servers Services External servers that interact with the system in order to push data into LOLA database, or supply such data upon a request from a LOLA client. Name Supplies information to build a database that supports queries of pupils tasks. Actors Information servers Goal Push or supply data that will serve pupils database queries . Forces in Context 1 ) Use standard tools and protocols to build this database. 2) Data can be pushed automatically on a regular basis, or can be pulled upon a request. Trigger Depends on the configuration: 1) Generally, administrator will configure the push client to run updates at specific intervals, so the trigger is the push client scheduler. 2) Administrator may manually initiate a download. Summary This use case captures the scenario where the administrator at school wants to build an internal database that 111 pupils can query it, instead of searching the desired data on the web. Pre-conditions The LOLA system has been installed. Post-conditions 1) The database is updated. Related use cases 1) Installation Fig. 42 is a simplified flowchart illustration of an emotional interaction flowchart design process. Figs. 43 - 102 illustrate preferred embodiments of a computerized programming teaching system constructed and operative in accordance with a preferred embodiment of the present invention. Figs. 69 to 102 are now described in detail. Figure 69 is a general logical overview of the system network with the servers (such as the database server 316 and creature control server 318) at the center and the students' programming workstations 310, teacher station 312, administrator station 1200, and radio base station 320 clustered around the servers . Figure 70 is a general logical overview of the control over the creatures 322 with the radio base station (that provides the control over the creatures ) at the center and the students ' programming workstations 310, teacher station 312, administrator station 1200, and radio base station 320 clustered around the servers . Figure 71: 112 The main menu of the administrator station comprises of four main sub-menus: Real-Time Information 1250 regarding the operation of the system. Diagnose 1260 for troubleshooting hardware and software problems. Configuration and registration 1270 of software and hardware components and Task 1280 for the deployment and administration of the various tasks (projects, programs) provided by students and executed by the system. Figure 72 illustrates the basic steps for developing and testing a task (project, program) at home. First the student develops the task (step 1290), then compiles the source code (step 1300), than executes the task using the simulator (step 1310). If the task does not perform as it was designed the student uses the simulator (step 1320) to debug the program and to find the problem, correct it and test the task again. If the task performs as designed the student registers the task (step 1330) to be executed over a physical creature. Figure 73 illustrates the process of developing, testing and registration of a task by a student at home and at school. The process begins with the student at home, similar to Fig 62, however, the student transfers the task to school and continues with the same process at school. Figure 74 is a flow chart describing a very simple "decision tree" (also termed "state machine"). This flow chart instructs the creature to enter "listen mode", thus recording the verbal utterances of the user and processing the recording by means of the speech recognition engine. The listen mode persists until the term "wake-up" is spotted the task sings a song. After 113 the song is finished the process repeats. Figure 75 is a block diagram showing the main functions of the simulation engine. The simulation engine enables .the student to test the program (task) developed for a physical creature without a physical creature itself. The simulation engine provides all the physical functions of the physical creature by means of standard computer peripherals such as computer microphone to simulate creature listen functions (1450), computer speakers to simulate creature talking functions (1460), simulation of the creature motion by displaying animation of the creature on the computer screen (1470), simulation of the creature sensors with the computer keyboard and mouse (1480) and simulation of video display and video camera installed in the creature by means of the computer display and peripheral video camera. Figure 76 is a flow chart describing the process of registration and execution of a project (task) . In step 1500 the student or the teacher registers the task in the database server (Lola server) 316 for future execution by means of a specific creature control server 318 and a specific creature 324. In step 1510, at the appropriate date, time or other conditions as specified in the registration step 1500, the Lola server 316 sends the task to the appropriate creature control 318 server for execution. The Creature Control Server launches the program and execute it by sending commands via the radio base station (320) to the appropriate creature (324). Figure 77 is a Block diagram of the main services available to the teachers. Teachers can access exclusive 114 extensions of the IDE (step 1600) to select and investigate each of the tasks of each of the students (step 1610). The teacher can brows the student tasks (1620), view statistics associated with the execution of the tasks (1630) such as absolute performance statistics (1640) and relative performance statistics (1650) and to assign marks to the students (1660). Figure 78 is a Block diagram of the Living Object Laboratory (LOLA) system topology, comprising of the main subsystems : The LOLA Server, comprising one or more servers, such as database server and creature control servers : Administrator Station (1710); Teacher station (1720); Student Programming station (1740); and Radio Base Station (1750). All the main subsystems, except for the radio base station, are interconnected by networking means such as HyperText Transport Protocol (HTTP) or middleware (MW) where middleware is any appropriate interfacing software. Typically the all subsystems except for the Radio Base Station are interconnected over a Local Area Network (LAN) such as the Ethernet, while the Radio Base Station is connected by means of Universal Serial Bus (USB). Figure 79 is a Block diagram of the Living Object Laboratory (LOLA) system presenting the main (logical) services provided by the system: The database engine 1760 manages all accesses to the database repository 1765. The log server logs 1770 details of the execution and performance of all creatures and tasks running in the system. The monitor engine 1775 presents to the users real time information about the performance of tasks 115 executed by the system at the time of monitoring. The security manager 1780 supervises all user access to the system and verifies that only authorized users will have access to particular parts of the database as is predetermined by the administrator. The task manager 1785 supervises the operation of all tasks in the system according to instruction provided by authorized users . These services are typically provided by software subsystems that are separated and interconnected by conventional means of communication such as HTTP and middleware. Figure 80 is a Block diagram of the main services available to the system administrator by means of the system administrator station 1200. These services typically comprise: On-line console 1800 for all services that are available while the system functions regularly. Off-line console 1810 for all services available when the system is shut down for major installation and maintenance procedures . Configuration console 1820 that enables the system administrator to set-up hardware peripherals, networking configuration,etc . Deployment console 1830 that enables the system administrator to set-up new creatures or change the configuration of existing creatures. Figure 81 is a Block diagram of the main modules of the software of the Creature Control Server, whether implemented as an independent server or as a part of another server such as the general LOLA server. The Creature Control Server comprises of multiplicity of Proxy Objects 1840, each of which is responsible 116 to a specific creature and a scheduler task that is responsible for the coordination and timing of the operation of the various proxies. Figure 82 is a Block diagram of the main services available to the student by means of the programming station. These services are implemented as modules interconnected by means of interfacing such as HTTP and middleware. The three main modules/services are the Interactive Development Environment 1860 ( IDE ) that enables the student to perform the programming of the tasks assigned to him; the simulator 1870 that enables the student to test the developed program using virtual creatures animated on the computer screen; and task registration 1880 that enables the student to registered the developed program for execution by means of a physical creature. Figure 83 is a Block diagram of the main services available to the teacher by means of the teacher station. These services are identical to the services and module construction of the programming station except for the additional teacher console that enables the teacher to assign tasks to students, monitor their work, assign marks, etc. Figures 84 to 93 together comprise a general description of a demonstration pilot project of a Living Object Laboratory. Figure 84 is a block diagram of pilot Living Object Laboratory comprising of two classes, each with five programming stations, one teacher station, one radio base station connected directly to the network and one creature. Additionally, outside 117 the two classes, one LOLA server, one administrator station and one base station, also connected directly to the network and controlling four creatures. Figure 85 is a block diagram describing the methods and functions for installing the pilot laboratory and using it at the administrator level and within the two classes. Figures 86 and 87 Describe the software and the hardware topologies of the pilot system. Figures 88 to 90 are a flow chart description of the steps in the activation of the demonstration program of the pilot project. Figure 90 describes the main application modules of the pilot system. Figures 92 and 93 illustrate the steps to be taken to make the LOLA system operative. Figure 92 lists the software modules that has to be installed to be able to activate the pilot demonstration software. Figure 93 lists the configuration activity that has to be done before the activity described in Figs. 88 to 89 can be carried. The order in which the steps are executed is not important as long as all the steps are executed completely. Figure 94 to figure 105 describes the structure and features of the Interactive Development Environment (IDE). Figure 94 describes a typical construction of the screen of the IDE. The screen typically comprises of a top menu bar 2000 and a bottom status bar 2005 as is common to all windows 118 applications; tool bars, such as 2010 and 2020 that can be placed anywhere on the screen and are shown adjacent to the top menu bar. Tool bar 2010 contains icons of software tools available to the programmer such as editing, compiling, simulating, etc. Programming Tool bar 2020 contains icons of objects that the programmer can incorporate in the software program, such as states, events, functions, etc. An object can be dragged from the tool bar and dropped into the programming window 2030 to be connected with other objects in this window. When an object is selected the properties of the specific objects appear in the object inspector window 2040. The values of these properties can be modified by the programmer to create the necessary program behavior. When simulation is selected an animation of the programmed creature appears in the simulation window 2050. When the creature is instructed to collect input data (such as speech or tactile sensors) the popup menu 2060 appears and the programmer can interact with the creature by the appropriate selections from the popup menu. The message window 2070 provides the programmer with hints during the programming activity and with tracing data of the program execution during simulation activities. Figure 95 describes the main functions (File, Edit, View, etc) are available to the programmer in the top menu bar 2000 of the IDE screen and the sub-functions |that are made available in a drop down window when a main function is selected. Figures 96A and 96B describe the main objects and programming tools available to the user in the object tool bar 119 2010 and the programming tool bar 2020. Figure 97 describes the objects inspection window 2040 in more details . Figure 98 describes the main groups of messages that appear to the programmer in the message window 2070 at various situations. Such message groups are: programming syntax errors, compilation errors, progress indication messages for various functions such as compilation and debugging, test logging messages that the system provide while debugging. Figure 99 is a block diagram of the simulation process and module structure. When simulation is activated the IDE module 2200 executes the tested program but sends the creature executable instructions to the virtual creature command interface 2210. Interface 2210 identifies the creature type and the appropriate creature function to be simulated selects and operates the appropriate function 2220. The function 2220 executes the appropriate animation 2230 of the virtual creature on the computer display. Figure 100 describes the structure of the bottom status bar 2005. Figures 101A to 10IB describes in more detail the content and structure of the objects tool bar 2020 for various groups of objects when such a group is selected. Figure 101A refers in detail to 2100 of Fig. 96A; Figure 101B refers in detail to 2120 of Fig. 96A; Figure 101C refers in detail to 2120 of Fig. 96A and Figure 101D refers in detail to 2130 of Fig. 96A. Emotional Analysis 120 Concept Paper The goal of the Living Object Laboratory is to teach students the art to instill human behavior in computerized machines. One major characteristic of humans is emotional sensitivity. That is, the ability to identify the emotional state and state transition in another human being and to respond accordingly. It is very difficult to teach emotional sensitivity to humans and it is much more difficult to instill emotional sensitivity in machines. However, even the most simplistic emotional sensitivity, when featured by a machine, has a tremendous effect on the interaction of humans and the machine. Therefore, the art of programming emotional sensitivity is important. The goal of Emotional Analysis is to provide the main application with the capabilities to accommodate to the emotional state of the human that interacts with the machine. Emotional analysis is a background process, or processes. Emotional analysis evaluates the emotional state of the person who interacts with the Living Object. The evaluation is performed continuously, in parallel to other processes. The process may be performed as a subroutine called by the main process or as a background task, as is appropriate for the level of complexity of the application system and the perceived ease of programming. The main module (or process) deals with the main goals of the application (such as playing the role of a teacher, a guard, a guide, a playmate, etc.). The Emotional Analysis communicates with the main task, receiving the required inputs and providing the main application with queues for appropriate response to the interacting human. 121 The Emotional Analysis is mostly verbal. The Emotional Analysis process analyses the content of verbal inputs recorded by the main application. According to the results of the analysis .the Emotional Analysis provides the main application with appropriate data. The data provided by the Emotional Analysis process to the main process may range from the perceived emotional state, or emotional state transition, of the interacting human, to detailed verbal phrases to be played by the main process. The final decision, to provide the Emotional Analysis with inputs and to follow the Emotional Analysis outputs, is in the hands of the main (application) process. The Emotional Analysis is basically a program and can be programmed using the same programming means available for programming the main application. The Emotional Analysis program can be viewed as an algorithm, implemented as a state machine, where events are combinations of acoustic analysis and semantic analysis of verbal inputs received (recorded) from the interacting human and accumulated data. The design of the Emotional Analysis process involves several stages such as: Determining the scope of emotions, e.g., three emotions: sad, happy, angry. Determining acoustic and semantic representations of the emotions to be detected in the received (recorded) verbal inputs from the interactive human, e.g. Voice amplitude (quiet or loud voice) Voice pitch Rate of speech 122 Diction quality (quality of speech recognition) Specific words such as "sad", "happy", "angry" Of course, the change in one of the above features may be more important than the feature itself. E.g., raising the voice carries more emotional information than continuous loud voice. Determining means for explicit interrogations of the emotions of the interactive human, such as direct questions, e.g. "Are you sad?" Determining modifications of the application interaction according to the perceived emotional state of the interacting human. First should be determined the goal of the modification and then the means. For example: Goals Express empathy Provide emotional support, encouragement, etc. Affect (change) mood Means Adaptation of appropriate amplitude (loudness), pitch and rate of verbal output. Several versions of the same verbal content to be selected and played. Default/standard phrases expressing empathy, interest, support, etc. Determining the communication means (the protocol) between the application process (es) and the Emotional Analysis process. Assigning Marks to Student's Programming Projects 123 Teachers usually evaluate examinations and assign marks based on a checklist. This is true for all subject matter, from exact sciences to humanities . It is also true for the evaluation of programming, from analysis through design to implementation. Checklist evaluation can be automated, that is, be executed by means of a computer. Since the mechanism of computerized evaluation of examinations is common and the same for all subject matter it is outside the scope of this document. Programming must also work properly, that is, the implementation must function on its own, without faults (crashes) and according to the specifications. It is obvious that the computer can track the performance of the executed program, analyze the performance according to the specifications, and report the results. Automated (or computerized) evaluation is performed by means of a monitoring program that logs the performance of the monitored program, analyzes the log and reports the results. To enable the monitoring, several checkpoints are set within the monitored program, and the monitoring program logs every passage through these each of these checkpoints with the values of associated parameters . LOLa ' s default monitoring provides every entry into and exit from each state (and hence, every entry to and exit from each state transition/connection). The monitoring program reports the results of the monitoring by program module and by student. A mark can be assigned according to the following criteria: The percentage of states and state connections that have been entered (and hence have been tested). The percentage of states and state connections that have been 124 exited (and hence have performed successfully). Internal performance balance, that is, the ratio between the number of entries to (exits from) the entity (state; connection) least visited (most visited) and the average number of entries (exits) within the module (for each and every module). More precisely, the square root of the sum of the squares of the differences between entries (exits) of the list and the most visited entities and the average. Overall performance balance, that is the ratio between the number of entries (exits) in the module and the project average. Fig. 103 is a table illustration of an emotional analysis database; and Fig. 104 is an emotional analysis state chart. The emotional analysis apparatus is sensitive to mood changes of the user. Mood changes are associated with changes in features of speech of the user, such as loudness, rate, pitch (these are examples of implicit events), the use of specific terms by the user and the answers to direct closed questions (these are examples of explicit events) played by the creature. Each such event has a weight and when the event occurs the weight is added to the relevant table cell. Only when a threshold is passed does the creature respond to a perceived mood change (by providing empathy, asking a closed question, and the like). Figs. 105 - 110 illustrate a preferred embodiment of Uniport, including a software architecture overview. Fig. 105 illustrates typical function calls and callback notifications. Fig. 106 illustrates typical input data processing suitable for a 125 media BIOS module. Fig. 107 illustrates typical input data processing suitable for a UCP implementation module. Fig. 108 illustrates typical output data processing suitable for user applications and an API module. Fig. 109 illustrates a typical UCP implementation module and media BIOS output data processing. Fig. 110 illustrates output data processing for a protocol implementation module and media BIOS module. In Fig. 110, MAX_OB signifies the maximum of elements in the out buffer. A description of typical exported functions are as follows: 126 crsrAddWords This function is used to add words to the active context from speech recognition engine. crWaitForEvent This function is used to wait an even- from the UNIT 127 bioTransferReset This function is used to reset input or/and output σueue in the Media BIOS module (see pic. 5, 2) 3.2 Protocol implementation module exported function description proSystemOpen This function is used to open the system. proSystemClose This function is used to close the system. proSer.dMessage This function is used to send a control message. proSendBuffer This function is used :o send a buffer. proTransferReset This function is used to reset input or/and output queue m the Media BIOS module (see pic. 5, 2) 3.2 API module exported function description crBase etect This function is used to detect the base (Determine device ID) . crSvstemOoen This function is used to open the svstem. crSvstemClose This function is used to close the system. 128 crSetNotif cation This function is used to setup callback notification mecnanism in the user application. crSendBuffer This function is used to send a buffer. :ndMessaαe This function is used to senα a message. :Talk This function is used to play a sour :rΞet3aseVersion This function is used to get version nunoer from tru -.CTT crsrGetWords This function is useα to αet all the worα from tne active context of speech recognition engine. crsrCreateContext This function is used to create new context m the speech recognition engine. crs eleteContext This function is used to delete context from tne speecn recognition engine. crsrSelectContext This function s used to select the context from the speech recognition engine. crsrRemoveWords This function is used to remove words from tne active co-text from speech recognition engine. 129 3.1 Media BIOS module exported function description bioMediaConnect This function is used to connect to the communication media. bioMediaDisconnect Th s function is used to disconnect from the communication media. bioAddOutBuffer This function is used to add the output buffer to the output queue (see pic. 5) 130 Figs. Ill - 115, taken together, form a toy configuration flowchart. Fig. Ill illustrates typical figure configuration. Figs. 112 - 115 illustrate typical install-check up (BT 1/4, 2/4, 3/4 and 4/4 respectively). To generate a screen interface, the following texts may be recorded which serve as voice-over of onscreen texts: 131 Screen 0010-0012 Intro to the introduction: Morning: Hey, hi there. Good morning to you! Afternoon: Hey, what's up. Good afternoon to you! Evening: Hey, g-o-o-ood evening to you! Screen 0040: ABOUT YOU Click here to give or change user information. Screen 0050: HOT CLIP! Click here to see the Storyteller dance and sing. Screen 0060: HOW TO PLAY Click here to hear how to play. Screen 0070: PLAY Click here to start to play. Screen 0080: ** NEW: CHECK-UP Click here to check the system. Screen 0090: EXIT Click here to close the Storyteller program. Screen 0041 Double-clock on the user's name or type the name of a new user. If you are typing a new name, press ENTER when done. Screen 0042 Please type the name of a new user. When done, press ENTER. Screen 0043 When we play together. I'll call you by a secret name. Double-click now on the secret name you want. 132 When thev haven't chosen a secret name I have to know your secret name first. Go ahead and choose one now. About vou Click here to tell me all about yourself. Instructions for filling in personal data 1. Click the cursor on an item. 2. A menu will appear. Make your choice. 3. Go through each item one by one. 4. When you are done, click on the MAIN MENU button. General invitation to enter data, at top of ABOUT YOU/SECRET NAME/FAVORITES screen Please tell me all about you. I'm very happy to know you. Fa^rites Click here to choose your favorite things. • What ' s your favorite color? Yellow? Red? Blue? Pick one. • What ' s your favorite food? Pizza? Macaroni and cheese? French fries? Pick one. • What's your favorite activity? Playing make believe? Drawing? Playing computer games? Pick one. • What's your favorite animal? Cats? Dogs? Horses? Pick one. Graphic of cursor Click here to return to the Storyteller's Main Menu. 133 It is appreciated that the software components of the present invention may, if desired, be implemented in ROM (readonly memory) form. The software components may, generally, be implemented in hardware, if desired, using conventional techniques. It is appreciated that the particular embodiment described in the Appendices is intended only to provide an extremely detailed disclosure of the present invention and is not intended to be limiting. It is appreciated that various features of the invention which are, for clarity, described in the contexts of separate embodiments may also be provided in combination in a single embodiment. Conversely, various features of the invention which are, for brevity, described in the context of a single embodiment may also be provided separately or in any suitable subcombina- tion. 134 APPENDIX A 135 Application Source Code 136 Copyright (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the Main unit. unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Toy, PDBEngine, XMIDILib TLB, OleCtrls, NEWSRLib TLB ,ExtCtrls,MPlayer, ComCtrls, jpeg, Menus; type TTalkThread = class (TThread) private ToyNumber : Integer; TalkFile : string; Motion : Integer; protected constructor create (ToyNumberl : Integer; TalkFilel : string ; Motionl: Integer); procedure Execute; override; end; TMainForm = class (TForm) Buttonl: TButton; SRI: TSR; XMidil: TXMidi; MainMenul : TMainMenu; testl: TMenuItem; spacel: TMenuItem; Panel1: TPanel; MediaPlayerl: TMediaPlayer; Timer1: TTimer; procedure FormCreate (Sender : TObject); procedure FormClose (Sender : TObject; var Action: TCloseAction ) ; procedure spacelClick (Sender: TObject); procedure Time ITimer (Sender: TObject); private ( Private declarations ) 137 TalkinglnThreaα : TTalkThread; public { Public declarations ) CurrentPath string; CreatorPath string; DatabasePath string; GraphicsPath string; AudioPath string; UsagePath string; AboutYouPath string; Toy TToy; ToyMachine string; PDBEngine TPDBEngine; ThreadlnProgress : Boolean; ToyNamelsStoryTeller : string; ToyNamelsBear : string; procedure Applicationlnitialization; procedure GotoMainMenu; procedure GotoCreator; function BackGroundTalkmg (TalkFile : string; Motion : string ) ; Integer; function GetCurrentPath (CurrentExeName : string) : string; function TalklnBackGround (ToyNumber : Integer; TalkFile : string; Motion : string) : Integer; end; var MamForm: TMainForm; implementation uses Menu, Status , creator ; { $R * . DFM} procedure TMainForm. FormCreate (Sender : TObject); begin // screen. cursor :=crDefault; ToyNamelsStoryTeller := ' StoryTeller ' ; ToyNamelsBear := 'TeddyBear*; 138 Screen. Cursors [ 5 ] : = LoadCursor (HInstance, ' PestoHand. Cur ' ) ; Screen. Cursors [ 6] : = LoadCursor (HInstance, ' PestoMenu . Cur ' ) ; cursor : = 5 ; Applicationlmtialization; Cursor := crNone; Timerl. Interval := 1000; Timer1. Enabled := True; if (Toy. ToyNumber > 0) and (Toy. ToyNumber < 32) then ToyMachme : = ToyNamelsBear else ToyMachme := ToyNamelsStoryTeller; end; procedure TMainForm.Applicationlmtialization; begin // Fill Pathes CurrentPath := GetCurrentPath (Application. ExeName) ; CreatorPath := Copy (CurrentPath, 1, Length (CurrentPath) -Length ( 'ExecutablesN ' ) ) ; //CreatorPath := Cop (Application. ExeName, 1, //Length (Application. ExeName) -27) ; DatabasePath := CreatorPath + ' PESTO\DATABASE\ ' ; GraphicsPath := CreatorPath + ' PESTO\GRAPHICS\ ' ; AudioPath := CreatorPath + ' PESTO\AUDIO\ ' ; UsagePath := CreatorPath + ■ PESTO\USAGE\ ' ; PDBEngine := TPDBEngine. create (self); PDBEngine. DataBasePath := DatabasePath; PDBEngine . LoadRegistration; PDBEngine. SetChildNumber (1) ; PDBEngine . LoadConfiguration; Toy := TToy. Create (self) ; Toy. ToyNumber := PDBEngine. oyNumber; Toy.TurnOn; Application. Icon. LoadFromFile (GraphιcsPath+' Pestolcon.ico ' ) ; AboutYouPath := AudιoPath+'AboutYou\ ' ; end; function TMainForm. GetCurrentPath (CurrentExeName : string) : string; var i : integer; begin i := Length (CurrentExeName) ; While ι>0 do begin 139 i f Copy ( CurrentExeName , l , 1 ) = ' V then ι : =0 else begin i : = i -1 ; CurrentExeName := Copy (CurrentExeName, 1, i) ; end; end; Result := CurrentExeName; end; procedure TMainForm. GotoMainMenu; begin if Time< StrToTime (' 12: 00:00* ) then BackGroundTalking (AboutYouPath + ' voOOl . av 1 , ' S ' ) else if Time> StrToTime (' 16: 00: 00 ' ) then BackGroundTalking (AboutYouPath + ' o003. wav ' , ' S ' ) else BackGroundTalking (AboutYouPath + ' vo002.wav' , ' S' ) ; Spacel. Enabled := False; Hide; Timerl . Enabled := False; MenuForm. Show; end; procedure TMainForm. FormClose (Sender : TObject; var Action: TCloseAction ) ; begin if ThreadlnProgress then Exit; Toy.TurnOff; Toy. Free; PDBEngine . Free; end; procedure TMainForm. spacelClick (Sender : TObject); begin //space GotoCreator; end; procedure TMainForm. GotoCreator; begin 140 Spacel . Enabled := False; Hide; CreatorForm. Show; CreatorFor . PlayMovie; Timerl. Enabled := False; end; function TMainForm. BackGroundTalking (TalkFile : string; Motion : string) : Integer; var Threadl : TTalkThread; begin ThreadlnProgress := True; Threadl := TTalkThread. create (Toy. ToyNumber, TalkFile, 0) ; Result := 0; end; function TMainForm. alklnBackGround (ToyNumber : Integer;TalkFile : string; Motion : string) : Integer; var Threadl : TTalkThread; begin ThreadlnProgress := True; Threadl := TTalkThread. create (ToyNumber, TalkFile, 0) ; Result := 0; end; constructor TTalkThread. create (ToyNumberl : Integer; TalkFilel : string ; Motionl: Integer) ; begin inherited create (False) ; ToyNumber = ToyNumberl; TalkFile = TalkFilel; Motion = Motionl; FreeOnTerminate := True; end; procedure TTalkThread. Execute; begin //85 = 55H Broadcast if (MainForm. oyMach e ='StoryTeller ' ) and (ToyNumber <> 85) then MamForm.XMidil.ToyTalk2 (ToyNumber, TalkFile, 0, 0, Motion, 0) ; if (MainForm. ToyMach e = 'TeddyBear') or (ToyNumber = 85 ) then 141 MainForm. XMidil.NewToyTal (ToyNumber, TalkFile, 0,9,0) ; Terminate; MainForm. ThreadlnProgress := False; Exit; end; procedure TMainForm. TimerlTimer (Sender: TObject); begin //GotoCreator; GotoMainMenu; end; end. 142 Copyright (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the Checkup unit . unit CheckUp; interface uses Windows. Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrlsJpeg, ComCtrls; type TCheckUpForm = class(TForm) Image 1: TImage; Exitlmage: TImage; CarAnimate: T Animate: ClownAnimate: TAnimate: DuckAnimate: TAnimate: DuckWalkAnimate: TAnimate; LightOrganAnimate: TAnimate; LogoMoveAnimate: TAnimate; MicrophoneAnimate: TAnimate; MotionLetersAnimate: TAnimate; SensorAnimate: TAnimate: SpeakerAnimate: TAnimate; Image2: TImage procedure ExitImageClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Image2Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure ActivateTheAnimation (value : boolean); end; var 143 CheckUpForm: TCheckUpForm: implementation uses Menu. Main: {$R *.DFM} procedure TCheckUpForm.ExitImageClick(Sender: TObject); begin // Hide; ActivateTheAnimation(False); MenuForm. Show; end; procedure TCheckUpForm.FormCreate(Sender: TObject); begin // with CarAnimate do begin FileName := MainForm. GraphicsPath + 'Car.avi'; Left := 260; Top := 441; Width := 80; Height := 60: end; with ClownAnimate do begin FileName := MainForm.GraphicsPath + 'Clown.avi'; Left := 652; Top := 393; Width := 32; Height := 40; end: with DuckAnimate do begin 144 FileName = MainForm GraphicsPath + Duck avi' Left = 613. Top = 114, Width = 48, Height = 50, end, with DuckWalkAnimate do begin FileName = MainForm GraphicsPath + 'DuckWalk avi', Left = 599, Top = 216, Width = 128, Height = 115, end; with LightOrganAnimate do begin FileName = MainForm GraphicsPath + 'LιghtOrgan.avι', Left = 455, Top = 440, Width = 48, Height : = 70 ; end; with LogoMoveAn mate do begin FileName := MainForm. GraphicsPath + 'LogoMove.avi', Left = 336; Top = 19; Width = 112; Height = 45; ; with MicrophoneAnimate do begin FileName := MainForm. GraphicsPath + 'HubWave.avi'; Left • = 95; Top := 365; Width := 80; 145 Height 40 ; end; with MotionLetersAnimate do begin FileName := MainForm. GraphicsPath + 'MotionLeters.avi'; Left = 468 Top = 172 Width = 144 Height = 45; end; with SensorAnimate do begin FileName := MainForm. GraphicsPath + 'Sensor.avi'; Left = 341; Top = 227; Width = 96; Height = 60; end; with SpeakerAmmate do begin FileName := MainForm. GraphicsPath + 'Speaker.avi'; Left = 57; Top = 169; Width = 96; Height = 80; end; end; procedure TCheckUpForm.ActivateTheAnimation (value : boolean); begin // try CarAnimate.Active := Value; except end; try ClownAnimate .Active : = Value ; except 146 end; try DuckAnimate .Active Value ; except end; try DuckWalkAnimate .Active := Value; except end; try LightOrganAnimate.Active := Value; except end; try LogoMoveAnimate .Active := Value; except end; try MicrophoneAnimate.Active := Value; except end; try MotionLetersAnimate.Active := Value; except end; try SensorAnimate .Active := Value; except end; try SpeakerAnimate .Active := Value; except end; end; 147 procedure TCheckUpForm. Image2Clιc ( Sende : TObj ect ) ; begin // // MainForm. oy. TurnOff; sleep (5000) ; ActivateTheAnimation (False) ; close; MainForm. close; WinExec ( PChar (MainForm. CurrentPath + ' PESTOInstallation ' ) , sw_show) ; Application. Terminate; end; end. 148 Copyright (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the Creator unit . unit creator; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, MPlayer; type TCreatorForm = class (TForm) MainMenul: TMainMenu; testl: TMenuItem; spacel: TMenuItem; MediaPlayerl: TMediaPlayer; Panell: TPanel; Timer1: TTimer; Escapel: TMenuItem; procedure spacelClick (Sender: TObject); procedure TimerlTimer (Sender: TObject); procedure FormCreate (Sender: TObject); procedure EscapelClick (Sender: TObject); procedure FormClose (Sender: TObject; var Action: TCloseAction); private { Private declarations ) public { Public declarations ) StartPlay : Integer; procedure PlayMovie; procedure GoToPestoSong; end; var CreatorForm: TCreatorForm; implementation uses PestoSong, Main, Menu; 149 ( $R . DFM) procedure TCreatorForm. spacelClic (Sender : TObject); begin //space GoToPestoSong; end; procedure TCreatorForm. GoToPestoSong; begin // Spacel. Enabled := False; MediaPlayerl . stop; MediaPlayerl. Close; hide; PestoSongForm. Show; PestoSongForm. PlayMovie; Timerl. Enabled := False; end; procedure TCreatorForm. PlayMovie; begin // try Timer1. Enabled := True; MediaPlayerl . Play; except end; end; procedure TCreatorForm.TimerlTimer (Sender: TObject); begin // StartPlay := StartPlay + 1; if StartPlay = 1 then exit; GoToPestoSong; end; procedure TCreatorForm. FormCreate (Sender: TObject); begin // Timer 1. Enabled : = False ; 150 Panell . Cursor := crNone; Timerl. Interval := 17000; StartPlay := 0; Cursor := crNone; MediaPlayerl. FileName := MainForm. GraphicsPath + 'OpenO.avi'; end; procedure TCreatorForm. EscapelClick (Sender : TObject); begin // Exit try MediaPlayerl . stop; except end; try MediaPlayerl. Close; except end; Hide; MenuForm. Show; end; procedure TCreatorForm. FormClose (Sender: TObject; var Action: TCloseAction) ; begin // Exit try MediaPlayerl. stop; except end; try MediaPlayerl. Close; except end; end; end. 151 Copyright (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the Menu unit . unit Menu; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, Intro, jpeg, Toy, Menus; type TMenuForm = class (TForm) Menulmage: TImage; Setuplmage: TImage; Animationlmage : TImage; Introlmage: TImage; Playl age: TImage; Exitlmage : TImage; TVAni ate: TAnimate; PickUserlmage: TImage; OKButtonlmage : TImage; UserNameEdit: TEdit; SetUpOrglmage : TImage; Checklmage: TImage; PickUserTitleLabel: TLabel; PickUserLabell: TLabel; PickUserLabel2: TLabel; ImageFramel: TImage; ImageFrame2: TImage; ImageFrame3 : TImage; ImageFrame4 : TImage; ImageFrame5: TImage; ImageFrameό: TImage; UserNameLabell: TLabel; UserNameLabel2: TLabel; UserNameLabel3: TLabel; UserNameLabel4 : TLabel; UserNameLabel5: TLabel; UserNameLabelδ: TLabel; 152 UserNameLabel7 : TLabel; UserNameLabel3 : TLabel; MainMenul : TMa nMenu; testll: TMenuItem; Enterl: TMenuItem; Escapel: TMenuItem; Toylmage: TImage; ToyAnimate: TAnimate; procedure FormCreate (Sender: TObject); procedure UserNamelButtonClick (Sender : TObject); procedure UserName2ButtonClick (Sender : TObject); procedure UserName3ButtonClick (Sender: TOb ect); procedure UserName4ButtonClick(Sender: TObject); procedure UserName5ButtonClick (Sender : TObject); procedure UserNameδButtonClick (Sender : TObject) ; procedure UserName7ButtonClick(Sender: TObject) ; procedure UserNameδButtonClick (Sender : TObject); procedure UserNamelButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure UserName2ButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure UserName3ButtonMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer) ; procedure UserName4ButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure UserName5ButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure UserNameδButtonMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); procedure UserName7ButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure UserNameβButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure OKButtonlmageClick (Sender : TObject); procedure Image rameIMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer) ; procedure Image rame2MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer) ; procedure ImageFrame3MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer) ; procedure ImageFrame4MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure ImageFrame5MouseMove (Sender : TObject; Shift: TShiftState; X, 153 Y: Integer) ; procedure ImageFrameδMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure ImageFramelClick (Sender : TObject); procedure ImageFrame2Click (Sender : TObject); procedure ImageFrame3Click (Sender: TObject); procedure ImageFrame4Clic (Sender: TObject); procedure ImageFrame5Click (Sender: TObject); procedure ImageFrameδClick (Sender: TObject); procedure MenuImageMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure EnterlClick( Sender: TObject); procedure EscapelClick (Sender: TObject); procedure FormClose (Sender: TObject; var Action: TCloseAction); private { Private declarations ) procedure ResetCurrentButton; procedure UserNa eDefaultColor; procedure ClearUserNa e; procedure AssignCursorsInlmages ; procedure ShowRegistration (Value : string); public { Public declarations ) Threadl : TIntro; CurrentButton : String; end; var MenuForm: TMenuForm; const crPESTOHandCursor = 100; crPESTOMenuCursor = 101; implementation uses Main, Status, Registration, ToySimulation, MotionSimulation, CheckUp, PestoSong, SingAlong, creator; {$R *.DFM) procedure TMenuForm. ResetCurrentButton; begin 154 if CurrentButton = 'SetUp' then Setuplmage. Visible False; if CurrentButton = 'Animation' then Animationlmage.Visible := False; if CurrentButton = 'Intro' then Introlmage.Visible False; if CurrentButton = 'Play' then Playlmage.Visible False; if CurrentButton = 'Check' then Checklmage. Visible False; if CurrentButton = 'Exit' then Exitl age.Visible False; end; procedure TMenuForm. FormCreate (Sender: TOb ect); begin Screen. Cursors [crPESTOHandCursor] := LoadCursor (HInstance, ' PESTOHAND.CUR' ) ; Screen. Cursors [crPESTOMenuCursor] := LoadCursor (HInstance, * PESTOMENU. CUR' ) ; TVAnimate . FileName := MainForm. GraphicsPath+'Noise.AVI' ; TVAnimate.Active := True; MainForm.Hide; Threadl := nil; Setuplmage . Visible = True; SetUpOrglmage . Visible = False; Animationlmage . Visible = False; Introlmage. Visible = False; Playlmage . Visible = False; Checklmage . Visible = False; Exitlmage . Visible = False; Setuplmage. cursor crPESTOMenuCursor; SetUpOrglmage . cursor crPESTOMenuCursor; Animationlmage . cursor crPESTOMenuCursor; Introlmage . cursor crPESTOMenuCursor; Playlmage . cursor crPESTOMenuCursor; Checklmage . cursor crPESTOMenuCursor; Exitlmage . cursor crPESTOMenuCursor; ImageFramel . cursor crPESTOHandCursor; 155 ImageFrame2. cursor = crPESTOHandCursor; ImageFrame3. cursor = crPESTOHandCursor; ImageFrame . cursor = crPESTOHandCursor; ImageFrameS . cursor = crPESTOHandCursor; ImageFrameδ . cursor = crPESTOHandCursor; OKButtonl age . Cursor = crPESTOHandCursor; CurrentButton := 'Setup'; nvisible Registration PickUserlmage. Visible := False; // Reg 1 PickUserTitleLabel.Visible := False; UserNameLabell.Visible := False; UserNameLabel2.Visible := False; UserNameLabel3.Visible := False; UserNameLabel4.Visible := False; UserNameLabel5.Visible := False; UserNameLabel6.Visible := False; UserNameLabel7.Visible := False; UserNameLabelδ.Visible := False; // Reg 2 PickUserLabell.Visible := False; PιckUserLabel2.Visible := False; UserNameEdit.Visible := False; OKButtonlmage.Visible := False; // Cursor : = crPESTOMenuCursor; //AssignCursorsInlmages ; UserNameLabell . Caption : = ' NEW USER 1 ; With ToyA mate do begin FileName : = MainForm. Graphics Path+ ' Eye . AVI ' ; Active = True; Left = 376; Top = 252; Width = 80; Height = 40; end; With Toylms »ge do begin Left = 265; 156 Top = 177 Width • = 309 Height : = 368 end; end; procedure TMenuForm. UserNamelButtonClick (Sender : TObject); begin // if MainForm. ThreadlnProgress then exit; PickUserTitleLabel. Visible := False; UserNameLabell.Visible := False; UserNameLabel2.Visible := False; UserNameLabel3.Visible := False; UserNameLabel4.Visible := False; UserNameLabel5.Visible := False; UserNameLabel6.Visible := False; UserNameLabel7.Visible := False; UserNameLabelθ.Visible := False; UserNameEdit.Text := ' '; P ckUserLabell.Visible := True; PιckUserLabel2.Visible := True; UserNameEdit.Visible := True; OKButtonlmage.Visible := True; UserNameEdit . SetFocus ; MainForm. PDBEngine . InsertNewChild; MainForm. BackGroundTalking (MainForm.AboutYouPath + 'vo0042.wav', 'S'); end; procedure TMenuForm. UserName2ButtonClιc (Sende : TObject); begin // if MainForm. ThreadlnProgress then exit; MainForm. PDBEngine . SetChildNumber ( 1) ; ShowRegistration (UserNameLabel2. Caption) ; end; procedure TMenuForm. UserName3ButtonClιck (Sender : TObject); begin // if MainForm. ThreadlnProgress then exit; MainForm. PDBEngine . SetChildNumber (2 ) ; 157 ShowRegistration (UserNameLabel3. Caption) ; end; procedure TMenuForm. UserName4ButtonClιck ( Sender : TObj ect) ; begin // if MainForm. ThreadlnProgress then exit; MainForm. PDBEngine . SetChildNumber (3) ; ShowRegistration (UserNameLabel4. Caption) ; end; procedure TMenuForm. UserName5ButtonClick (Sender : TObject); begin // if MainForm. ThreadlnProgress then exit; MainForm. PDBEngine . SetChildNumber ( 4 ) ; ShowRegistration (UserNameLabel5. Caption) ; end; procedure TMenuForm. UserNameβButtonClick (Sender : TObject); begin // if MainForm. ThreadlnProgress then exit; MainForm. PDBEngine . SetChildNumber (5) ; ShowRegistration (UserNameLabelδ. Caption) ; end; procedure TMenuForm. UserName7ButtonClιck (Sender : TObject); begin // if Ma For . ThreadlnProgress then exit; MainForm. PDBEngine . SetChildNumber ( 6 ) ; ShowRegistratio (UserNameLabel7 . Caption) ; end; procedure TMenuForm. UserNameθButtonClick (Sender : TObject) ; begin // if MainForm. ThreadlnProgress then exit; MainForm. PDBEngine . SetChildNumber (7 ) ; ShowRegistration (UserNameLabelδ. Caption) ; end; 158 procedure TMenuForm. UserNamelButtonMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin // if UserNameLabell. Font. Color <> clGreen then begin UserNameDefaultColor; UserNameLabell. ont. Color := clGreen; end; end; procedure TMenuForm. UserNameDefaultColor; var UserColor : TColor; begin // UserColor := clRed; UserNameLabell . Font . Color = UserColor; UserNameLabel2. Font. Color = UserColor; UserNameLabel3. Font . Color = UserColor; UserNameLabel4. Font . Color = UserColor; UserNameLabel5. Font . Color = UserColor; UserNameLabel6. Font . Color = UserColor; UserNameLabel7. Font. Color = UserColor; UserNameLabelδ . Font . Color = UserColor; end; procedure TMenuForm. UserName2ButtonMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin // if UserNameLabel2. Font. Color <> clGreen then begin UserNameDefaultColor; UserNameLabel2. ont. Color := clGreen; end; end; procedure TMenuForm. UserName3ButtonMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin 159 // if UserNameLabel3. ont. Color <> clGreen then begin UserNameDefaultColor; UserNameLabel3. Font. Color := clGreen; end; end; procedure TMenuForm. UserName4ButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // if UserNameLabel . Font. Color <> clGreen then begin UserNameDefaultColor; UserNameLabel . Font. Color := clGreen; end; end; procedure TMenuForm. UserName5ButtonMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin // if UserNameLabel5. Font. Color <> clGreen then begin UserNameDefaultColor; UserNameLabel5. Font. Color := clGreen; end; end; procedure TMenuForm. UserNameδButtonMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // if UserNameLabelδ. Font. Color <> clGreen then begin UserNameDefaultColor; UserNameLabelδ. Font. Color := clGreen; end; end; procedure TMenuForm. UserName7ButtonMouseMove (Sende : TObject; Shift: TShiftState; X, Y: Integer); 160 begin // if UserNameLabel7. ont. Color <> clGreen then begin UserNameDefaultColor; UserNameLaoel7. Font. Color := clGreen; end; end; procedure TMenuForm. UserNameθButtonMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin // if UserNameLabel8. ont. Color <> clGreen then begin UserNameDefaultColor; UserNameLabel8. Font. Color := clGreen; end; end; procedure TMenuForm. ClearUserName; begin // PickUserlmage.Visible := False; UserNameLabell.Visible = False; UserNameLabel2. Visible = False; UserNameLabel3. Visible = False; UserNameLabel4.Visible = False; UserNameLabel5.Visible = False; UserNameLabelδ.Visible = False; UserNameLabel7.Visible = False; UserNameLabel8.Visible = False; UserNameEdit.Visible := False; OKButtonlmage.Visible := False; end; procedure TMenuForm. OKButtonlmageClick (Sender : TObject) begin // if MainForm. ThreadlnProgress then exit ; if Length (Trim (UserNameEdit . Text) ) >0 then 161 begin with MainForm. PDBEngine do begin SecretName ChildSex BirthDay ChildEyeColor ChildHairColor BedTimeHour FavoriteColor FavoriteFood FavoπteActivity FavoπteAnimal end; ShowRegistration (TrimLeft (UserNameEdit. Text) ) ; end; end; procedure TMenuForm.AssignCursorsInlmages; begin // PickUserImage. Cursor := crPESTOHandCursor; UserNameLabell . Cursor = crPESTOHandCursor; UserNameLabel2. Cursor = crPESTOHandCursor; UserNameLabel3. Cursor = crPESTOHandCursor; UserNameLabel4. Cursor = crPESTOHandCursor; UserNameLabel5. Cursor = crPESTOHandCursor; UserNameLabel6. Cursor = crPESTOHandCursor; UserNameLabel7. Cursor = crPESTOHandCursor; UserNameLabel8. Cursor = crPESTOHandCursor; UserNameEdit . Cursor := crPESTOHandCursor; OKButtonlmage . Cursor := crPESTOHandCursor; end; procedure TMenuForm. ImageFramelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if CurrentButton <> 'Setup' then begin ResetCurrentButton; Setuplmage. Visible := True; CurrentButton := 'SetUp'; 162 end ; end; procedure TMenuForm. Image rame2MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin if CurrentButton <> 'Animation' then begin ResetCur entButton; Animationlmage. Visible := True; CurrentButton := 'Animation'; end; end; procedure TMenuForm. ImageFrame3MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin if CurrentButton <> 'Intro' then begin ResetCurrentButton; Introlmage. Visible := True; CurrentButton := 'Intro'; end; end; procedure TMenuForm. ImageFrame4MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin if CurrentButton <> 'Play' then begin ResetCurrentButton; Playlmage.Visible := True; CurrentButton := 'Play'; end; end; procedure TMenuForm. ImageFrame5MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin if CurrentButton <> 'Check' then begin ResetCurrentButton; Checklmage. Visible := True; 163 CurrentButton := 'Checks- end; end; procedure TMenuForm. ImageFrameδMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin if CurrentButton <> 'Exit' then begin ResetCurrentButton; Exitlmage. Visible := True; CurrentButton := 'Exit'; end; end; procedure TMenuForm. ImageFramelClick (Sender: TObject); begin if MainForm. ThreadlnProgress then exit; // Load From DataBase MainForm. DBEngine . SetChildNumber ( 1 ) ; UserNameLabel2. Caption := MainForm. PDBEngine. ChildName; MainForm. PDBEngine. SetChildNumber (2) ; UserNameLabel3. Caption := MainForm. PDBEngine. ChildName; MainForm. PDBEngine . SetChildNumber ( 3 ) ; UserNameLabel4. Caption := MainForm. PDBEngine. ChildName; MainForm. PDBEngine . SetChildNumber ( 4 ) ; UserNameLabel5. Caption := MainForm. PDBEngine. ChildName; MainForm. PDBEngine . SetChildNumber ( 5 ) ; UserNameLabel6. Caption := MainForm. PDBEngine. ChildName; MainForm. PDBEngine. SetChildNumber ( 6) ; UserNameLabel7. Caption := MainForm. PDBEngine. ChildName; MainForm. PDBEngine. SetChildNumber (7) ; UserNameLabel8. Caption := MainForm. PDBEngine. ChildName; // Registration Setuplmage. Visible := False; SetUpOrglmage.Visible := True; PickUserTitleLabel.Visible := True; PickUserlmage.Visible := True; UserNameLabell.Visible = True; UserNameLabel2.Visible = True; UserNameLabel3. Visible = True; UserNameLabel4. Visible = rue; UserNameLabel5.Visible = True; 164 UserNameLabelβ. Visible : = True; UserNameLabel7.Visible : = True; UserNameLabelS .Visible : = True; if UserNameLabel2. Caption = ' then UserNameLabel2 .Visible : = Falser- if UserNameLabel3. Caption = ' then UserNameLabel3 .Visible : = False; if UserNameLabel4.Caption = ' then UserNameLabel4 Visible : = False; if UserNameLabel5. Caption = ' then UserNameLabel5 Visible := False; if UserNameLabelβ. Caption = ' then UserNameLabelδ Visible : = False- if UserNameLabel7. Caption = ' then UserNameLabel7 Visible : = False; if UserNameLabelδ .Caption = ' then UserNameLabelδ Visible : = False; ImageFramel . Enabled := False; ImageFrame2. Enabled := False; ImageFrame3. Enabled := False; ImageFrame4. Enabled := False; ImageFrame5. Enabled := False; ImageFrameδ . Enabled := False; //Toy To TV ToyAnimate.Visible := False; Toylmage.Visible := False; with TVAnimate do begin Active = False; FileName = MainForm. GraphιcsPath+ 'TV.AVI" ; Active = True; Left = 627; Top = 308; Width = 101; height = 104; end; // MainForm. BackGroundTalking (MainForm.AboutYouPath + 'vo0041.wav', 'S') ; end; procedure TMenuForm. ImageFrame2Clιck( Sender: TObject); begin // Sing Along ( Hide; CreatorForm. Show; CreatorForm. PlayMovie; } SingAlongForm. PlaySongs ; {with SingALongForm do 165 begin Spacel. Enabled := True; PlaySongs; Show; end; } end; procedure TMenuForm. ImageFrame3Clic (Sender : TObject); begin // Execute INTRO MainForm. Hide ; Hide; StatusForm. Caption := 'Storyteller How-to-Play Status'; StatusForm.Show; if MainForm. PDBEngine. ToyNumber < 0 then begin SimulationForm. Show; MotionSimulationForm. Show; end; Threadl := TIntro. Create {' Intro' ) ; end; procedure TMenuForm. ImageFrame4Click (Sender: TObject); begin // Execute PLAY MainForm. Hide; Hide ; StatusForm. Caption := 'Storyteller Play Status'; StatusForm.Show; if MainForm. PDBEngine. ToyNumber < 0 then begin SimulationForm. Show; MotionSimulationForm. Show; end; Threadl := TIntro. Create (' Play ') ; end; procedure TMenuForm. ImageFrame5Click (Sender: TObject); begin // Hide ; CheckUpForm.ActivateTheAnimation (True) ; CheckUpForm. Show; 166 end; procedure TMenuForm. I ageFrameδClic (Sender : TObject); begin // Exit Close; MainForm. Close; end; procedure TMenuForm.MenuImageMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin CurrentButton := ''; Setuplmage.Visible := False; Animationlmage. Visible := False; Introlmage. Visible := False; Playlmage. Visible := False; Checklmage. Visible := False; Exitlmage. Visible := False; end; procedure TMenuForm. ShowRegistration (Value string) begin with RegistratiσnForm do begin Currentltem SecretName Gender DateOfBirth EyeColor HairColor BedTimeHour FavoriteColor FavoriteFood FavoriteActivity FavoriteA mal Boylmage.Visible = False; BoyHairYellowImage.Visible = False; BoyHairBlackl age . Visible = False; BoyHairOrangelmage . Visible = False; BoyHairBrownlmage. Visible = False; BoyEyeBluelmage . Visible = False; 167 BoyEyeGreenlmage. Visible = False; BoyEyeBrownlmage . Visible = False; BoyEyeBlacklmage .Visible = False; BoyShirtYellowImage. Visible = False; BoyShirtBluelmage .Visible = False; BoyShirtRedlmage . Visible = False; Girllmage. Visible = False; GirlHairYellowImage . Visible = False; GirlHairBrownlmage . Visible = False; GirlHairOrangelmage . Visible = False; GirlHairBlacklmage.Visible = False; GirlEyeBluelmage . Visible = False; GirlEyeGreenlmage.Visible = False; GirlEyeBrownlmage . Visible = False; GirlEyeBlacklmage .Visible = False; GirlShirtYellowImage . Visible = False; GirlShirtBluelmage . Visible = False; GirlShirtRedlmage.Visible = False; FavoritePanel. Visible := False; BirthDayPanel.Visible := False; BedTimeHourPanel. Visible := False; end; RegistrationForm. UserNameLabel. Caption Value; MainForm. PDBEngine. ChildName := Value; MainForm. PDBEngine. UpDateCurrentChild; RegistrationForm. LoadFromDataBase; // with RegistrationForm do begin if SecretName = ' ' then begin AboutYouLabel .Visible = False; AboutSexLabel .Visible = False; AboutAgeLabel .Visible = False; AboutEyeLabel .Visible = False; AboutHairLabel.Visible = False; AboutBedTimeLabel . Visible = False; FavoritesLabel. Visible = False; FavoritesColorLabel.Visible = False; FavoritesFoodLabel. Visible = False; FavoritesActivityLabel.Visible = False; 168 FavoritesA malLabel . Visible : = False ; end else begin AboutYouLabel .Visible True; AboutSexLabel. Visible True; AboutAgeLabel. Visible True; AboutEyeLabel. Visible True; AboutHairLabel . Visible True; AboutBedTimeLabel . Visible True; FavoritesLabel .Visible True; FavoritesColorLabel . Visible True; FavoritesFoodLabel. Visible True; FavoritesActivityLabel. Visible Truer- FavoritesA malLabel .Visible True; DrawBoyOrGirl; end; end; // MainForm. PDBEngine . SetCurrentToFirst ; // MainForm. Hide; Hide; RegistrationForm. Show; RegistrationForm. ShowVIfSelected; MainForm. BackGroundTalking (MainForm.AboutYouPath + 'vo0047.wav', 'S'); end; procedure TMenuForm. EnterlClick (Sender : TObject); begin // Enter = OK if OKButtonlmage. Visible then OKButtonlmageClick (nil) ; end; procedure TMenuForm. EscapelClic (Sender : TObject); begin // Exit Close; MainForm. Close; end; procedure TMenuForm. ormClose (Sende : TObject; var Action: TCloseAction ) ; 169 begin TVAnimate. Active := Falser- end; end. 170 Copyright (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the PanelControls unit . unit PanelControls; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, ExtCtrls; type TPanelControlForm = class (TForm) Panell: TPanel; PauseButton: TSpeedButton; StartButton: TSpeedButton; StopButton: TSpeedButton; procedure StopButtonClick (Sender: TObject); procedure StartButtonClick (Sender : TObject); procedure PauseButtonClick (Sender: TObject); procedure FormCreate (Sender: TObject); procedure FormHide( Sender: TObject); private { Private declarations ) public { Public declarations ) Status : string; end; var PanelControlForm: TPanelControlForm; implementation { $R * . DFM} procedure TPanelControlForm. StopButtonClick (Sender : TObject); begin Status : = ' STOP ' ; end; 171 procedure TPanelControlForm. StartButtonClick (Sender : TObject); begin Status := 'START'; end; procedure TPanelControlForm. PauseButtonClick (Sender : TObject); begin Status := 'PAUSE'; end; procedure TPanelControlForm. FormCreate (Sender : TObject); begin Status := ' ' ; end; procedure TPanelControlForm. FormHide (Sende : TObject); begin Status := ' ' ; end; end. 172 Copyright (c) 1995-1998 Crea tor Ltd. All Rights Reserved Description : This is the PDBEngine unit . unit PDBEngine; // Pseudo DataBase Engine interface uses Classes, indows, SysUtils; type TPDBEngine = class (TComponent) private // Registration FChildName : string; FChildSex : string; FChildEyeColor : string; FChildHairColor : string; FBedTimeHour : string; FBirthDay : string; FSecretName : string; FFavoπteColor : string; FFavoriteFood : string; FFavoriteActivity : string; FFavoriteAnimal : string; FCh ldNumber : Integer; FVisitSongMenu : Integer; FVisitGameMenu : Integer; FVisitStoryMenu : Integer; FVisitBunnyShort : Integer; FVisitBunnyLong : Integer; FVisitPπncess : Integer; FBunnyFavoπteFood : string; // Configuration FToyNumber : Integer; FDataBasePath : string; // Multi Toys FMultiToyl : Integer; FMultιToy2 : Integer; FMultιToy3 : Integer; 173 FMultιToy4 Integer; FMultιToy5 Integer; FMultiToyδ Integer; FMultiToy7 Integer; FMultiToyδ Integer; protected // Data[ChildNumber, FieldNumber] Data : Array [ 1..10, 1..40] of string; // change const; Example: Data[ι,j] := 'test'; procedure ClearDataArray; public procedure LoadRegistration; procedure SaveReg stration; procedure InsertNewChild;// Become First in the List (Array) procedure UpDateCurrentChild; procedure SetChildNumber (Value : Integer) ; procedure LoadConfiguration; procedure SaveConfiguration; procedure SetCurrentToFirst; procedure LoadMultiToys; procedure SaveMultiToys; published // Registration property ChildName : string read FChildName write FChildName; property ChildSex : string read FChildSex write FChildSex; property ChildEyeColor : string read FChildEyeColor write FChildEyeColor; property ChildHairColor : string read FChildHairColor write FChildHairColor; property BedTimeHour : string read FBedTimeHour write FBedTimeHour; property BirthDay string read FBirthDay write FBirthDay; property SecretName string read FSecretName write FSecretName; property FavoriteColor string read FFavoriteColor write FFavoriteColor; property FavoriteFood string read FFavoriteFood write FFavoriteFood; property FavoriteActivity string read FFavoriteActivity write FFavoriteActivity; property FavoriteAmmal : string read FFavoriteAnimal write FFavoπteAnimal; 174 property ChildNumber Integer read FChildNumber write SetChildNumber; property VisitSongMenu :: Integer read FVisitSongMenu write FV sitSongMenu; property VisitGameMenu : Integer read FVisitGameMenu write FVisitGameMenu; property VisitStoryMenu :: Integer read FVisitStoryMenu write FVisitStoryMenu; property VisitBunnyShort :: Integer read FVisitBunnyShort write FVisitBunnyShort; property VisitBunnyLong :: Integer read FVisitBunnyLong write FVisitBunnyLong; property VisitPπncess :: Integer read FVisitPrincess write FVisitPrincess ; property BunnyFavoriteFood : string read FBunnyFavoriteFood write FBunnyFavoriteFood; // Configuration property ToyNumber Integer read FToyNumber write FToyNumber; property DataBasePath string read FDataBasePath write FDataBasePath; // Multi Toys property MultiToyl Integer read FMultiToyl write FMultiToyl; property MultιToy2 Integer read FMultιToy2 write FMultιToy2; property MultιToy3 Integer read FMultιToy3 write FMultιToy3; property MultιToy4 Integer read FMultιToy4 write FMultιToy4; property MultιToy5 Integer read FMultiToyS write FMult Toy5; property MultiToyδ Integer read FMultiToyδ write FMultiToyδ; property MultιToy7 Integer read FMultιToy7 write FMultιToy7; property MultiToyθ Integer read FMultiToyδ write FMultiToyθ; end; const HowManyChild en = 7; ChildProperties = 40; // change alse Array implementation procedure TPDBEngine. oadRegistration; var F : TextFile; 1, j : integer; begin ClearDataArray; 175 try AssignFile (F, DataoasePath+' Registration. CRE' ) ; Reset (F) ; l := 1; while not EOF(F) do begin for j:=l to ChildProperties do Readln (F, Data [i, j ]) ; i := i + 1; end; CloseFile (F) ; except SaveRegistration; end; ChildNumber := 1; end; procedure TPDBEngine. SaveRegistration; var F : TextFile; i, j : Integer; begin AssignFile (F, DatabasePath+' Registration. CRE' ) ; Rewrite ( F) ; for ι:=l to HowManyChildren do begin for j:=l to ChildProperties do Wrιteln(F, Data [i, ] ) ; end; CloseFile (F) ; end; // All The Data Shift 1 Step: Nine Become Ten, Eight Become Nine .... // First Become Second. // The New Data will be in the First Record. procedure TPDBEngine. InsertNewChild; var index : integer; i : integer; j : integer; begin for l := (HowManyChildren-1) downto 1 do begin for j := 1 to ChildProperties do begin 176 Data[ι+l,j] := Data[ι,j]; end; end; // index := ChildNumber; ChildNumber := 1; UpDateCurrentChild; // ChildNumber := index; end; procedure TPDBEngine. UpDateCurrentChild; begin Data [ChildNumber, 1] = ChildName Data [ChildNumber, 2 ] = ChildSex Data [ChildNumber, 3] = ChildEyeColor Data [ChildNumber, 4 ] = ChildHairColor Data [ChildNumber, 5] = BedTimeHour Data [ChildNumber, 6] = BirthDay Data [ ChildNumber, 7 ] = SecretName Data [ChildNumber, 8] = FavoriteColor Data [ChildNumber, 9] = FavoriteFood Data [ChildNumber, 10] = FavoriteActivity; Data [ChildNumber, 11] = FavoriteAnimal Data [ChildNumber, 12] = IntToStr (VisitSongMenu) Data [ChildNumber, 13] = IntToStr (VisitStoryMenu) Data [ChildNumber, 14] = IntToStr (VisitBunnyShort) Data [ChildNumber, 15] = IntToStr (VisitBunnyLong) Data [ChildNumber, 16] = IntToStr (VisitGameMenu) Data [ ChildNumber, 17 ] = IntToStr (VisitPπncess) Data [ChildNumber, 18 ] = BunnyFavoriteFood SaveRegistration; end; procedure TPDBEngine. SetChildNumber (Value : Integer); begin if (Value > 0) and (Value < HowManyChildren+1) then FChildNiunber := Value else FChildNumber := 1; ChildName Data [ChildNumber, 1] ChildSex Data [ChildNumber, 2 ] ChildEyeColor Data [ChildNumber, 3] ChildHairColor Data [ChildNumber, ] BedTimeHour Data [ChildNumber, 5] BirthDay Data [ChildNumber, 6] SecretName Data [ChildNumber, 7] 177 Favo iteColor Data [ChildNumber, 8 ] ; FavoriteFood Data [ChildNumber, 9] ; FavoriteActivity Data [ChildNumber, 10] ; FavoriteA mal Data [ChildNumber, 11] ; VisitSongMenu StrToIntDef (Data [ChildNumber, 12] ,0) VisitStoryMenu StrToIntDef ( Data [ ChildNumber, 13 ] , 0 ) VisitBunnyShort StrToIntDef (Data [ChildNumber, 14] , 0) VisitBunnyLong StrToIntDef (Data [ChildNumber, 15] ,0) VisitGameMenu StrToIntDef (Data [ChildNumber, 16] , 0) Visi Princess StrToIntDef (Data [ChildNumber, 17] , 0) BunnyFavoriteFood Data [ChildNumber, 18] ; end; procedure TPDBEngine . ClearDataArray; var l : integer; j : integer; begin for i := 1 to HowManyChildren do begin for j := 1 to ChildProperties do begin Data[ι, j] := end; end; end; procedure TPDBEngine. LoadConfiguration; var F : TextFile; begin FToyNumber := 0; try AssignFile (F, DatabasePath+' Configuration. CRE' ' . Reset (F); Readln ( , FToyNumber) ; CloseFile (F) ; except SaveConfiguration; end; end; procedure TPDBEngine . SaveConfiguration; 178 var F : TextFile; begin AssignFile (F, DatabasePath+ ' Configuration. CRE ' ) ; Rewrite (F) ; Writeln ( F, ToyNumber) ; CloseFile (F) ; end; procedure TPDBEngine. SetCurrentToFirst; var i : integer; Temp : string; begin // While ChildNumber > 1 do begin for l := 1 to ChildProperties do begin Temp = Data [ChildNumber, i] ; Data [ ChildNumber, i ] = Data [ ChildNumber-l,i] ; Data [ChildNumber-l,il = Temp; end; ChildNumber := ChildNumber - 1; end; end; procedure TPDBEngine . LoadMultiToys ; var F : TextFile; begin FToyNumber := 0; try AssignFile (F, DatabasePath+'MultiToys . CRE' ) ; Reset (F) ; Readln ( F, FMultiToyl) Readln ( F, FMultιToy2 ) Readln ( F, FMultιToy3 ) Readln ( F, FMultιToy4 ) Readln ( F, FMultiToy5) Readln (F, FMultiToyδ) Readln ( F, FMultιToy7 ) Readln ( , MultiToyθ ) 179 CloseFile (F) ; except SaveConfiguration; end; end; procedure TPDBEngine . SaveMultiToys ; var F : TextFile; begin AssignFile (F, DatabasePath+'MultiToys . CRE 1 ) ; Rewrite (F) ; Wnteln ( F, FMultiToyl) Writeln ( F, FMultiToy2 ) Wnteln ( F, FMultιToy3 ) Writeln ( F, MultιToy4 ) Writeln ( F, FMultιToy5 ) Writeln ( F, FMultiToyδ) Writeln ( F, FMultιToy7 ) Writeln (F, FMultiToyβ ) CloseFile (F) ; end; end. 180 Copyright (c) 1995-1998 Crea tor Ltd. All Rights Reserved Description : This is the PestoSong unit . unit PestoSong; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, MPlayer; type TPestoSongForm = class (TForm) MainMenul : TMainMenu; testl: TMenuItem; spacel: TMenuItem; MediaPlayerl: TMediaPlayer; Panell: TPanel; Timer1: TTimer; Escapel: TMenuItem; procedure spacelClick (Sender: TObject); procedure FormCreate (Sender : TObject); procedure TimerlTimer (Sender: TObject); procedure EscapelClick (Sender : TObject); procedure FormClose (Sende : TObject; var Action: TCloseAction); private ( Private declarations ) public { Public declarations } FirstTimePlay : Boolean; Section : Integer; procedure PlayMovie; procedure GoToMenu; procedure PlaySection (value : Integer) ; procedure ToyTalk (NumbersOfToy : string ;Wave : string ;motion : string); end; var PestoSongForm: TPestoSongForm; 181 implementation uses Main, Menu; (SR *.DFM) procedure TPestoSongForm. spacelClick (Sender : TObject); begin //space if MainForm. hreadlnProgress = True then exit; GoToMenu; end; procedure TPestoSongForm. GoToMenu; begin Timer1. Enabled := False; Spacel. Enabled := False; MediaPlayerl . Stop; MediaPlayerl . Close; hide; MenuForm. Show; end; procedure TPestoSongForm. PlayMovie; begin MediaPlayerl . Play; ToyTalk( 'All', 'StoryTeller.wav' , 'S') ; end; procedure TPestoSongForm. PlaySection (Value : Integer); begin MediaPlayerl . Close; case Value of 1: begin MediaPlayerl. FileName := MainForm. GraphicsPath + 'Logo.avi'; ToyTalk( 'One' , 'Logo. av' , 'S' ) ; end; 2 : begin MediaPlayerl . FileName : = MainForm. GraphicsPath + 'Alonel .mov' ; ToyTalk f ' One ' , 'Alonel . wav ' , ' S ' ) ; end; 182 3 : begin MediaPlayerl. ileName := MainForm. GraphicsPath + 'Alone2.mov' ; ToyTalk ( ' One ' , 'Alone2. wav ' , * S ' ) ; end; 4 : begin MediaPlayerl. ileName := MainForm. Graphics Path + 'Alone3.mov'; ToyTal ( 'One' , 'Alone3.wav', 'S' ) ; end; 5: begin MediaPlayerl . FileName := MainForm. GraphicsPath + 'All.mov'; ToyTalk ( 'All' , 'All. wav' , 'S' ) ; end; end; MediaPlayerl. open; MediaPlayerl . Play; end; procedure TPestoSongForm. FormCreate (Sender: TObject); begin Panell. Cursor := crNone; Timerl . Enabled := False; Timerl. Interval := 60000; Cursor := crNone; MediaPlayerl. FileName := MainForm. GraphicsPath + 'StoryTeller.avi'; MediaPlayerl. open; FirstTimePlay := True; end; procedure TPestoSongForm. TimerlTimer (Sende : TObject); begin // GoToMenu; end; procedure TPestoSongForm. EscapelClick (Sender: TObject); begin // Exit if MainForm. ThreadlnProgress = True then exit; MediaPlayerl. stop; 183 MediaPlayerl . Close ; Hide; MenuFor . Show; end; procedure TPestoSongForm. ToyTalk (NumbersOfToy : string ;Wave : string ;motιon : string); var ToyNo : Integer; begin if NumbersOfToy = 'All' then ToyNo := 85 //55H else ToyNo := MainForm. Toy. ToyNumber; MainForm. TalklnBackGround (ToyNo,MainForm.AudioPath +Wave, ' ' ) ; end; procedure TPestoSongForm. FormClose (Sender : TObject; var Action: TCloseAction) ; begin try MediaPlayerl . stop; except end; try MediaPlayerl . Close; except end; end; end. 184 Copyrignt (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the Registration unit. unit Registration; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, peg, StdCtrls, Buttons, Spin, Grids, Calendar, ComCtrls, Menus; type TRegistrationForm = class (TForm) Registrationlmage: TImage; RegistrationBacklmage: TImage; UserNameLabel: TLabel; Boylmage: TImage; BoyHairYellowImage: TImage; BoyHairBlacklmage: TImage; BoyHairOrangelmage: TImage; BoyHairBrownlmage: TImage; BoyEyeBluelmage: TImage; BoyEyeGreenlmage: TImage; BoyEyeBrownlmage: TImage; BoyEyeBlacklmage: TImage; BoySh rtYellowImage: TImage; BoyShirtBluelmage: TImage; BoyShirtRedlmage: TImage; Girllmage : TImage ; GirlHairYellowImage: TImage; GirlHairBrownlmage: TImage; GirlHairOrangelmage: TImage; GirlHairBlacklmage: TImage; GirlEyeBluelmage: TImage; GirlEyeGreenlmage: TImage; GirlEyeBrownlmage: TImage; GirlEyeBlacklmage: TImage; GirlShirtYellowImage: TImage; GirlShirtBluelmage: TImage; GirlShirtRedlmage: TImage; 185 AboutYouLabel : TLabel; AboutSexLabel: TLabel; AboutAgeLabel : TLabel; AboutEyeLabel: TLabel; AboutHairLabel: TLabel; AboutBedTi eLabel : TLabel; FavoritesLabel: TLabel; FavoπtesColorLabel: TLabel; FavoritesFoodLabel: TLabel; FavoritesActivityLabel: TLabel; FavoritesAmmalLabel: TLabel; FavoritePanel: TPanel; Panellmage: TImage; PanelLabel1 : TLabel; PanelLabel2: TLabel; PanelLabel3: TLabel; PanelLabel4: TLabel; SecretNameLabel: TLabel; GoOutArrowImage : TImage; BirthDayPanel: TPanel; BirthDaylmage: TImage; Calendarl: TCalendar; Sp Editl: TSpmEdit; ComboBoxl: TComboBox; BedTimeHourPanel: TPanel; BedTimeHourImage: TImage; ComboBox2 : TComboBox; BearEyesAnimate: TAnimate; SteemAmmate: TAnimate; WheelsA mate : TAnimate; BirthDayOKImage: TImage; BedTimeHourOKImage: TImage; VGenderlmage: TImage; VBirthdaylmage: TImage; VEyeColorImage: TImage; VHairColorlmage: TImage; VBedTimeHourImage : TImage; VFavoriteColorlmage: TImage; VFavoπteFoodlmage: TImage; VFavoriteActivitylmage: TImage; VFavoriteA imalImage: TImage; MainMenul: TMamMenu; testl: TMenuItem; 186 Escapel: TMenuItem; BallJumpAnimate: TAnimate; procedure FormCreate (Sender : TObject); procedure RegistrationBacklmageClic (Sender : TObject); procedure AboutSexLabelClick (Sender : TObject); procedure AboutAgeLabelClic (Sender : TObject); procedure AboutEyeLabelClic (Sender : TObject); procedure AboutHairLabelClick (Sender : TObject); procedure AboutBedTimeLabelCl ck (Sender : TObject); procedure PanelLabellClιck( Sender: TObject); procedure PanelLabel2Clιck (Sender : TObject); procedure PanelLabel3Clιck (Sender: TObject); procedure PanelLabel4Clιck (Sender: TObject); procedure FavoπtesColorLabelClick (Sender: TObject); procedure FavoritesFoodLabelClick (Sender : TObject); procedure FavoπtesActivityLabelClick (Sender : TObject); procedure FavoritesAnimalLabelClick (Sender : TObject); procedure AboutSexLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure AboutAgeLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure AboutEyeLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure AboutHairLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure AboutBedTi eLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure PanelLabellMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer) ; procedure PanelLabel2MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer) ; procedure PanelLabel3MouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer) ; procedure PanelLabel4MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure FavoritesColorLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FavoritesFoodLabelMouseMove (Sende : TObject; Shift: TShiftState; X, Y: Integer); procedure FavoπtesActivityLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FavoritesA malLabelMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); 187 procedure SecretNameLabelCl ck (Sender : TObject); procedure RegistrationlmageMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); procedure SecretNameLabelMouseMove (Sende : TObject; Shift: TShiftState; X, Y: Integer) ; procedure RegistrationBacklmageMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); procedure GoOutArrowImageClιck( Sender: TObject); procedure ComboBoxlChange (Sender : TObject); procedure SpinEditlChange (Sender : TObject); procedure CalendarIChange (Sender : TObject); procedure BιrthDayImageClιck( Sender: TObject); procedure RegistrationlmageClick (Sender: TObject); procedure BedTimeHourImageClick (Sender : TObject); procedure ComboBox2Change (Sender: TObject); procedure BirthDayOKImageClickf Sender: TObject); procedure BedTimeHourOKImageClick ( Sender: TObject); procedure EscapelClick (Sender : TObject); private { Private declarations ) public ( Public declarations ) Currentltem : string; ChildName : string; SecretName : string; Gender : string; DateOfBirth : string; EyeColor : string; HairColor : string; BedTimeHour : string; FavoriteColor : string; Favor teFood : string; FavoriteActivity : string; FavoπteAnimal : string; procedure InitialReg; procedure DrawBoyOrGirl; procedure AssignCurrentltem (Value : string) ; procedure GoBackToMenu; procedure ChoosePanelLabel (Value : Integer); procedure SaveToDataBase; procedure LoadFromDataBase; procedure BackgroungSpeaking (Value: string); procedure ShowVIfSelected; 188 end; var RegistrationForm: TRegistrationForm; implementation uses Main, Menu; [$R *.DFM) procedure TRegistrationForm. FormCreate (Sender : TObject) ; begin //Maximize WindowState : = wsMaximized; RegistrationBacklmage . Cursor : = crDefault; I tialReg ; end; procedure TRegistrationForm. RegistrationBacklmageClick ( Sender : TObject) ; begin // if MainForm. ThreadlnProgress then exit; GoBackToMenu; end; procedure TregistrationForm. GoBackToMenu; begin with MenuForm do begin PickUserlmage.Visible := False; // Reg 1 PickUserTitleLabel.Visible := False; UserNameLabell.Visible := False; UserNameLabel2.Visible := False; UserNameLabel3.Visible := False; UserNameLabel4.Visible := False; UserNameLabel5.Visible := False; UserNameLabel6. Visible := False; UserNameLabel?.Visible • = False; UserNameLabel8.Visible := False; // Reg 2 PickUserLabell.Visible • = False; 189 PιckUserLabel2 . Visible • = False ; UserNameEdit . Visible : = False ; OKButtonlmage . Visible : = False ; SetUpOrglmage . Visible := False; Setuplmage. Visible = True; ImageFramel . Enabled = True; ImageFrame2. Enabled = True; ImageFrame3. Enabled = True; ImageFrame4. Enabled = True; ImageFrame5. Enabled = True; ImageFrame6. Enabled = True; //Toy To TV ToyAnimate.Visible := True; Toylmage.Visible := True; with TVAnimate do begin Active = False; FileName = MainForm. GraphιcsPath+ ' noise .AVI ' ; Active = True; Left = 629; Top = 318; Width = 112; height = 88; end; // end; SaveToDataBase; Close; MenuForm. Show; end; procedure TRegistrationForm. ImtialReg; begin Registrationlmage.Visible = True; RegistrationBacklmage.Visible = True; UserNameLabel.Visible = True; Boylmage.Visible = False; BoyHairYellowImage. Visible = False; BoyHairBlacklmage . Visible = False; BoyHairOrangelmage. Visible = False; BoyHairBrownlmage . Visible = False; 190 BoyEyeBluelmage . Visible False; BoyEyeGreenlmage.VisiDle Falser- BoyEyeBrownlmage . Visible False; BoyEyeBlacklmage . Visible False; BoyShirtYellowImage.Visible False; BoyShirtBluelmage. Visible False; BoyShirtRedlmage. Visible False; Girllmage . Visible False; GirlHairYellowImage.Visible False; GirlHairBrownlmage.Visible False; GirlHairOrangelmage . Visible False; GirlHairBlacklmage.Visible False; GirlEyeBluelmage.Visible False; GirlEyeGreenlmage.Visible Falser- G rlEyeBrownlmage.Visible False; GirlEyeBlacklmage.Visible False; GirlShirtYellowImage.Visible Falser- GirlShirtBluelmage.Visible False; GirlShirtRedlmage.Visible False; AboutYouLabel .Visible Falser- AboutSexLabel.Visible False; AboutAgeLabel .Visible False; AboutEyeLabel .Visible False; AboutHairLabel .Visible False; AboutBedTimeLabel .Visible Falser- FavoritesLabel .Visible False; FavoritesColorLabel .Visible False; FavoritesFoodLabel.Visible False; FavoritesActivityLabel .Visible False; FavoritesAmmalLabel .Visible False; FavoπtePanel.Visible := False; //Registrationlmage . Cursor := 6; AboutSexLabel . Cursor = 5; AboutAgeLabel . Cursor = 5 AboutEyeLabel . Cursor = 5 AboutHairLabel . Cursor = 5 AboutBedTimeLabel . Cursor = 5 FavoritesColorLabel . Cursor = 5 FavoritesFoodLabel . Cursor = 5 191 FavoritesActivityLabe1. Cursor = 5 FavoritesA malLabel . Cursor := 5 Panellmage . Cursor = 5 PanelLabell . Cursor = 5 PanelLabel2. Cursor = 5 PanelLabel3. Cursor = 5 PanelLabel4. Cursor = 5 SecretNameLabel . Cursor = 5 RegistrationBacklmage . Cursor = 5 GoOutArrowImage . Cursor = 5 BedTimeHourOKImage . Cursor = 5 BirthDayOKImage . Cursor = 5 Currentltem := SecretName := Gender := DateOfBirth := EyeColor := HairColor := BedTimeHour := FavoriteColor := FavoriteFood := FavoriteActivity := FavoriteAnimal := ComboBoxl. Items.Add ( 'January' ) ; ComboBoxl. Iterns.Add ( 'February' ) ; ComboBoxl. Iterns.Add ( 'March' ) ; ComboBoxl. I erns.Add ( 'April' ) ; ComboBoxl. Items.Add ( 'May' ) ; ComboBoxl . Items .Add ( * June ' ) ; ComboBoxl. Iterns.Add ( 'July' ) ; ComboBoxl. Items.Add ( 'August' ) ; ComboBoxl. Items .Add( ' September' ) ; ComboBoxl . Items .Add ( ' October' ) ; ComboBoxl. Items .Add( 'November' ) ; ComboBoxl. Items.Add ( 'December' ) ; SpinEditl.Value := 1995; ComboBox2. Items.Add( '6:00 PM' ) ComboBox2.Items.Add('6:30 PM' ) ComboBox2. Items.Add( '7:00 PM' ) ComboBox2.Iterns.Add( '7:30 PM' ) 192 ComboBox2. Items.Add ( '8:00 PM' ) ComboBox2.1terns.Add ( ' 8:30 PM' ) ComboBox2. Items.Add ( '9:00 PM' ) ComboBox2. Items. Add ( '9:30 PM' ) ComboBox2. Items.Add ( '10:00 PM' ) ComboBox2.1terns.Add ( '10:30 PM* ) with BedTimeHourPanel do begin Left := 135; Top := 335; Width := 157; Height := 78; with BirthDayPanel do begin Left := 134; Top := 239; Width := 278; Height := 201; end; end; BearEyesA mate. FileName := MainForm. GraphicsPath + 'BearEye.avi'; SteemAnimate. FileName := MainForm. GraphicsPath + 'Steem.avi'; WheelsAmmate . FileName := MainForm. GraphicsPath + 'Wheels.avi'; BallJumpAnimate. FileName := MainForm. GraphicsPath + 'BallJump.avi'; BearEyesAmmate . Active = True; SteemAnimate .Active = True; WheelsAmmate .Active = True; BallJumpAnimate .Active = True; end; procedure TRegistrationForm.AboutSexLabelClick (Sender: TObject); begin // if MainForm. ThreadlnProgress then exit; if Gender = 'Boy' then ChoosePanelLabel (1) ; if Gender = 'Girl' then ChoosePanelLabel (2) ; PanelLabell. caption := 'Boy 1 ; PanelLabel2. caption := 'Girl'; with Favo itePanel do 193 begin Left := 134; Top • = 204; Width := 225; Height := 85; end; FavoritePanel.Visible := True; BedTimeHourPanel.Visible := False; BirthDayPanel.Visible := False; Currentlte := 'Gender'; SteemAnimate. Visible := True; MainForm. BackGroundTalking (MainForm.AboutYouPath +'ay62.wav', 'S') ; end; procedure TRegistrationForm.AboutAgeLabelClick (Sender : TObject); var Temp : string; begin if MainForm. ThreadlnProgress then exit; Temp := DateOfBirth; if Length (DateOfBirth) = 10 then begin Calendarl . Year StrToInt (copy (Temp, 7,4)); Calendarl.Day StrToInt(copy(Temp,4,2) ) ; Calendarl .Month StrToInt (copy (Temp, 1,2) ) ; end; Sp Editl. Value := Calendarl. Year; ComboBoxl . I emlndex := Calendar1.Month-1; BirthDayPanel .Visible := True; FavoritePanel .Visible := False; BedTimeHourPanel.Visible False; SteemAnimate. Visible := False; MainForm. BackGroundTalking (MainForm.AboutYouPath +'ay63.wav', 'S') ; end; procedure TRegistrationForm.AboutEyeLabelClick (Sender : TObject) ; begin // if MainForm. ThreadlnProgress then exit; if EyeColor = 'Blue' then ChoosePanelLabel (1) if EyeColor = 'Green' then ChoosePanelLabel (2) f EyeColor = 'Brown' then ChoosePanelLabel (3) if EyeColor = 'Black' then ChoosePanelLabel (4) 194 PanelLabell. aption • = 'Blue'; PanelLabel2. caption • = 'Green'; PanelLabel3. caption • = 'Brown'; PanelLabel4. caption := 'Black'; with FavoritePanel do begin Left := 134, Top := 269; Width := 225; Height := 145; end; FavoritePanel.Visible := True; BedTimeHourPanel.Visible := False; BirthDayPanel.Visible := False; Currentltem := 'EyeColor'; SteemAnimate.Visible := False; MainForm. BackGroundTalking (MainForm.AboutYouPath +' ay66.wav' , 'S' ) ; end; procedure TRegistrationForm.AboutHairLabelClick (Sender: TObject) ; begin // if MainForm. ThreadlnProgress then exit; if HairColor = 'Blond' then ChoosePanelLabel (1) ; if HairColor = 'Brown' then ChoosePanelLabel (2) ; if HairColor = 'Red' then ChoosePanelLabel (3) ; if HairColor = 'Black' then ChoosePanelLabel (4) ; PanelLabell. caption := 'Blond'; PanelLabel2. caption := 'Brown'; PanelLabel3. caption := 'Red'; PanelLabel4. caption := 'Black'; with FavoritePanel do begin Left := 134; Top := 302; Width := 225; Height := 145; end; FavoritePanel.Visible := True; BedTimeHourPanel . Visible := False; BirthDayPanel .Visible := False; 195 Currentltem := 'HairColor'; SteemAnimate. Visible := False; MainForm. BackGroundTalking (MainForm.AboutYouPath +' ay67.wav' , ' S ' ) ; end; procedure TRegistrationForm.AboutBedTimeLabelClick (Sender: TObject) ; begin if MainForm. hreadlnProgress then exit; ComboBox2.ItemIndex := ComboBox2. Items . IndexOf (BedTimeHour) ; BedTimeHourPanel .Visible := True; FavoritePanel.Visible := False; BirthDayPanel .Visible := False; SteemAnimate.Visible := False; MainForm. BackGroundTalking (MainForm.AboutYouPath +' ay68.wav", 'S') ; end; procedure TRegistrationForm. PanelLabellClick (Sender : TObject); begin if MainForm. ThreadlnProgress then exit; FavoritePanel.Visible := False; AssignCurrentltem (PanelLabell. Caption) ; DrawBoyOrGirl; Currentltem := ''; end; procedure TRegistrationForm. PanelLabel2Clιck (Sender: TObject ) ; begin if MainForm. ThreadlnProgress then exit; FavoritePanel .Visible := False; AssignCurrentltem (PanelLabel2. Caption) ; DrawBoyOrGirl; Currentltem := ''; end; procedure TRegistrationForm. PanelLabel3Clιck (Sender : TObject); begin if MainForm. ThreadlnProgress then exit; FavoritePanel.Visible := False; AssignCurrentltem (PanelLabel3.Caption) ; DrawBoyOrGirl; Currentltem := ' ' ; end; 196 procedure TRegistrationForm. PanelLabel4Clιck (Sender : TObject); begin if MainForm. ThreadlnProgress then exit; FavoritePanel. Visible := False; AssignCurrentltem (PanelLabel4.Caption) ; DrawBoyOrGirl ; Currentltem := ' '; end; procedure TRegistrationForm. FavoritesColorLabelClick (Sender: TObject) ; begin // if MainForm. ThreadlnProgress then exit; f FavoriteColor = 'Yellow' then ChoosePanelLabel (1) ; if FavoriteColor = 'Blue' then ChoosePanelLabel (2) ; if FavoriteColor = 'Red' then ChoosePanelLabel (3) ; PanelLabell. aption := 'Yellow'; PanelLabel2. caption := 'Blue'; PanelLabel3. caption := 'Red'; with FavoritePanel do begin Left = 415; Top = 204; Width = 225; Height = 115; end; FavoπteParlei .Visible := True; BedTimeHoui :Panel.Visible • = False; BirthDayParlei.Visible := False; Currentltem := 'FavoriteColor'; SteemAnimate. Visible : = True; MainForm. BackGroundTalking (MainForm.AboutYouPath +' fa71.wav', 'S') ; end; procedure TRegistrationForm. FavoritesFoodLabelClick (Sender : TObject) ; begin // if MainForm. ThreadlnProgress then exit; if FavoπteFood = 'Pizza' then ChoosePanelLabel (1) ; f FavoπteFood = 'French Fries' then ChoosePanelLabel (2) ; if FavoriteFood = 'Macaroni And Cheese' then ChoosePanelLabel (3) ; 197 PanelLabell. caption := 'Pizza'; PaneiLabel2. caption • = ' Frencn Fries'; PanelLabel3. caption := 'Macaroni And Cheese'; with FavoritePanel do begin Left := 415; Top := 236; Width := 225; Height := 115; end; FavoritePanel. Visible := True; BedTimeHourPanel.Visible := False; BirthDayPanel.Visible := False; Currentltem := ' FavoπteFood' ; SteemAnimate.Visible := True; MainForm. BackGroundTalking (MainForm.AboutYouPath +' fa72.wav', 'S') ; end; procedure TRegistrationForm. FavorιtesActιvιtyLabelClιck( Sender: TObject) ; begin // if MainForm. ThreadlnProgress then exit; if FavoriteActivity = 'Drawing' then ChoosePanelLabel (1) ; if FavoriteActivity = 'Playing Computer Games' then ChoosePanelLabel (2) ; if FavoriteActivity = 'Pretending' then ChoosePanelLabel (3) ; PanelLabell. caption := 'Drawing'; PanelLabel2. caption := 'Playing Computer Games'; PanelLabel3. caption := 'Pretending'; with FavoritePanel do begin Left := 415; Top := 271; Width := 225; Height := 115; end; FavoritePanel. Visible := True; BedTimeHourPanel.Visible := False; BirthDayPanel.Visible := False; Currentltem := 'FavoriteActivity'; SteemAnimate. Visible := True; MainForm. BackGroundTalking (MainForm.AboutYouPath +' fa73.wav', 'S') ; end; 198 procedure TRegistrationForm. FavoritesAnimalLabelClic (Sender : TObject) ; begin // if MainForm. ThreadlnProgress then exit; if Favor teAnimal = 'Horse' then ChoosePanelLabel (1) ; if FavoriteAnimal = 'Dog' then ChoosePanelLabel (2) ; if FavoriteAnimal = 'Cat' then ChoosePanelLabel (3) ; PanelLabell. caption := 'Horse'; PanelLabel2. caption := 'Dog'; PanelLabel3. caption := 'Cat'; with FavoritePanel do begin Left := 415; Top := 304; Width := 225; Height := 115; end; FavoritePanel.Visible := True; BedTimeHourPanel.Visible := False; BirthDayPanel.Visible := False; Currentltem := 'FavoriteAnimal'; SteemAnimate.Visible := True; MainForm. BackGroundTalking (MainForm.AboutYouPath +' fa74.wav', 'S') ; end; procedure TRegistrationForm. ChoosePanelLabel (Value : Integer); begin if Value = 1 then PanelLabell. Font. Color := clFuchsia; if Value = 2 then PanelLabel2. Font. Color := clFuchsia; if Value = 3 then PanelLabel3. Font. Color := clFuchsia; if Value = 4 then PanelLabel4. Font . Color := clFuchsia; end; procedure TRegistrationForm.AboutSexLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin AboutSexLabel. Font. Color := clTeal; end; procedure TRegistrationForm.AboutAgeLabelMouseMove (Sender : TObject; Shift: TShiftState; X, Y: Integer); begin 199 AboutAgeLabel. ont. Color := clTeal; end; procedure TRegistrationForm.AboutEyeLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; begin AboutEyeLabel. Font. Color := clTeal; end; procedure TRegistrationForm.AboutHairLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin AboutHairLabel. Font. Color := clTeal; end; procedure TRegistrationForm.AboutBedTimeLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y. Integer); begin AboutBedTimeLabel. Font. Color := clTeal; end; procedure TRegistrationForm. PanelLabellMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin PanelLabell. Font. Color := clRed; PanelLabel2. Font. Color := clTeal; PanelLabel3. Font. Color := clTeal; PanelLabel4. Font. Color := clTeal; end; procedure TRegistrationForm. PanelLabel2MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin PanelLabell. Font. Color := clTeal; PanelLabel2. Font. Color := clRed; PanelLabel3. Font. Color := clTeal; PanelLabel4. Font. Color := clTeal; end; procedure TRegistrationForm. PanelLabel3MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin PanelLabell. Font. Color := clTeal; 200 PaneiLabel2.Font. Color := clTeal; PanelLabel3. Font. Color := clRed; PanelLabel . Font. Color := clTeal; end; procedure TRegistrationForm. PanelLabel4MouseMove (Sender : TOb ect ; Shift: TShiftState; X, Y: Integer); begin PanelLabell. Font. Color := clTeal; PanelLabel2. Font. Color := clTeal; PanelLabel3.Font. Color := clTeal; PanelLabel4. Font. Color := clRed; end; procedure TRegistrationForm. FavoritesColorLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin FavoritesColorLabel .Font. Color := clTeal; end; procedure TRegistrationForm. FavoritesFoodLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin FavoritesFoodLabel. Font. Color := clTeal; end; procedure TRegistrationForm. FavoritesActivityLabelMouseMove ( Sender: TObject; Shift: TShiftState; X, Y: Integer); begin FavoritesActivityLabel. Font. Color := clTeal; end; procedure TRegistrationForm. FavoritesAnimalLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin FavoritesAmmalLabel. Font. Color := clTeal; end; procedure TRegistrationForm. SecretNameLabelClick (Sender : TObject ) ; begin // if MainForm. ThreadlnProgress then exit ; if SecretName = ' Bubble Gum' then ChoosePanelLabel ( 1 ) ; 201 if SecretName = 'RainBow' then ChoosePanelLabel (2 ) PanelLabell . caption := Bubble Gum" ; PanelLabel2. caption := RainBow' ; with FavoritePanel do begin Left = 292; Top = 186; Width = 225; Height = 85; end; FavoriteParlei.Visible := True; BedTimeHoui :Panel. Visible := False; BirthDayParlei.Visible := False; Currentltem := 'SecretName'; SteemAnimate .Visible := True; MainForm. BackGroundTalking (MainForm.AboutYouPath +' fa75.wav' , ' S ' ) ; end; procedure TRegistrationForm. RegistrationlmageMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // AboutSexLabel. Font. Color := clBlue; AboutAgeLabel. Font. Color := clBlue; AboutEyeLabel. Font. Color := clBlue; AboutHairLabel. Font. Color := clBlue; AboutBedTimeLabel. Font. Color := clBlue; FavoritesColorLabel. Font. Color := clBlue; FavoritesFoodLabel. Font. Color := clBlue; FavoritesActivityLabel. Font. Color := clBlue; FavoritesAmmalLabel. Font. Color := clBlue; PanelLabell. Font. Color := clTeal; PanelLabel2. Font. Color := clTeal; PanelLabel3. Font. Color := clTeal; PanelLabel4. Font. Color := clTeal; SecretNameLabel. ont. Color := clGray; if Currentltem = '' then FavoritePanel.Visible := False; GoOutArrowImage.Visible := False; end; 202 procedure TRegistrationForm. SecretNameLabelMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // SecretNameLabel . Font . Color := clFuchsia; end; procedure TRegistrationForm. DrawBoyOrGirl; var dx : integer; dy : integer; begin // BoyHairYellowImage.Visible := False; BoyHairBlacklmage.Visible := False; BoyHairOrangelmage.Visible := False; BoyHairBrownlmage.Visible := False; BoyEyeBluelmage . Visible False; BoyEyeGreenlmage.Visible False; BoyEyeBrownlmage.Visible False; BoyEyeBlacklmage .Visible False; BoyShirtYellowImage.Visible False; BoyShirtBluelmage.Visible Falser- BoyShirtRedlmage.Visible False; GirlHairYellowImage.Visible False; GirlHairBrownlmage.Visible False; GirlHairOrangelmage . Visible False; GirlHairBlacklmage.Visible False; GirlEyeBluelmage.Visible False; GirlEyeGreenlmage.Visible False; GirlEyeBrownlmage.Visible False; GirlEyeBlacklmage .Visible False; GirlShirtYellowImage.Visible = False; GirlShirtBluelmage. Visible = False; GirlShirtRedlmage. Visible = False; // dx := 32; 203 dy := 30; Gender = 'Boy' then begin Girllmage . Visible := False; with Boylmage do begin Left := 272+dx; Top := 208+dy; Width := 201; Height := 337; Visible := True; end; if HairColor = 'Blond' then with BoyHaα .rYellowImage do begin Left := 309+dx; Top := 208+dy; Width := 109; Height := 98; Visible := True; end; if HairColor = 'Brown' then with BoyHairBrownlmage do begin Left = 312+dx; Top = 208+dy; Width = 105; Height - 97; Visible = True; end; if HairColo;c = 'Red' then with BoyHaurOrangelmage do begin Left = 312+dx; Top = 208+dy; Width • = 105; Height = 97; Visible := True; end; 204 if HairCol 3r = 'Black' then with BoyHairBlacklmage do begin Left := 311+dx; Top := 208+dy; Width := 113; Height := 105; Visible := True; end; if EyeColor = 'Blue' then with BoyEyeBluelmage do begin Left .= 352+dx; Top = 267+dy; Width = 46; Height = 25; Visible = T ue; end; if EyeColor = 'Green' then with BoyEyeCϊreenlmage do begin Left = 356+dx; Top = 268+dy; Width = 49; Height = 25; Visible = True; end; if EyeColor = 'Brown' then with BoyEyeBrownlmage do begin Left = 352+dx; Top = 267+dy; Width = 49; Height = 25; Visible = True; end; if EyeColor = 'Black' then with BoyEyeBlacklmage do 205 begin Left = 352+dx; Top = 265+dy; Width = 49; Height = 24; Visible = True; end; if FavoriteColor = 'Yellow' then with BoyShirtYellowImage do begin Left = 288+dx; Top = 320+dy; Width = 185; Height = 193; Visible = True; end; if FavoriteColor = 'Blue' then with BoyShirtBluelmage do begin Left : = 285+dx; Top : = 319+dy; Width = 156; Height = 192; Visible = True; end; if FavoriteC :olor = 'Red' then with BoyShijrtRedlmage do begin Left • = 285+dx; Top := 312+dy; Width := 161; Height := 185; Visible := True; end; end; // if Gender = 'Girl' then begin Boylmage . Visible : = False; 206 with Girllmagf_ ■ do begin Left = 274+dx; Top = 197+dy; Width = 177; Height = 305; Visible = True; end; if HairColor = 'Blond' then with GirlHairYellowImage do begin Left = 281+dx; Top = 197+dy; Width = 139; Height = 121; Visible = True; I ; if HairColor = 'Brown' then with GirlHairBrownlmage do begin Left = 277+dx; Top = 197+dy; Width = 143; Height = 129; Visible = True; end; if HairColoj : = 'Red' then with GirlHa. LrOrangelmage do Left = 279+dx; Top = 197+dy; Width = 142; Height = 129; Visible = True; end; if HairColor = 'Black' then with GirlHairBlacklmage do begin 207 Left := 280+dx; Top := 197+dy; Width •= 139; Height := 129; Visible := True; end; if EyeColor = 'Blue' then with GirlEyeBluelmage do begin Left = 360+dx; Top = 266+dy; Width = 49; Height = 33; Visible = True; end; if EyeColor = 'Green' then with GirlEyeGreenlmage do begin Left = 363+dx; Top = 266+dy; Width = 49; Height = 25; Visible = True; end; if EyeColor = 'Brown' then with GirlEyeBrownlmage do begin Left = 363+dx; Top = 266+dy; Width = 49; Height = 25; Visible = True; end; if EyeColor = 'Black' then with GirlEyeBlacklmage do begin Left := 359+dx; Top := 266+dy; Width := 49; 208 Height := 25; Visible := True end; if FavoriteColor = 'Yellow' then with GirlShirtYellowImage do begin Left = 305+dx; Top = 303+dy; Width = 144; Height = 209; Visible = True; end; if FavoriteColor = 'Blue' then with GirlShirtBluelmage do begin Left = 302+dx; Top = 312+dy; Width = 147; Height = 193; Visible = True; end; if FavoriteColor = 'Red' then with GirlShirtRedlmage do begin Left = 305+dx; Top = 315+dy; Width = 143; Height = 201; Visible = True; end; end; end; procedure TRegistrationForm.AssignCurrentltem (Value string ) ; begin if Currentltem = 'SecretName' then begin SecretName := Value; AboutYouLabel. Visible := True; 209 AboutSexLabel. Visiole True; AboutAgeLabel . Visicle True; AboutEyeLabel . Visiole True; AboutHairLabel . Visible True; AboutBedTimeLaoel .Visible True; FavoπtesLabel .Visible True; FavoritesColorLabel .Visible True; FavoritesFoodLabel .Visible True; FavoritesActivityLabel . Visible True; FavoπtesAnimalLaDel .Visible True; end; if (Currentltem = 'Gender') and (Gender <> Value) then begin DateOfBirth EyeColor HairColor BedTimeHour FavoriteColor FavoriteFood FavoriteActivity FavoriteAnimal Gender := Value; end; if Currentltem = 'DateOfBirth' then DateOfBirth Value; if Currentltem = 'EyeColor' then EyeColor Value; if Currentltem = 'HairColor' then HairColor Value; if Currentltem = 'BedTimeHour' then BedTimeHour Value; if Currentltem = 'FavoriteColor' then FavoriteColor Value; if Currentltem = 'FavoriteFood' then FavoriteFood Value; if Currentltem = 'FavoriteActivity' then FavoriteActivity Value; if Currentltem = 'FavoriteAnimal' then FavoriteAnimal Value; // BackgroungSpeakmg (Value) ; SteemAnimate. Visible := True; ShowVIfSelected; // end; procedure TRegistrationForm. BackgroungSpeakmg (Value: string ) ; var TalkStnng : string; begin 210 TalkString := if Currentltem = 'SecretName' then begin if Value = 'Bubble Gum' then TalkString := ' fa75a'; if Value = 'RainBow' then TalkString := 'fa75b'; end; f Currentltem = ' Gender ' then begin if Value = 'Boy' then TalkString := ' ay64 ' ; f Value = • Girl' then TalkString := ' ay65 * ; end; if Currentltem = 'EyeColor' then begin if Value = 'Blue' then TalkString := 'ay66a' / if Value = 'Green' then TalkString := 'ay66b' if Value = 'Brown' then TalkString := *ay66c' / if Value = 'Black' then TalkString := 'ay66d' end; if Currentltem = 'HairColor then begin if Value = 'Blond' then TalkString := 'ay68a'; if Value = 'Brown' then TalkString := 'ay68b'; if Value = 'Red' then TalkString := 'ay68c'; if Value = 'Black' then TalkString := 'ay68d'; end; if Currentltem = 'FavoriteColor' then begin if Value = 'Yellow' then TalkString = 'fa71a'; if Value = 'Blue' then TalkString = 'fa71b'; if Value = 'Red' then TalkString = 'fa71c'; end; if Currentltem = 'FavoriteFood' then begin if Value = 'Pizza' then TalkString = ' fa72a ' ; if Value = 'French Fries' then TalkString = ' f a72b ' ; if Value = 'Macaroni And Cheese' then TalkString = ' fa72c ' ; end; 211 if Currentltem = ' FavoriteActivity ' then begin if Value = 'Drawing' then TalkString = ' fa73a ' ; if Value = 'Playing Computer Games' then TalkString = ' fa73b ' ; if Value = 'Play Make Believe' then TalkString = ' fa73c ' ; end; if Currentltem = ' FavoriteAnimal ' then begin if Value = 'Horse' then TalkString = 'fa74a'; if Value = 'Dog' then TalkString = 'fa74b'; if Value = 'Cat' then TalkString = 'fa74c'; end; if TalkString <> '' then MainForm. BackGroundTalking (MainForm.AboutYouPath +TalkStnng+ ' . wav ' , ' S ' ) ; end; procedure TRegistrationForm. RegistrationBacklmageMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // GoOutArrowImage .Visible := True; end; procedure TRegistrationForm. GoOutArrowImageClick (Sender : TObject) ; begin if MainForm. ThreadlnProgress then exit; GoBackToMenu; end; procedure TRegistrationForm. LoadFromDataBase; begin ChildName MainForm. PDBEngine . ChildName ; SecretName MainForm. PDBEngine. SecretName, • Gender MainForm. PDBEngine. ChildSex, • DateOfBirth MainForm. PDBEngine. BirthDay; EyeColor MainForm. PDBEngine . ChildEyeColor; HairColor MainForm. PDBEngine . ChildHairColor; BedTimeHour MainForm. PDBEngine. BedTimeHour; FavoriteColor MainForm. PDBEngine . FavoriteColor; FavoriteFood MainForm. PDBEngine . FavoriteFood; 212 FavoriteActivity := MainForm. PDBEngine . FavoriteActivity; FavoriteAnimal := MainForm. PDBEngine . avoriteAnimal; end; procedure TRegistrationForm. SaveToDataBase begin MainForm. PDBEngine . ChildName ChildName; MainForm. PDBEngine . SecretName SecretName; MainForm. PDBEngine . ChildSex Gender; MainForm. PDBEngine. BirthDay DateOfBirth; MainForm. PDBEngine . ChildEyeColor EyeColor; MainForm. PDBEngine . ChildHairColor HairColor; MainForm. PDBEngine . BedTimeHour BedTimeHour; MainForm. PDBEngine . FavoriteColor FavoriteColor; MainForm. PDBEngine . FavoriteFood FavoriteFood; MainForm. PDBEngine . FavoriteActivity FavoriteActivity; MainForm. PDBEngine . FavoriteAnimal FavoriteAnimal; MainForm. PDBEngine . UpDateCurrentChild; end; procedure TRegistrationForm. ComboBoxlChange (Sender: TObject); begin Calendarl.Month := ComboBoxl. Itemlndex +1; end; procedure TRegistrationForm. SpmEditlChange (Sender: TObject); begin Calendarl. Year := SpinEditl .Value, • end; procedure TRegistrationForm. CalendarlChange (Sender: TObject); var spacel : string; space2 : string; begin if Calendarl.Month < 10 then spacel := '0' else spacel := ''; if Calendarl. Day < 10 then space2 := '0' else space2 := ''; DateOfBirth := spacel+IntToStr (Calendarl.Month) +'/' +space2+ IntToStr (Calendarl. Day) +'/ ' +IntToStr (Calendarl .Year) ; end; procedure TRegistrationForm. BirthDaylmageClick (Sender : TObject) ; begin 213 if MainForm. hreadlnProgress then exit; BirthDayPanel. Visible := False; ShowVIfSelected; end; procedure TRegistrationForm. RegistrationlmageClick (Sender : TObject) ; begin if MainForm. ThreadlnProgress then exit; BirthDayPanel .Visible := False; FavoritePanel. Visible := False; BedTimeHourPanel.Visible := False; SteemAnimate.Visible := True; ShowVIfSelected; end; procedure TRegistrationForm. BedTimeHourlmageClick (Sender: TObject) ; begin if MainForm. ThreadlnProgress then exit; BedTimeHourPanel.Visible := False; ShowVIfSelected; end; procedure TRegistrationForm. ComboBox2Change (Sender: TObject); begin BedTimeHour := ComboBox2.Text; end; procedure TRegistrationForm. BirthDayOKImageClick (Sender : TObject) ; begin // if MainForm. ThreadlnProgress then exit ; BirthDayPanel . Visible : = False; ShowVI f Selected; end; procedure TRegistrationForm. Bed T imeHourOKImageClick (Sender: TObject) ; begin // if MainForm. ThreadlnProgress then exit ; BedTimeHourPanel . Visible : = False; ShowVI f Selected; end; 214 procedure TRegistrationForm. ShowVIfSelected; begin if Gender = '' then VGenderlmage. visible := False else VGenderlmage. visible := True; if DateOfBirth = '' then VBirthdaylmage. visible := False else VBirthdaylmage. visible := True; if EyeColor = ' ' then VEyeColorlmage. visible := False else VEyeColorlmage. isible := True; if HairColor = '' then VHairColorlmage. visible := False else VHairColorlmage. visible := True; if BedTimeHour = ' ' then VBedTimeHourlmage . visible := False else VBedTimeHourlmage. visible := True; if FavoriteColor = '' then VFavoriteColorlmage. visible := False else VFavoriteColorlmage. visible := True; if FavoriteFood = ' * then VFavoriteFoodlmage. visible := False else VFavoriteFoodlmage. visible := True; if FavoriteActivity = ' ■ then VFavoriteActivitylmage. visible := False else VFavoriteActivitylmage. visible := True; if FavoriteAnimal = ' ' then VFavoπteAnimallmage. visible := False else VFavoriteAnimallmage. visible := True; end; procedure TRegistrationForm. EscapelClick (Sender : TObject); begin // GoBackToMenu ; end; end . 215 Copyright (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the SmgAlong unit. unit SingAlong; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Menus; type TSingAlongForm = class (TForm) Imagel: TImage; StoryTellerlmage: TImage; PeasImage: TImage; Headlmage: TImage; MamMenul: TMamMenu; testl: TMenuItem; spacel: TMenuItem; Timerl: TTi er; procedure spacelClick (Sender : TObject); procedure TimerlTimer (Sender: TObject); procedure FormCreate (Sender : TObject); private { Private declarations } public ( Public declarations ) Song : Integer; procedure PlaySongs; end; var S gAlongForm: TSingAlongForm; implementation uses Menu, Main, creator, PestoSong; ($R *.DFM} 216 procedure TSingAlongForm. spacelClick ( Sender : TObj ect ) ; begin // stop playing and go back to menu Timerl. Enabled := False; Spacel. Enabled := False; Hide ; MenuForm. Show; end; procedure TSingAlongForm. TimerlTimer (Sender : TObject); begin Timerl. Enabled := False; Hide; CreatorForm. Show; CreatorForm. PlayMovie; end; procedure TSingAlongForm. FormCreate (Sender : TObject); begin Timerl. Enabled := False; with StoryTellerlmage do begin Left • = 125; Top := 80; Width = 453; Height = 453; end; with Peaslrtiage do begin Left = 176; Top = 176; Width = 186; Height = 236; end; with Headlπnage do begin Left = 152; Top = 129; Width = 258; Height = 346; end; StoryTellei :Image . Visible := True; 217 PeasImage .Visible := False; Headlmage .Visible := Falser- end; procedure TSingAlongForm. PlaySongs ; begin // 85 = Broadcast with PestoSongForm do begin Spacel . Enabled := True; Timerl. Enabled := True; MediaPlayerl . Open; end; with CreatorForm do begin Spacel. Enabled := True; Timerl. Enabled := True; MediaPlayerl. Open; end; Timerl. Interval := 3000; Timerl. Enabled := True; Song := 1; StoryTellerlmage.Visible = True; Peaslmage.Visible = False; Headlmage. Visible = False; //MainForm. TalklnBackGround ( 85,MainForm.AudioPath + 'StoryTeller.wav' , ' ' ) ; end; end. 218 Copyright (c) 1995-1998 Crea tor Ltd. All Rights Reserved Description : This is the Status unit . unit Status ; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Buttons, StdCtrls, jpeg, Gauges, ExtCtrls, Menus; type TStatusForm = class (TForm) Statuslmage: TImage; GotoMenuImage : TImage; Mimmizelmage: TImage; StatusGauge: TGauge; Label1: TLabel; MamMenul: TMainMenu; testl: TMenuItem; Escapel: TMenuItem; StatusAnimate : TAnimate; SpeechLabel: TLabel; StandByLabel : TLabel; TalkErrorLabel: TLabel; procedure FormClose (Sender: TObject; var Action: TCloseAction); procedure SpeedButtonlClick (Sender : TObject); procedure FormCreate (Sender : TObject); procedure SpeedButton2Clιck (Sender : TObject); procedure GotoMenuImageClick (Sender : TObject); procedure MιnιmιzeImageClιck( Sender: TObject); procedure EscapelClick (Sender : TObject); procedure FormShow (Sender : TObject); procedure FormHide (Sender: TObject); private { Private declarations ) public ( Public declarations ) end; 219 var Status Form: TStatus Form; implementation uses Menu, Main, ToySimulation, MotionSimulation , PanelControls ; { $R * . DFM( procedure TStatusForm. FormClose (Sender: TObject; var Action: TCloseAction); begin StatusAmmate.Active := False; MenuForm. Show; if MenuForm. Threadl <> ml then begin MenuForm. Threadl . erminate; end; end; procedure TStatusForm. SpeedButtonlClick (Sender: TObject); begin SimulationForm. Close; MotionSimulationForm. Close; close; MenuForm. Show; end; procedure TStatusForm. ormCreate (Sender : TObject); begin //Icon. LoadFromFile (MainForm. GraphιcsPath+ ' Pestolcon.ico' ) ; StatusAmmate. FileName := MainForm. GraphιcsPath+' top.AVI ' ; StatusAmmate.Active := True; GotoMenuImage. Cursor := 5; MinimizeImage. Cursor := 5; end; procedure TStatusForm. SpeedButton2Clιck (Sender: TObject); begin Application .Minimize ; end; procedure TStatusForm. GotoMenuImageClick (Sender : TObject); begin 220 SimulationForm. Close; MotionSimulationForm. Closer- close; MenuForm. Show; end; procedure TStatusForm.MinimizelmageClick (Sender : TOb ect); begin Application .Minimize ; end; procedure TStatusForm. EscapelClick (Sender : TObject); begin SimulationForm. Close; • ■ MotionSimulationForm. Close; close; MenuForm. Show; end; procedure TStatusForm. FormShow( Sender: TObject); begin PanelControlForm. Show; end; procedure TStatusForm. FormHide (Sender : TObject); begin PanelControlForm. Hide ; end; end. 221 Copyrigh t (c) 1995-1998 Crea tor Ltd. All Rights Reserved Description : This is the Toy uni t . unit Toy; (This Unit contained several methods, converting from Dll/Ocx to Simple methods} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TToy = class (TComponent) private ( Private declarations } FToyNumber : Integer; public { Public declarations ) function Talk (TalkFiles : string; Motion : string) : Integer; function TalkAndListen (TalkFiles : string; TalkMotion : string; ListenTime : Real; ListenMotion : string) : Integer; function Wait (ListenTime : Real; Motion : string) : Integer; function Listen (Map : string; DelayTime : Real ; device : String; Motion : string) : Integer; function TurnOn Boolean; function TurnOff Boolean; function CheckToySystem Integer; function LιstenConv( ListenMotion string) : Integer; function TalkConv( istenMotion : string): Integer; function RecordWave (WaveFile : string; DelayTime : Real ; Motion : String) : Integer; function ListenActive (Map : string; DelayTime : Real ; device : String; Motion : string) : Integer; function TalkAll (TalkFiles : string; Motion : string ) : Integer; function ToyTalkln (ToyNu berValue . Integer,-TalkFiles : string; 222 LTime: Integer; Motion : string) : Integer; function ToyListenln (DTi e : Integer ; Motion : string) : Integer; published property ToyNumber : integer read FToyNumber write FToyNumber; end; const SBDevice = 0; AllToys = 85; implementation uses Mam, ToySimulation, MotionSimulation, status; / +++**+*++++*+++*+*+++++++********+*+*++*+***★*+*++++++**+**+++***+******++ // Examples : Talk('a.wav + b.wav + c. av' , 'Motor and Listen :: 1.5); // Listen Time = 1.5sec //sensors : 1-Nose 2-Hand 3-Foot ; Q-none function TToy.Talk (TalkFiles : string; Motion : string) : Integer; var LTime : integer; SensorFlag : Boolean; SensorNumber : Integer; i : Integer; begin LTime := 12000; StatusForm. TalkErrorLabel.Visible := False; f ToyNumber < 0 then begin SimulationForm. ToyTalk (TalkFiles, Motion, O(LTιme) ) ; //fix While ( SimulationForm. ToyTalkStatus = True) or (SimulationForm. ToyListenStatus = True) do sleep(500) ; //Sleep(lOOO) ; //Limitation of the Equipment //fix Result := SimulationForm. KeyPress ; end else begin // ToyNumber >0 Result := ToyTalkln (ToyNumbe , TalkFiles , LTime,Motion) ; if Result < 0 then begin sleep (250) ; 223 Result := ToyTalkIn (ToyNumber, alkFiles , LTime, Motion) ; end; if Result < 0 then begin StatusForm. TalkErrorLabel. Visible := True; sleep(lOOO) ; Result := ToyTalkIn (ToyNumber, TalkFiles, Time, Motion) ; end; if Result < 0 then begin sleep (1000) ; Result := ToyTalkIn (ToyNumber, alkFiles, LTime, Motion) ; end; if Result = -2 then begin sleep (20000) ; Result := ToyTalkIn (ToyNumber, TalkFiles, LTime, Motion) ; end; if Result = -2 then begin sleep (20000) ; Result := ToyTalkIn (ToyNumber, TalkFiles, LTime, Motion) ; end; end; end; //**+**++**+*+ ***++*★+++*+*+**++**+****++++*+****** ■ * • *+*+**+** • * • ++*+ + * function TToy.TalkAll (TalkFiles : string; Motion : string) : Integer; var LTime : integer; SensorFlag : Boolean; SensorNumber : Integer; l : Integer; begin LTime := 50; if ToyNumber < 0 then begin SimulationForm. ToyTalk (TalkFiles, Motion, LTime); 224 While ( SimulationForm. ToyTalkStatus = True) or (SimulationForm. ToyListenStatus = True) do sleep (500) ; Sleep (1000) ; //Limitation of the Equipment Result := SimulationForm. KeyPress; end else begin // ToyNumber >0 Result := ToyTalkI (AllToys, TalkFiles, LTime, Motion) ; if Result < 0 then Result := ToyTalkIn (AllToys, TalkFiles, LTime,Motion) ; end; end; function TToy.Wait (ListenTime : Real; Motion : string) : Integer; var LTime : integer; begin //== ===== == ====== = == == === ; ===================================== LTime := Trunc (1000*ListenTιme) ; SimulationForm. ToyListen (LTime, Motion) ; While (SimulationForm. ToyTalkStatus = True) or (SimulationForm.ToyListenStatus = True) do sleep(200) ; Sleep (1000) ; //Limitation of the Equipment Result := SimulationForm. KeyPress ; //=============================================================== ( Result := MainForm. XMidil .ToyLιsten2 (ToyNumber, Trunc (LTime*10) , ListenConv (Motion) ) ; Result := MainForm. SRI .WaitForEvent ( ' ' , Trunc (LTιme*10) ,2) ; //Sensors 1 //======== « ===========: ========================================== end; /* + + ★★*★* + *★ + **★★ + * + *********** + *★******★* + ************ ■ * ■ ******* ■ * ■ ********* //sensors : 1-Nose 2-Hand 3-Foot ; 0-none function TToy. Listen (Map : string; DelayTime : Real ; device : String; Motion : string) : Integer; var DTime : Integer; 225 Flags : Integer; SRisOn : Boolean ; begin sleep ( 100 ) ; DTime := Trunc (DelayTime*10) ; Flags := 0; if Pos ( 'SR' , Device) > 0 then begin Flags := Flags + 1; SRisOn := True; end else SRisOn := False; if Pos ( 'Sensor ', Device) > 0 then Flags := Flags + 2; StatusForm. SpeechLabel.Visible := True; Result := MainForm. srl .WaitForEvent (Map, DTime, Flags) ; StatusForm. SpeechLabel.Visible := False; if (Result > 0) and (MainForm. srl .GetPhraseConfLevel (1) < 5000)and (SRisOn = True) then Result := 0; end; +**+*+★***********+**++***★+*******+***+********************++* //sensors : 1-Nose 2-Hand 3-Foot ; 0-none function TToy. ListenActive (Map : string; DelayTime : Real ; device : String; Motion : string) : Integer; var DTime : Integer; Flags : Integer; SRisOn : Boolean; begin Result := 1; DTime := Trunc (DelayTime* 10) ; if ToyNumber > -1 then begin Result := ToyListenln (DTime, Motion) ; if Result <> 1 then Result := ToyListenln (DTime,Motion) ; if Result <> 1 then begin Result := ToyListenln (DTime, Motion) ; end; end else Result := 1; Flags := 0; 226 if Pos ( ' SR ' , Device ) > 0 then begin Flags : = Flags + 1 ; SRisOn := True; end else SRisOn := False; if Pos ( 'Sensor ', Device) > 0 then Flags := Flags + 2; sleep (100) ; if Result = 1 then begin StatusForm. SpeechLabel.Visible := True; Result := MainForm. srl .WaitForEvent (Map, DTime, Flags ) ; StatusForm. SpeechLabel.Visible := False; if (Result > 0) and (MainForm. srl. GetPhraseConfLevel (1) < 5000)and (SRisOn = True) then Result := 0; end else if Result = -2 then Result := -9999; end; function TToy.TalkAndListen (TalkFiles : string; TalkMotion : string; ListenTime : Real; ListenMotion : string) : Integer; var Flags : Integer; LTime : Integer; begin Flags := 0; Ltime := 0; ( SimulationForm.ToyTalk (TalkFiles, Motion, LTime); While (SimulationForm.ToyTalkStatus = True) or (SimulationForm. ToyListenStatus = True) do sleep (500) ; Slee (1000) ; //Limitation of the Equipment Result := SimulationForm. KeyPress ; ) //=============================================================== //Result := MainForm. XMidil .ToyTalk2 (ToyNumber, TalkFiles, // SBDevιce,0,0, 0) ; //=============================================================== 227 end; / * + *** + *# + ** + ***** + ***************** + *★**★**•*•★****** ■ *•* function TToy.TurnOn : Boolean; var ResultSR : Integer; ResultXMidi : Integer; begin // open SR (with MainForm do begin SRI. DataBase = ΑSR1500 - Telephone'; SRI.User = 'Creator'; SRI. Context = ' Demo ' ; SRl.OpenAttr = 0; ResultSR = SRl.Imt; end; } ResultSR := MainForm. SRI . Init; //open MIDI ResultXMidi := MainForm.XMidil. StartHUB; if (MainForm. ToyMachme = MainForm. ToyNamelsBear) then MainForm. Midil. SetMotor (ToyNumber, 0,1,200) ; Result := (ResultSR = 0) AND (ResultXMidi = 0) ; end; function TToy.TurnOff : Boolean; var ResultSR : Integer; ResultXMidi : Integer; begin //close SR & MIDI ResultSR := MainForm. SRI . Close; ResultXMidi := MainForm. XMidil .StopHUB; Result := (ResultSR = 0) AND (ResultXMidi = 0) ; end; // 0 = OK , -1 = LowBattery, -2 = No Communication // -3 = LowBattery & No Communication function TToy.CheckToySystem : Integer; begin Result := Or- endr- 228 function TToy. istenConv (ListenMotion string) Integer; begin Result := 0; if ListenMotion = 'W' then Result = 0 if ListenMotion = 'X' then Result = 1 if ListenMotion = 'Y' then Result = 2 if ListenMotion = 'Z' then Result = 3 end; function TToy.TalkConv(LιstenMotιon : string) Integer; begin Result := 0; if ListenMotion = 'S' then Result := 0; if ListenMotion = 'EC then Result := 1; if ListenMotion = 'E' then Result := 2; if ListenMotion = 'EL' then Result := 3; if ListenMotion = 'S#' then Result := 4; if ListenMotion = 'X' then Result = 5 if ListenMotion = 'X' then Result = 6 if ListenMotion = 'X' then Result = 7 if ListenMotion = 'X' then Result = 8 if ListenMotion = 'X' then Result = 9 if ListenMotion = *X' then Result = 10 if ListenMotion = 'X' then Result = 11 if ListenMotion = 'X* then Result = 12 if ListenMotion = 'X' then Result = 13 if ListenMotion = 'X' then Result = 14 if ListenMotion = 'X' then Result = 15 if ListenMotion = 'X' then Result = 16 if ListenMotion = 'X' then Result = 17 if ListenMotion = 'X' then Result = 18 if ListenMotion = 'X' then Result = 19 if ListenMotion = 'X' then Result = 20 if ListenMotion = 'X' then Result = 21 if ListenMotion = 'X' then Result = 22 if ListenMotion = 'X' then Result = 23 if ListenMotion = 'x' then Result = 24 if ListenMotion = 'X' then Result = 25 if ListenMotion = 'X' then Result = 26 if ListenMotion = 'X' then Result = 27 if ListenMotion = 'X' then Result = 28 if ListenMotion = 'X' then Result = 29 229 if ListenMotion = 'X' then Result := 30; end; function TToy.RecordWave (WaveFile : string; DelayTime : Real ; Motion : String) : Integer; var DTime : Integer; begin Wait (DelayTime, Motion) ; DTime := Trunc (DelayTιme*10) ; Result := MainForm.XMidil. ToyRecord (WaveFile, DTime) ; end; function TToy. ToyTalkIn (ToyNumberValue : Integer;TalkFιles : string; LTime: Integer; Motion : string) : Integer; begin sleep (100) ; if (MainForm. ToyMachme =' StoryTeller ' ) and (ToyNumber <> 85) then Result := MainForm.XMidil. ToyTalk2 (ToyNumber, TalkFiles, SBDevice, LTime, TalkConv (Motion) ,0) ; if (MainForm. oyMachme = 'TeddyBear') or (ToyNumber = 85) then Result := MainForm.XMidil .NewToyTalk (ToyNumber, TalkFiles, SBDevice, 9, LTime) ; end; function TToy. ToyListenln (DTime : Integer ; Motion : string) : Integer; begin sleep (100) ; if MainForm. ToyMachme = 'StoryTeller' then Result := MainForm.XMidil .ToyLιsten2 (ToyNumber, DTime, L stenConv(Motιon) ) ; if MainForm. ToyMachme = 'TeddyBear' then Result := MainForm. Midil .ToyListenTime (ToyNumber, DTime) ; end; end. 230 Copyrignt (c) 1995-1998 Creator Ltd. All Rights Reserved Description : This is the Intro unit. unit Intro; interface uses Status , Mam, Toy, PanelControls, Windows, Messages , SysUtils , Classes , Graphics , Controls, Forms , Dialogs , Registration; type TIntro = class (TThread) private { Private declarations ) Gamestatus string; ChildName string; SecretName string; DateOfBirth string; EyeColor string; HairColor string; BedTimeHour string; FavoriteColor string; FavoriteFood string; FavoriteActivity string; FavoriteAnimal string; ChildSex string; IntroNextSection Integer; PlayNextSection Integer; PrincessNextSection Integer; TheStoryMenuNextSection Integer; RunstoryMenuNextSection Integer; BedT meRitualNextSection Integer; Grouch NextSection Integer; BunnyNextSection Integer; PresentationNextSection Integer; VisitSongMenu Integer; Vis11GameMenu Integer; VisitStoryMenu Integer; 231 VisitBunnyShort : Integer; VisitBunnyLong : Integer; VisitPπncess : Integer; BunnyFavoπteFood : string; protected procedure Execute; override; procedure LoadDataFromDatabase; procedure SaveDataFromDatabase; procedure UpdatelntroBar; procedure UpdatePlayBar; procedure UpdatePrincessBar; procedure UpdateTheStoryMenuBar; procedure UpdateRunStoryMenuBar; procedure UpdateBedTimeRitualBar; procedure UpdateGrouchyBar; procedure UpdateBunnyBar; procedure UpdatePresentationBar; procedure ApplicationMinimize; procedure ClearStatusControl; public constructor Create (Status : string) ; end; //sensors : 1-Nose 2-Hand 3-Foot const NoseSensor = 2; HandSensor = 1; FootSensor = 3; implementation ( Important: Methods and properties of objects in VCL can only be used in a method called using Synchronize, for example, Synchronize (UpdateCaption) ; and UpdateCaption could look like, procedure TIntro. UpdateCaption; begin Forml. Caption := 'Updated in a thread'; end; ) 232 { TIntro ) constructor TIntro. Create (Status string) begin inherited Create (False) ; FreeOnTerm ate := True; GameStatus := Status; end; procedure TIntro. oadDataFromDatabase; begin // Get Current Data From database ChildName = Trim (MainForm. PDBEngine. ChildName) ; SecretName = Trim (MainForm. PDBEngine. SecretName) ; ChildSex = Trim (MainForm. PDBEngine. ChildSex) ; DateOfBirth = Trim(MainForm. PDBEngine. BirthDay) ; EyeColor = Trim(MainForm. PDBEngine. ChildEyeColor) ; HairColor = Trim (MainForm. PDBEngine. ChildHairColor) ; BedTimeHour = Trim(MainForm. PDBEngine. BedTimeHour) ; FavoriteColor = Trim(MainForm. PDBEngine. avoriteColor) ; FavoriteFood = Trim(MainForm. PDBEngine. FavoriteFood) ; FavoriteActivity = Trim(MainForm. PDBEngine. FavoriteActivity) ; FavoriteAnimal = Trim(MainForm. PDBEngine. FavoriteAnimal) ; VisitSongMenu = MainForm. PDBEngine.VisitSongMenu; VisitGameMenu = MainForm. PDBEngine.VisitGameMenu; VisitStoryMenu = MainForm. PDBEngine.VisitStoryMenu; VisitBunnyShort = MainForm. PDBEngine.VisitBunnyShort; VisitBunnyLong = MainForm. PDBEngine .VisitBunnyLong; VisitPrincess = MainForm. DBEngine.VisitPrincess; BunnyFavoπteFood : = MainForm. PDBEngine . BunnyFavoriteFood; end; procedure TIntro . SaveDataFromDatabase; begin // Save Current Data To database MainForm. PDBEngine.VisitSongMenu VisitSongMenu; MainForm. PDBEngine . VisitGameMenu VisitGameMenu; MainForm. PDBEngine. VisitStoryMenu VisitSto yMenu; MainForm. PDBEngine.VisitBunnyShort VisitBunnyShort; MainForm. PDBEngine . VisitBunnyLong VisitBunnyLong; MainForm. PDBEngine. VisitPrincess VisitPrincess; MainForm. PDBEngine . BunnyFavoriteFood := BunnyFavoriteFood; end; 233 procedure TIntro . Execute; var ParamTalk : Integer; ParamListen : Integer; Toy : TToy; LastPresentation : Integer; Path : string; IntroPath : string; BedTimePath : string; BunnyPath : string; GrouchyPath : string; PeasPath : string; PlayPath : string; RunStoryPath : string; SillyPath : string; SongMenuPath : string; SongsPath : string; StoryMenuPath : string; PresentationPath : string; GamePrincessStatus : string; WaveSection : string; Sensorl : Integer; Sensor2 : Integer; Sensor3 : Integer; GetSensor : Integer; LoopCount : Integer; DTime : Integer; Beg mngPlay : Boolean; begin ( Place thread code here ) Toy = MainForm. Toy; Path = MainForm.AudioPath; IntroPath = Path+'Intro\ ' ; BedTimePath = Path+'BedTιme\'; BunnyPath = Path+'Bunny\ ' ; GrouchyPath = Path+'Grouchy\' ; PeasPath = Path+'Peas\ ' ; PlayPath = Path+'Play\'; RunStoryPath = Path+'RunStory\ ' ; SillyPath = Path+'Sιlly\' ; SongMenuPath = Path+'SongMenu\ ' ; SongsPath = Path+'Songs\ ' ; StoryMenuPath = Path+'StoryMenu\ ' ; 234 Presenta ionPath = Path+ ' Presentatιon\ ' ; LastPresentation = 0 ParamTalk = 0 LoopCount = 0 Sensorl = 0 Sensor2 = 0 Sensor3 = 0, DTime = 5, BegmmngPlay : = True; Synchronize (LoadDataFromDatabase) ; if GameStatus = 'Intro' then // /====• = How To Pla " begin IntroNextSection = -i; // UnPerform Intro Script PlayNextSection = -1; // UnPerform Play Script PrincessNextSection = -1; // UnPerform Princess Script TheStoryMenuNextSection = -1; // UnPerform TheStoryMenu Script RunStoryMenuNextSection = -1; // UnPerform RunStoryMenu Script BedTimeRitualNextSection = -1; // UnPerform BedTimeRitual Script GrouchyNextSection = -1; // UnPerform Grouchy Script BunnyNextSection = -1; // UnPerform Bunny Script Presen ationNextSection = -1; // UnPerform Presentation Demo Ver 1.0 end else begin //====== Play IntroNextSection = -1 // UnPerform Intro Script PlayNextSection = -1 // UnPerform Play Script PrincessNextSection = -1 // UnPerform Princess Script TheStoryMenuNextSection = -1 // UnPerform TheStoryMenu Script RunStoryMenuNextSection = -1. // UnPerform RunStoryMenu Script BedTimeRitualNextSection = -1 // UnPerform BedTimeRitual Script GrouchyNextSection = -1 // UnPerform Grouchy Script BunnyNextSection = -1 // UnPerform Bunny Script PresentationNextSection = 1; // Perform Presentation Demo Ver 1.0 end; StatusForm. StatusGauge. Progress := 0; while not Terminated do begin // Checking (if StatusForm. indowState = wsMinimized then 235 begin //Synchronize (ApplicationMinim ze) end; ) // ============= Presentation ================================== // write here all sessions /; ================================================================= case PresentationNextSection of 1 : begin PresentationNextSection := 5; end; 5 : begin ParamTalk := Toy. Talk (PresentatιonPath+' op002.wav' , 'S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 6; end; 6 : begin ParamListen := Toy.ListenActive ('', 180, ' Sensor ', 'W' ) ; if (ParamListen = FootSensor) or (ParamListen = NoseSensor) then PresentationNextSection := 10 else PresentationNextSection := 5; //PresentationNextSection := 10;//?? Delete this line end; 10 : begin Begin ngPlay := False; if Tιme< StrToTime ( '12:00:00' ) then PresentationNextSection := 15 else if Tιme> StrToTime (' 16: 00 : 00 ' ) then PresentationNextSection := 25 else PresentationNextSection := 20; end; 15 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' op015m. wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 35; end; 236 : begin ParamTalk := Toy . Talk ( PresentatιonPath+ Op020m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 35; end; : begin ParamTalk := Toy. Talk (PresentationPath+' op025m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 35; end; : begin SecretName := 'Rainbow'; ParamListen := Toy. Listen (' rainbow/2, bubble gum/3', 7, 'SR', 'W') ; case ParamListen of 2 : begin PresentationNextSection := 45; SecretName := 'Rainbow'; end; 3: begin PresentationNextSection := 50; SecretName := 'BubbleGum'; end; else PresentationNextSection := 36; end; Synchronize (UpdatePresentationBar) ; end; : begin ParamTalk := Toy. Talk (PresentationPath+' op036m.wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 55; end; : begin ParamTalk := Toy. Talk ( PresentatιonPath+ ' op045m.wav' , ' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 55; end; 237 50 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' op050m.wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 55; end; 55 : begin ParamListen := Toy. Listen (' story/1, game/2, song/3 ' , 7, 'SR', 'W') ; case ParamListen of 1: PresentationNextSection := 100; //story menu 2: PresentationNextSection := 800; //game menu 3: PresentationNextSection := 300; //song menu else PresentationNextSection := 60; end; Synchronize (UpdatePresentationBar) ; end; 60 : begin ParamTalk : = Toy. Talk ( PresentationPath+ ' op060. wav' , ' S# ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection : = 65 ; end; 65 : begin ParamListen := Toy. Listen (' story/1, game/2, song/3 ' , 7, 'SR', 'W' ) ; case ParamListen of 1: PresentationNextSection := 100; //story menu 2: PresentationNextSection := 800; //game menu 3: PresentationNextSection := 300; //song menu else PresentationNextSection := 100; end; Synchronize (UpdatePresentationBar) ; end; //story menu 100 : begin if VisitStoryMenu = 0 then PresentationNextSection := 125 else begin PresentationNextSection := 235; if VisitBunnyShort = 0 then 238 begin PresentationNextSection := 105; if SecretName = 'BubbleGum' then PresentationNextSection := 115; if SecretName = 'Rainbow' then PresentationNextSection := 110; end; if (VisitBunnyLong = 0) and (VisitBunnyShort <> 0) then PresentationNextSection := 206; if (VisitBunnyShort <> 0) and (VisitBunnyLong <> 0) then PresentationNextSection := 235; end; VisitStoryMenu := VisitStoryMenu +1; end; 110 : begin ParamTalk := Toy. Talk (PresentationPath÷' stmll0.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 200; end; 115 : begin ParamTalk := Toy. Talk (PresentatιonPath+' stmll5.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 200; end; 125 : begin ParamTalk := Toy .Talk (PresentatιonPath+' stml25m. wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 130; end; 130 : begin ParamTalk := Toy. Talk (PresentatιonPath+' stml30m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 135; end; 135 : begin ParamTalk := Toy.Talk ( PresentatιonPath+ ' stml35m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 140; 239 end; 140 : begin ParamTal := Toy. Talk ( PresentatιonPath+ ' stml40m.wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 145; end; 145 : begin ParamListen := Toy. Listen ('too hot/1, too cold/2, just right/3', DTime, 'SR', 'W'); case ParamListen of 1: PresentationNextSection := 150; 2: PresentationNextSection := 155; 3: PresentationNextSection := 160; else PresentationNextSection := 165; end; Synchronize (UpdatePresentationBar) ; end; 150 : begin ParamTalk := Toy. Talk(PresentatιonPath+ ' stml50.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 170; end; 155 : begin ParamTalk := Toy. Talk (PresentationPath÷ ' stml55.wav' ,' S ') ; Syncnromze (UpdatePresentationBar) ; PresentationNextSection := 170; end; 160 : begin ParamTalk := Toy. Talk(PresentatιonPath+ ' stml60.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 170; end; 165 : begin ParamTalk := Toy. Tal (PresentatιonPath+ ' stml65.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 170; end; 240 170 : begin ParamTalk := Toy .Tal ( resentatιonPath+ ' stml70.wav 1 , ' S# ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 175; end; 175 : begin ParamListen := Toy. Listen ( 'yes/1, no/2 ', DTime, 'SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 195; 2: PresentationNextSection := 225; else PresentationNextSection := 180; end; Synchronize (UpdatePresentationBar) ; end; 180 : begin ParamTalk := Toy. Talk (PresentatιonPath+' stml80.wav' , ' S *) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 185; end; 185 : begin ParamListen := Toy. Listen (' yes/1, no/2 ', DTime, ' SR 1 , 'W' ) ; case ParamListen of 1: PresentationNextSection := 195; 2: PresentationNextSection := 230; else PresentationNextSection := 230; end; Synchronize (UpdatePresentationBar) ; end; 195 : begin ParamTalk := Toy. Talk (PresentatιonPath+' stml95.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 200; end; 200 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' stm200.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3000; //bunny short 241 end; 205 : begin ParamTalk := Toy .Talk ( PresentatιonPath+ ' stm205m.wav' ,* S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 210; end; 206 : begin ParamTalk : = Toy. Talk ( PresentatιonPath+ ' stm206m. wav ' , ' S# ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection : = 210 ; end; 210 : begin ParamListen := Toy. Listen (' yes/1, no/2 *, DTime, ' SR' , 'W* ) ; case ParamListen of 1: PresentationNextSection := 2000;//bunny long 2: PresentationNextSection := 225; else PresentationNextSection := 215; end; Synchronize (UpdatePresentationBar) ; end; 215 : begin ParamTalk := Toy.Talk (PresentatιonPath+' stm215m.wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 220; end; 220 : begin ParamListen := Toy. Listen (' yes/1, no/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 2000; //bunny long 2: PresentationNextSection := 225; else PresentationNextSection := 225; end; Synchronize (UpdatePresentationBar) ; end; 225 : begin ParamTalk := Toy. Talk (PresentatιonPath+' stm225.wav' ,' S ' ) ; Synchronize (UpdatePresentationBar) ; 242 PresentationNextSection : = 230 ; end; 230 : begin ParamTalk : = Toy. Talk ( PresentatιonPath+ ' stm230n . wav ' , ' S# ' ) ; Synchronize (UpdatePresentationBar ) ; PresentationNextSection : = 240 ; end; 240 : begin ParamListen := Toy. Listen (' game/1, song/2, storyteller/3', DTime, 'SR', 'W') ; case ParamListen of 1: PresentationNextSection := 800; //game menu 2: PresentationNextSection := 300; //song menu 3: PresentationNextSection := 5000; //theme song else PresentationNextSection := 245; end; Synchronize (UpdatePresentationBar) ; end; 245 : begin ParamTalk := Toy. Talk (PresentatιonPath+' stm245n.wav' ,' S# ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 250; end; 250 : begin ParamListen := Toy. Listen ( 'game/1, song/2, storyteller/3' , DTime, 'SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 800; //game menu 2: PresentationNextSection := 300; //song menu 3: PresentationNextSection := 5000; //theme song else PresentationNextSection := 800; end; Synchronize (UpdatePresentationBar) ; end; // song menu 300 : begin Synchronize (UpdatePresentationBar) ; if VisitSongMenu = 0 then PresentationNextSection := 320 else 243 begin PresentationNextSection := 305; if SecretName = 'BubbleGum' then PresentationNextSection ■■ 315; if SecretName = 'Rainbow' then PresentationNextSection 310; end; VisitSongMenu := VisitSongMenu +1; end; 310 : begin ParamTalk := Toy. alk(PresentationPath+' sng310.wav' ,* S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 330; end; 315 : begin ParamTalk := Toy.Talk(PresentatιonPath+'sng315.wav' , ' S' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 330; end; 320 : begin ParamTalk := Toy.Talk(PresentationPath+'sng320.wav' , 'S' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 330; end; 330 : begin ParamTalk := Toy. Talk (PresentatιonPath+' sng_prog.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 370; end; 370 : begin ParamTalk := Toy. Talk (PresentatιonPath+' sng370.wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 375; end; 375 : begin ParamListen := Toy. isten (' yes/1, no/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 244 1: PresentationNextSection := 380; 2: PresentationNextSection := 395; else PresentationNextSection := 395; end; Synchronize (UpdatePresentationBar) ; end; 380 : begin ParamTalk := Toy. Talk (PresentatιonPath+' sng380m.wav' , 'S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 390; end; 390 : begin ParamTalk := Toy. alk (PresentatιonPath+' sng390.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 395; end; 395 : begin ParamTalk := Toy. Talk (PresentationPath+'sng395. wav' , 'S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 400; end; 400 : begin ParamListen := Toy. Listen ( "game/1, story/2, song/3' , DTime, 'SR', *W' ) ; case ParamListen of 1: PresentationNextSection := 800; //game menu 2: PresentationNextSection := 100; //story menu 3: PresentationNextSection := 410; else PresentationNextSection := 410; end; Synchronize (UpdatePresentationBar) ; end; 410 : begin ParamTalk := Toy. Talk (PresentatιonPath+' sng410m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 415; end; 245 415 : segin ParamTalk := Toy .Talk (PrεsentatιonPath+' sng415n.wav' ,' S# ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 420; end; 420 : begin ParamListen := Toy. Listen ( 'game/1, story/2, storyteller/3' , DTime, 'SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 800; //game menu 2: PresentationNextSection := 100; //story menu 3: PresentationNextSection := 5000; //theme song else PresentationNextSection := 425; end; Synchronize (UpdatePresentationBar) ; end; 425 : begin ParamTalk := Toy.Talk (PresentatιonPath+' sng425n.wav' , 'S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 430; end; 430 : begin ParamListen := Toy. Listen ( 'game/1, story/2, storyteller/3', DTime, 'SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 800; //game menu 2: PresentationNextSection := 100; //story menu 3: PresentationNextSection := 5000; //theme song else PresentationNextSection := 800; end; Synchronize (UpdatePresentationBar) ; end; //StandBy 699 : begin ParamListen := Toy. ListenActive (' continue/ 1, youre on/2, theme/3', 12, 'SR', 'W') ; case ParamListen of PresentationNextSection = LastPresentation; PresentationNextSection = 10; PresentationNextSection = 700; 246 else PresentationNextSection := 699; end; Synchronize (UpdatePresentationBar) ; end; 700 : begin //Speech before theme song ParamTalk := Toy. Talk (PresentatιonPath+' sb700.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 5000; end; // WakeUp 750 : begin ParamTalk := Toy. Talk (PresentatιonPath+' op005.wav' ,' S#' ) ; if ParamTalk = -2 then begin PresentationNextSection := 750; sleep (200) ; end else PresentationNextSection := 760; Synchronize (UpdatePresentationBar) ; end; 760 : begin ParamListen := Toy.ListenActive ( 'yes/1, no/2 ', 12, ' SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := LastPresentation; 2: PresentationNextSection := 10; else PresentationNextSection := LastPresentation; end; Synchronize (UpdatePresentationBar) ; end; // Geme Menu 800 : begin if VisitGameMenu = 0 then PresentationNextSection := 820 else begin PresentationNextSection := 805; if SecretName = 'BubbleGum' then PresentationNextSection := 815; if SecretName = 'Rainbow' then PresentationNextSection := 810; 247 end; VisitGameMenu := VisitGameMenu +1; end; 810 : begin ParamTalk := Toy .Talk (PresentatιonPath+ ' gπι810.wav' ,' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 841; end; 815 : begin ParamTalk := Toy.Talk(PresentatιonPath+'gm815.waV , 'S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 841; end; 820 : begin ParamTalk := Toy. Talk (PresentatιonPath+'gm820m. wav' ,* S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 967; end; 840 : begin ParamTalk := Toy. Talk (PresentatιonPath+'gm840.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 841; end; 841 : begin ParamTalk := Toy. Talk (PresentatιonPath+ 'gm841.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 845; end; 845 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm845.wav' ,' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 919; end; 847 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm847m.wav' ,' S ' ) ; 248 Synchronize (UpdatePresentationBar) ; PresentationNextSection := 850; LoopCount := 0; end; 850 : begin //sensors : 1-Nose 2-Hand 3-Foot ; 0-none ParamListen := Toy. Listen ('', DTime, 'Sensor ', 'W' ); //nose if ParamListen = NoseSensor then PresentationNextSection := 860 else PresentationNextSection := 855; Synchronize (UpdatePresentationBar) ; LoopCount := LoopCount +1; if (LoopCount = 3) and (PresentationNextSection = 855) then PresentationNextSection := 860; end; 855 : begin ParamTalk := Toy.Talk(PresentatιonPath+'gm855m.wav' , 'S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 850; end; 860 : begin ParamTalk := Toy.Talk(PresentatιonPath+'gm860.wav' , 'S' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 865; end; 865 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm865m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 870; LoopCount := 0; end; 870 : begin //sensors : 1-Nose 2-Hand 3-Foot ; 0-none ParamListen := Toy. Listen ('', DTime, ' Senso ', 'W' ); //foot if ParamListen = FootSensor then PresentationNextSection := 890 else PresentationNextSection := 875; Synchronize (UpdatePresentationBar) ; LoopCount := LoopCount +1; if (LoopCount = 3) and (PresentationNextSection = 875) then 249 PresentationNextSection := 890; end; 875 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm875m.wav 1 ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 870; end; 890 : begin ParamTalk := Toy. Talk (PresentatιonPath+'gm890.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 895; end; 895 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm895.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 900; LoopCount : = 0 ; end; 900 : begin //sensors : 1-Nose 2-Hand 3-Foot ; 0-none ParamListen := Toy. Listen ('', DTime, ' Sensor ', 'W' ); //hand if ParamListen = HandSensor then PresentationNextSection := 910 else PresentationNextSection := 905; Synchronize (UpdatePresentationBar) ; LoopCount := LoopCount +1; if (LoopCount = 3) and (PresentationNextSection = 905) then PresentationNextSection := 910; end; 905 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm905m.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 900; end; 910 : begin ParamTalk := Toy. Talk (PresentatιonPath+'gm910. av' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 915; 250 end; 915 : begin ParamTalk := Toy. Tal (PresentatιonPath+' gm915.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 920; Sensorl := 0; Sensor2 := 0; Sensor3 := 0; LoopCount : = 0 ; end; 919 : begin PresentationNextSection := 920; Sensorl := 0; Sensor2 := 0; Sensor3 := 0; LoopCount := 0; end; 920 : begin //sensors : 1-Nose 2-Hand 3-Foot ; 0-none LoopCount := LoopCount + 1; if (Sensorl = HandSensor) and (Sensor2 = NoseSensor) and (Sensor3 = FootSensor) then PresentationNextSection := 926 //success else begin PresentationNextSection := 920; // looping if LoopCount > 5 then // pressing not right begin PresentationNextSection := 924; //timeout if (Sensorl > 0) or (Sensor2 >0) or (Sensor3 >0) then PresentationNextSection := 925;//press not right end else begin GetSensor := Toy. Listen ('', DTime, ' Sensor ', 'W' ) ; if GetSensor > 0 then begin if GetSensor = NoseSensor then PresentationNextSection := 921; //nose 251 f GetSensor = HandSensor then PresentationNextSection := 923; //hand if GetSensor = FootSensor then PresentationNextSection := 922; //foot Sensorl := Sensor2; Sensor2 := Sensor3; Sensor3 := GetSensor; end; if (Sensorl = 0) and (Sensor2 = 0) and (Sensor3 = 0) //timeout and (LoopCount = 3) then PresentationNextSection := 925; end; end; end; 921 : begin ParamTalk := Toy. Talk(PresentationPath+' gm921.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 920; end; 922 : begin ParamTalk := Toy.Talk(PresentationPath+'gm922.wav' , 'S' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 920; end; 923 : begin ParamTalk := Toy. Talk ( PresentatιonPath+ ' gm923. av' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 920; end; 925 : begin ParamTalk := Toy.Talk(PresentationPath+'gm925.wav' , ' S' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 927; end; 926 : begin ParamTalk := To .Talk (PresentatιonPath+ ' gm926m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; 252 PresentationNextSection : = 1006 ; end; 927 : begin //sensors : 1-Nose 2-Hand 3-Foot ; 0-none PresentationNextSection := 928; Sensorl := Toy. Listen ('', 7, ' Sensor ', 'W' ) ; if Sensorl = HandSensor then Toy. Talk (PresentatιonPath+' gm910.wav' , 'S' ) ; if Sensorl = NoseSensor then Toy. Talk (PresentatιonPath+' gm860.wav' , 'S' ) ; if Sensorl = FootSensor then Toy. Talk (PresentatιonPath+' gm890.wav' , 'S' ) ; Sensor2 := Toy. Listen ('', 7, ' Sensor ', 'W' ) ; if Sensor2 = HandSensor then Toy.Talk (PresentatιonPath+' gm910.wav' , 'S' ) ; if Sensor2 = NoseSensor then Toy. Talk (PresentatιonPath+' gm860.wav' , 'S' ) ; if Sensor2 = FootSensor then Toy. Talk (PresentationPath+' gm890.wav' , 'S' ) ; Sensor3 := Toy. Listen ( • ', 7, ' Sensor ', 'W' ) ; if Sensor3 = HandSensor then Toy.Talk (PresentatιonPath+' gm910.wav' , 'S' ) ; if Sensor3 = NoseSensor then Toy.Talk(PresentatιonPath+'gm860.wav' , 'S' ) ; if Sensor3 = FootSensor then Toy.Talk (PresentatιonPath+' gm890.wav' , ' S ' ) ; if (Sensorl = HandSensor) and (Sensor2 = NoseSensor) and (Sensor3 = FootSensor) then PresentationNextSection := 926 else PresentationNextSection := 928; end; 928 : begin ParamTalk : = Toy . Talk ( PresentatιonPath+ ' gm928 . wav ' , ' S ' ) ; Synchronize (UpdatePresentationBar ) ; PresentationNextSection : = 1005 ; end; 932 : begin ParamTalk : = Toy . Talk ( PresentatιonPath+ ' gm932 . wav ' , ' S# ' ) ; Synchronize (UpdatePresentationBar) ; 253 PresentationNextSection : = 936 ; end; 933 : begin ParamTalk := Toy .Talk (PresentatιonPath+ ' gm933n.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 1006; end; 936 : begin ParamListen := Toy. Listen (' yes/1, no/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 840; 2: PresentationNextSection := 940; else PresentationNextSection := 940; end; Synchronize (UpdatePresentationBar) ; end; 940 : begin ParamTalk := Toy. Talk (PresentationPath+' gm940n.wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 941; LoopCount := 0; end; 941 : begin ParamListen := Toy. isten ( 'story/1, song/2, storyteller/3' , DTime, *SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 100; //story menu 2: PresentationNextSection := 300; //song menu 3: PresentationNextSection := 300; //theme song else PresentationNextSection := 945; end; Synchronize (UpdatePresentationBar) ; LoopCount := LoopCount +1; if (LoopCount = 3) and (PresentationNextSection = 945) then PresentationNextSection := 100; end; 945 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm940n.wav' ,' S#" ) ; 254 Synchronize (UpdatePresentationBar) ; PresentationNextSection := 941; end; 965 : begin ParamTalk := To .Talk ( PresentatιonPath+' gm965m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 970; end; 967 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gm967.wav' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 970; end; 970 : begin ParamTalk := Toy. Talk(PresentatιonPath+' gm970.wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 971; LoopCount := 0; end; 971 : begin ParamListen := Toy.Listen (' lollipop/1, peanut butter/2' ,7, 'SR' , 'W ) ; case ParamListen of 1: PresentationNextSection : = 975; 2: PresentationNextSection := 980; else PresentationNextSection := 972; end; LoopCount := LoopCount +1; if (LoopCount = 3) and (PresentationNextSection = 972) then PresentationNextSection := 984; Synchronize (UpdatePresentationBar) ; end; 972 : begin ParamTalk := Toy.Talk(PresentatιonPath+ ' gm972. av' , ' S# ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 971; end; 255 975 : begin ParamTalk := Toy .Tal (PresentatιonPath+ ' gm975.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 984; end; 980 : begin ParamTalk := Toy .Talk (PresentationPath+' gm980.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 984; end; 984 : begin ParamTalk := Toy.Talk(PresentationPath+'gm984.wav' , 'S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 983; LoopCount := 0; end; 983 : begin ParamListen := Toy. Listen (' rabbit/1, bear/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 985; 2: PresentationNextSection := 990; else PresentationNextSection := 982; end; LoopCount := LoopCount +1; if (LoopCount = 3) and (PresentationNextSection = 982) then PresentationNextSection := 1005; Synchronize (UpdatePresentationBar) ; end; 982 : begin ParamTalk := Toy .Tal (PresentationPath+" gm982.wav' , ' S# ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 983; end; 985 : begin ParamTalk := Toy .Talk ( PresentationPath÷ ' gm985m.wav' ,' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 932; end; 256 990 : begin ParamTalk := To . alk ( PresentatιonPath+ ' gm990. wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 932; if MainForm. ToyMachme = 'TeddyBear' then PresentationNextSection := 1005; end; 1005 : begin ParamTalk : = Toy . Talk ( PresentatιonPath+ ' gml005 . wav ' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection : = 1006 ; end; 1006 : begin ParamTalk := Toy. Talk (PresentatιonPath+' gml006.wav' ,' Ξ# ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 998; LoopCount := 0; end; 998 : begin ParamListen := Toy. Listen (' story/1, song/2, storyteller/3', DTime, 'SR', 'W' ) ; case ParamListen of 1: PresentationNextSection = 100; //story menu 2: PresentationNextSection = 300; //song menu 3: PresentationNextSection = 5000; //theme song else PresentationNextSection := 997; end; LoopCount := LoopCount +1; if (LoopCount = 3) and (PresentationNextSection = 997) then PresentationNextSection := 100; Syncnronize (UpdatePresentationBar) ; end; 997 : begin ParamTalk : = Toy . Talk ( PresentatιonPath+ ' gm997 . wav ' , ' S # ' ) ; Syncnronize ( UpdatePresentationBar ) ; Pres entationNextSection : = 998 ; end; 257 // Bunny Long ================================================= 2000 : begin Synchronize (UpdatePresentationBar) ; VisitBunnyLong := VisitBunnyLong + 1; PresentationNextSection := 2280; end; 2280 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' rb280m.wav' ,' E' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2285; end; 2285 : begin ParamTalk := Toy. Talk(PresentatιonPath+' rb286.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2286; end; 2286 : begin ParamTalk := Toy. alk (PresentatιonPath+' rb287.wav' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2290; end; 2290 : begin WaveSection :='rb2901'; if BunnyFavoriteFood = 'Honey' then WaveSection :='rb2901'; if BunnyFavoriteFood = 'Peanut' then WaveSection :='rb2902'; if BunnyFavoriteFood = 'Marshmallow' then WaveSection :='rb2903'; ParamTalk := Toy. Talk (PresentatιonPath+WaveSectιon+' .wav' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2295; end; 2295 : begin Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2296; end; 2296 : begin WaveSection :='rb2961'; if SecretName = ' BubbleGum' then WaveSection :='rb2961N'; 258 if SecretName = 'Ace' then WaveSection :='rb2962N'; if SecretName = 'RainBow' then WaveSection : = ' rb2963N ' ; ParamTalk := Toy. Talk (PresentatιonPath+WaveSectιon+' .wav' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2300; end; 2297 : begin ParamTalk := Toy. Talk(PresentatιonPath+' rb297m.wav' , 'E' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2300; end; 2300 : begin ParamTalk := Toy.Talk(PresentatιonPath+' rb300.wav' , • S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2305; end; 2305 : begin WaveSection :='rb3051'; if BunnyFavoriteFood = 'Honey' then WaveSection :='rb3051'; if BunnyFavoriteFood = 'Peanut' then WaveSection :='rb3052'; if BunnyFavoriteFood = 'Marshmallow' then WaveSection :='rb3053'; ParamTalk := Toy.Talk (PresentatιonPath+WaveSectιon+' .wav', 'S') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2315; end; 2315 : begin ParamTalk := Toy.Talk(PresentatιonPath+' rb315. av' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2320; end; 2316 : begin Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2320; end; 2320 : begin ParamTalk := Toy.Talk ( PresentatιonPath+ ' rb320.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; 259 PresentationNextSection := 2330; end; 2330 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' rb330.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2335; end; 2335 : begin ParamTalk := Toy. alk (PresentatιonPath+' rb336.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2336; end; 2336 : begin ParamTalk := Toy.Talk(PresentatιonPath+' rb337.wav' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2344; end; 2344 : begin ParamTalk := Toy. Talk(PresentatιonPath+' rb343.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2345; end; 2345 : begin ParamTalk := Toy . Talk ( PresentatιonPath+ ' rb344.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2346; end; 2346 : begin ParamTalk := Toy. alk (PresentatιonPath+' rb346m.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2350; end; 2350 : begin ParamTalk := Toy. alk (PresentatιonPath+' rb351.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2351; 260 end; 2351 : begin ParamTalk := Toy .Talk (PresentatιonPath+' rb352.wav' , • S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2355; end; 2355 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb356.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2356; end; 2356 : begin ParamTalk := Toy. Tal (PresentationPath÷' rb357.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2360; end; 2360 : begin ParamTalk := Toy .Talk (PresentatιonPath+' rb360.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2365; end; 2365 : begin //sensors : 1-Nose 2-Hand 3-Foot ; 0-none ParamListen := Toy. isten ('', DTime, ' Sensor ', 'W' ) ; case ParamListen of NoseSensor: PresentationNextSection := 2375; HandSensor: PresentationNextSection := 2370; FootSensor: PresentationNextSection := 2375; else PresentationNextSection := 2385; end; Synchronize (UpdatePresentationBar) ; end; 2370 : begin ParamTalk := Toy .Talk (PresentatιonPath+ ' rb370.wav' , ' S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2380; 261 end; 2375 : Degin ParamTalk := Toy .Talk (PresentatιonPath+ ' b375.wav 1 , ' S ' , Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2365; end; 2380 : begin //sensors : 1-Nose 2-Hand 3-Foot ; 0-none ParamListen := Toy. Listen ('', DTime, ' Sensor ', 'W' ) ; case ParamListen of NoseSensor: PresentationNextSection := 2385; HandSensor: PresentationNextSection := 2382; FootSensor: PresentationNextSection := 2385; else PresentationNextSection := 2385; end; Synchronize (UpdatePresentationBar) ; end; 2382 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb382.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2385; end; 2385 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' rb385.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2386; end; 2386 : begin ParamTalk := Toy. Talk (PresentationPath÷ ' b386.wav' , 'E' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2390; end; 2390 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb390.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2395; 262 end; 2395 : begin ParamTal := Toy. Talk (PresentatιonPath+' rb395m.wav' ,' S ') ; Synchronize (UpαatePresentationBar) ; PresentationNextSection := 2410; end; 2400 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb400m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2410; end; 2405 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb405m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2410; end; 2410 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb410m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2415; end; 2415 : begin WaveSection :='rb4151m'; if BunnyFavoriteFood = 'Honey' then WaveSection ='rb4151m' ; if BunnyFavoriteFood = 'Peanut' then WaveSection ='rb4152m' ; if BunnyFavoriteFood = 'Marshmallow' then WaveSection ='rb4153m' ; ParamTalk := Toy. Talk (PresentatιonPath+WaveSectιon+' .wav' , 'S' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2420; end; 2420 : begin WaveSection :='rb4201'; if BunnyFavoriteFood = 'Honey' then WaveSection :='rb4201'; if BunnyFavoriteFood = 'Peanut' then WaveSection :='rb4202'; 263 if BunnyFavor teFooα = ' Marsnmallow ' then WaveSection : = ' rb4203 ' ; ParamTalk : = Toy . Talk ( PresentatιonPath+WaveSectιon+ ' . wav ' , ' S ' ) ; Synchronize (UpdatePresentationBar ) ; PresentationNextSection : = 2425 ; end; 2425 : begin ParamTalk : = Toy. Talk ( PresentatιonPath+ ' rb425m. wav ' , * S ' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection : = 2426 ; end; 2426 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb426m.wav' , 'EL' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2435; end; 2435 : begin ParamTalk := Toy. Talk (PresentationPath÷' rb435m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2440; end; 2440 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb440.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 2445; end; 2445 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb445m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 245; end; // End of Bunny Long =============================================== // Bunny Short ================================================= 3000 : begin Syncnronize (UpdatePresentationBar) ; VisitBunnyShort := VisitBunnyShort + 1 ; PresentationNextSection := 3005; end; 264 3005 : begin ParamTalk := Toy.Tal ( PresentatιonPath+ ' rb3005m.wav ',' E' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3010; end; 3010 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' rb005m.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3015; end; 3015 : begin ParamListen := Toy. Listen ( 'honey/1, peanut butter/2, marshmallow fluff/3', 7, 'SR', 'W') ; case ParamListen of 1: PresentationNextSection := 3035; 2: PresentationNextSection := 3040; 3: PresentationNextSection := 3045; else PresentationNextSection := 3020; end; Synchronize (UpdatePresentationBar) ; end; 3020 : begin ParamTalk := Toy. Talk (PresentatιonPath+' b015.wav' ,' S# ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3025; end; 3025 : begin ParamListen := Toy. Listen ( 'honey/1, peanut butter/2, marshmallow fluff/3', DTime, 'SR', 'W') ; case ParamListen of 1: PresentationNextSection := 3035; 2: PresentationNextSection := 3040; 3: PresentationNextSection := 3045; else PresentationNextSection := 3030; end; Syncnronize (UpdatePresentationBar) ; end; 265 3030 : begin BunnyFavoriteFood := 'Honey'; ParamTalk := Toy .Tal ( PresentatιonPath+ ' rb026. wav" , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3035; end; 3035 : begin BunnyFavoriteFood := 'Honey'; ParamTalk := Toy. alk (PresentatιonPath+' rb0301.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3050; end; 3040 : begin BunnyFavoriteFood := 'Peanut'; ParamTalk := Toy. Talk (PresentatιonPath+' rb0302.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3050; end; 3045 : begin BunnyFavoriteFood := 'Marshmallow'; ParamTalk := Toy.Talk (PresentatιonPath+' b0303.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3050; end; 3050 : begin ParamTalk := Toy .Talk (PresentationPath÷ ' rb3050m.wav' ,' S ') ; PresentationNextSection := 3055; if BunnyFavoriteFood = 'Honey' then PresentationNextSection = 3055; if BunnyFavoriteFood = 'Peanut' then PresentationNextSection = 3060; if BunnyFavoriteFood = 'Marshmallow' then PresentationNextSection = 3065; Synchronize (UpdatePresentationBar) ; end; 3055 : begin ParamTalk := Toy .Talk ( PresentatιonPath+ ' rb3055.wav' ,' S ' ) ; Synchronize (UpdatePresentationBar) ; 266 PresentationNextSection := 3075; end; 3060 : begin ParamTalk := Toy .Talk (Presentat onPath+ ' rb3060.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3075; end; 3065 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb3065.wav' , 'S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3075; end; 3075 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb3075n.wav 1 ,* S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3080; end; 3080 : begin ParamTalk := Toy. Talk (PresentatιonPath+' bllO .wav' ,' S#' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3085; end; 3085 : begin ParamListen := Toy. Listen Cgιraffe/1, elephant/2, bunny/3 ',7, 'SR', 'W') ; case ParamListen of 1: PresentationNextSection := 3095; 2: PresentationNextSection := 3090; 3: PresentationNextSection := 3100; else PresentationNextSection := 3100; end; Synchronize (UpdatePresentationBar) ; end; 3090 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rbl20.wav' , ' S ' , Syncnronize (UpdatePresentationBar) ; PresentationNextSection := 3125; 267 enα; 3095 : begin ParamTalk := Toy. Talk ( PresentatιonPath+ ' rbl25.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3125; end; 3100 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rbl30.wav' , 'S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3125; end; 3125 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb220n.wav' , 'S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3135; end; 3135 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb231m.wav' , 'EL' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3140; end; 3140 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb235n.wav' , ' S# ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3145; end; 3145 : begin ParamListen := Toy. Listen ( 'bunnythree/1 ', DTime, ' SR' , 'W' ) ; case ParamListen of 1: PresentationNextSection := 3150; else PresentationNextSection := 3155; end; Synchronize (UpdatePresentationBar) ; end; 3150 : begin ParamTalk := Toy .Tal ( PresentatιonPath+ ' rb245.wav' ,' S ') ; 268 PresentationNextSection := 3160; if BunnyFavoriteFood = 'Honey' then PresentationNextSection = 3160; if BunnyFavoriteFood = 'Peanut' then PresentationNextSection = 3165; if BunnyFavoriteFood = 'Marshmallow' then PresentationNextSection = 3170; Synchronize (UpdatePresentationBar) ; end; 3155 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' rb3155.wav' , 'S' ) ; PresentationNextSection := 3160; if BunnyFavoriteFood = 'Honey' then PresentationNextSection = 3160; if BunnyFavoriteFood = 'Peanut' then PresentationNextSection = 3165; if BunnyFavoriteFood = 'Marshmallow' then PresentationNextSection = 3170; Synchronize (UpdatePresentationBar) ; end; 3160 : begin ParamTalk := Toy. Talk (PresentatιonPath+" rb3160.wav' , 'S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3180; end; 3165 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' b3165.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3185; end; 3170 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb3170.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3190; end; 3180 : begin ParamTalk := Toy .Talk (PresentatιonPath+ ' b2751.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; 269 PresentationNextSection := 3195; end; 3185 : begin ParamTalk := Toy. Talk (PresentatιonPath+ ' rb2752.wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3195; end; 3190 : begin ParamTalk := Toy. Talk (PresentatιonPath+' rb2753.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 3195; end; 3195 : begin ParamTalk := Toy .Talk (PresentatιonPath+ ' rb280m.wav' , 'E' ) ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 205; end; // Princess and The Pea ========================================== 4000 : begin VisitPrincess := Visitprincess + 1; PresentationNextSection := -1; PπncessNextSection := 1; end; 4010 : begin PresentationNextSection := 699; //go back from princess end; // End of Princess and The Pea ==================================== // Theme Song ==================================================== 5000 : begin PresentationNextSection := 5010; end; 5010 : begin ParamTalk := Toy .TalkAll (Path+' StoryTeller .wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 5020; 270 enα; 5020 : begin //ParamTalk := Toy. Talk (Path+ 'Alonel .wav' , ' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 5030; end; 5030 : begin //ParamTalk := To .TalkAll (Path+'All .wav* ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 5040; end; 5040 : begin //ParamTalk := Toy. Talk (Path+ 'Alone2.wav' ,' S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 5050; end; 5050 : begin //ParamTalk := Toy. TalkAll (Path+'All.wav' , 'S ') ; Synchronize (UpdatePresentationBar) ; PresentationNextSection := 5060; end; 5060 : begin //ParamTalk := Toy . Talk ( Path+ 'Alone3.wav' ,' S ') ; Syncnronize (UpdatePresentationBar) ; PresentationNextSection := 45; if SecretName = 'BubbleGum' then PresentationNextSection = 50 if SecretName = 'Ace' then PresentationNextSection = 40 if SecretName = 'Rainbow' then PresentationNextSection = 45 end; // End of Theme Song ============================================= //PAUSE 10000 : begin PresentationNextSection 10000; sleep(200) ; end; end; //End of Presentation 271 if (PresentationNextSection <> 699) and (PresentationNextSection <> 10000) and (PresentationNextSection <> 760) ana (PresentationNextSection <> 750) then LastPresentation := PresentationNextSection; (* // ============= I N T R O =================================== // write here all sessions // ================================================================= case IntroNextSection of 1 : begin //Toy.Waιt(12, 'W' ) ; {sleep (300) ; ParamTalk := Toy. alk (IntroPath÷ ' OOl . wav' , ' E' ) ; ParamListen := Toy. Listen ( ' yes/1, no, 2 ' , 1.5, ' SR and Sensor'); StatusForm. StatusGauge. Progress := IntroNextSectιon/4.5; } IntroNextSection := 5; end; 2 : begin (ParamTalk := Toy. Talk (IntroPath÷' inOla. wav' , 'E' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 3;) end; 3 : begin (ParamTalk := Toy. alk ( IntroPath+ ' inOlb . wav' , ' EL' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 5;) end; 4 : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 5;) end; 5 : begin ParamTalk := Toy. Talk ( IntroPath+ ' Ol . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 10; 272 : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 7;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 8;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 9;) end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 10;) end; : begin ParamTalk := Toy. alk (IntroPath+ ' ιn02m. wav 1 , ' SP1 ' ) ; Syncnronize (UpdatelntroBar) ; IntroNextSection := 21; if SecretName = 'Bubble gum' then IntroNextSection := 21 if SecretName = 'Ace' then IntroNextSection := 22 if SecretName = 'Rainbow' then IntroNextSection := 23 end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 12 ; ) end; : begin (sleeD(300) ; 273 Synchronize (UpdatelntroBar) ; IntroNextSection := 13;} enα; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 14;) end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 15;) end; : begin (ParamTalk := Toy. Talk (IntroPath+' in02b . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 16;) end; : begin (ParamTalk := Toy. Talk (IntroPath+' in02c.wav' , 'E' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 20;) end; : oegin (ParamTalk := Toy. Talk ( IntroPath+' in02c.wav' , 'E' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 18;} end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 19;} end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; 274 IntroNextSection : = 20 ; end; : begin (ParamTalk := Toy. Talk (IntroPath+ ' in02. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 21; if SecretName = ' 3ubble gum' then IntroNextSection = 21 if SecretName = 'Ace' then IntroNextSection = 22 if SecretName = 'Rainbow' then IntroNextSection = 23 end; : begin ParamTalk := Toy. Talk (IntroPath+ ' in03. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 30; end; : begin ParamTalk := Toy. Talk (IntroPath+* in03a.wav* ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 30; end; : begin ParamTalk := Toy. Talk (IntroPath+' in03b.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 30; end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 25;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 26;) end; : begin 275 (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 27;) end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 28;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 29;} end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 30; ) end; : begin ParamTalk := Toy. Talk ( IntroPath+ ' in04. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 35; end; : begin (ParamTalk := Toy. Talk ( IntroPath+ ' in04a . av' , 'EL ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 35;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 33;} end; : begin (sleep(300) ; 276 Synchronize (UpdatelntroBar) ; IntroNextSection := 34;} end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 35;) end; : begin ParamTalk := Toy. Talk ( IntroPath+ ' 05m.wav' ,' SP2 ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 45; end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 37;) end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 38;) end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 39;} end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 40;) end; : begin (ParamTalk := Toy. Talk (IntroPath+' ιn05. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; 277 IntroNextSection := 45;} end; : begin {sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 42;) end; : begin {sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 43;} end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 44;} end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 45;) end; : begin ParamTalk := Toy. Talk (IntroPath+' in06.wav' ,' S ') ; Syncnronize (UpdatelntroBar) ; IntroNextSection := 50; end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 47;) end; : begin (sleep(300) ; Syncnronize (UpdatelntroBar) ; IntroNextSection := 48;} 278 enα; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 49;} end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 50;) end; : begin ParamTalk := Toy. Talk ( IntroPath+ ' ιn07. wav' , ' S ' Synchronize (UpdatelntroBar) ; IntroNextSection := 55; end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 52;} end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 53;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 54;} end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 55;} end; 279 : begin ParamListen := Toy .Wait (12, 'W' ) ; if ParamListen = 1 then IntroNextSection := 60 else IntroNextSection := 65; Synchronize (UpdatelntroBar) ; end; : begin {sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 57;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 58;) end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 59;) end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 60;} end; : begin ParamTalk := Toy. Talk (IntroPath+' ιn09. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 67; end; : begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 62;) end; 280 : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 63;} end; : begin {sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 64;} end; : begin (sleep(300) ; Synchronize (UpdatelntroBar ) ; IntroNextSection := 65;} end; : begin ParamTalk := Toy. Talk (IntroPath+'inlO. wav' , ' S * ) ; if ParamTalk = 1 then IntroNextSection := 60 else IntroNextSection := 66; Synchronize (UpdatelntroBar) ; end; : begin ParamListen := Toy. Wait (12, 'W' ) ; if ParamListen = 1 then IntroNextSection := 60 else IntroNextSection := 67; Synchronize (UpdatelntroBar) ; end; : begin ParamTalk := Toy. Talk (IntroPath+ '****** .wav' , ' S ' ) Synchronize (UpdatelntroBar) ; IntroNextSection := 70; end; : begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 69;} 281 end; 69: begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 70;} end; 70: begin ParamTalk := Toy. Talk (IntroPath+ ' lOb . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 71; if SecretName = 'Bubble gum' then IntroNextSection := 71 if SecretName = 'Ace' then IntroNextSection := 72 if SecretName = 'Rainbow' then IntroNextSection := 73 end; 71: begin ParamTalk := Toy. Talk (IntroPath+* mil . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 80; end; 72: begin ParamTalk := Toy. Talk (IntroPath+ τ lla. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 80; end; 73: begin ParamTalk := Toy. Talk (IntroPath+ ' nllb.wav' , ' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 80; end; 74: begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 75;) end; 75: begin {sleeo(300) , 282 Synchronize ( UpdatelntroBar ) ; IntroNextSection : = 76 ; ) end; 76 : begin ( sleep ( 300 ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 77;) end; 77: begin {sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 78;) end; 78: begin {sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 79;) end; 79: begin (sleep (300) ; Synchronize (UpdatelntroBar ) ; IntroNextSection : = 80 ; ) end; 80 : begin ParamTalk := Toy. Talk ( IntroPath+' llm. wav' , ' S ' ) ; Syncnronize (UpdatelntroBar) ; IntroNextSection := 85; end; 81: begin {ParamTalk := Toy. Talk ( IntroPath+ ' ml2. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 85;) end; 82: begin (sleep(300) ; Synchronize (UpdatelntroBar) ; 283 IntroNextSection := 33;} enα; 83: begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 84;} end; 84: begin {sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 85;) end; 85: begin ParamTalk := Toy. Talk ( IntroPath+' ιnl2. av' , ' EL ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 86; end; 86: begin ParamTalk := Toy. Talk (IntroPath+'ιnl2b. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 90; end; 87: begin (sleep (300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 88;) end; 88: begin (sleep(300) ; Syncnronize (UpdatelntroBar) ; IntroNextSection := 89;) end; 89: begin (sleep(300) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 90;) 284 enα; 90: begin ParamTalk := Toy. Talk ( IntroPath+ ' ιnl3. av' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 95; end; 95: begin ParamTalk := Toy. Talk (IntroPath+' l3a.wav' ,' S ') ; //randomize WAVE Synchronize (UpdatelntroBar) ; IntroNextSection := 100; end; 100: begin ParamTalk := Toy. Talk (IntroPath+ ' ιnl . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 110; end; 110: begin ParamListen := Toy. Wait (12, *W' ) ; if ParamListen = 3 then IntroNextSection := 120 else IntroNextSection := 115; Synchronize (UpdatelntroBar) ; end; 115: begin ParamTalk := Toy. Talk ( IntroPath+ ' ιnl4a . av' , ' S ' ) ; if ParamTalk = 3 then IntroNextSection := 120 else IntroNextSection := 116; Synchronize (UpdatelntroBar) ; end; 116: begin ParamListen : = Toy . Wait ( 12, 'W' ) ; if ParamListen = 3 then IntroNextSection := 120 else IntroNextSection := 145; Synchronize (UpdatelntroBar) ; end; 120: begin 285 ParamTalk := Toy. alk ( IntroPath+ ' ιnl3a . wav' ,' s '); //randomize WAVE Synchronize (UpdatelntroBar) ; IntroNextSection := 145; end; 145: begin ParamTalk := Toy. Talk (IntroPath+' l5. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 155; end; 155: begin ParamTalk := Toy. Talk (IntroPath÷' lδ.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 160; if SecretName = 'Bubble gum' then IntroNextSection := 160 if SecretName = 'Ace' then IntroNextSection := 161 if SecretName = 'Rainbow' then IntroNextSection := 162 end; 160: begin ParamTalk := Toy. Talk (IntroPath+' ιnl7. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 164; end; 161: begin ParamTalk := Toy. Talk ( IntroPath+ ' l7a . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 164; end; 162: begin ParamTalk := Toy. Talk (IntroPath+' l7b.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 164; end; 164: begin ParamTalk := Toy. Talk { IntroPath+' ιnl8. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 165; 286 end; 165: begin ParamTalk := Toy. Talk ( IntroPath÷ ' SP l65. wav' , ' SP3 ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 175; end; 166: begin (ParamTalk := Toy. Talk (IntroPath+ ' ιn20. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 167;) end; 167: begin (ParamTalk := Toy. Talk (IntroPath+ ' inbeep.wav' , 'EL' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 168;} end; 168: begin {ParamTalk := Toy. Talk (IntroPath+ ' ιnl9. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 169;} end; 169: begin (ParamTalk := Toy. Talk (IntroPath+ ' blerp . wav' , 'EC ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 170;} end; 170: begin {ParamTalk := Toy. Talk (IntroPath+ ' ιn21. wav + *+IntroPath+' m22.wav', ' S' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 171;} end; 171: begin {ParamTalk := Toy. Talk (IntroPath+ ' boop . wav' , ' E' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 172; } 287 end; 172: begin (ParamTalk := Toy. Talk (IntroPath+' in26.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 175;} end; 173: begin (ParamTalk := Toy. Talk (IntroPath+' in23.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 175;) end; 175: begin ParamListen := Toy. Wait (12, 'W' ) ; if ParamListen = 1 then IntroNextSection := 180 else IntroNextSection := 185; Synchronize (UpdatelntroBar) ; end; 180: begin ParamTalk := Toy. Talk (IntroPath+'in24. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 195; end; 181: begin (ParamTalk := Toy. Talk (IntroPath+' inbeep.wav' ,* EL' ) ; //****- check??? if ParamTalk = 2 then IntroNextSection := 185 else IntroNextSection := 182; Synchronize (UpdatelntroBar) ; } end; 182: begin (ParamTalk := Toy. Talk ( IntroPath+ ' in25b.wav' ,' S '); //***** check??? if ParamTalk = 2 then IntroNextSection := 185 else IntroNextSection := 184; Synchronize (UpdatelntroBar) ; ) end; 288 184: begin (ParamListen := Toy. isten ('', 10, ' Sensor ') ; if ParamListen = 2 then IntroNextSection := 185 else IntroNextSection := 190; Synchronize (UpdatelntroBar) ; ) end; 185: begin ParamTalk := Toy. Talk (IntroPath+ ' SPml85. wav' , ' SP4 ' ) ; if ParamTalk = 1 then IntroNextSection := 180 else IntroNextSection : = 190; Synchronize (UpdatelntroBar) ; end; 186: begin (ParamTalk := Toy. Talk ( IntroPath÷ ' inboop . wav' , 'E' ) ; if ParamTalk = 1 then IntroNextSection := 180 else IntroNextSection := 187; Synchronize (UpdatelntroBar) ; ) end; 187: begin {ParamTalk := Toy. Talk (IntroPath+' m29b.wav* ,' S ') ; if ParamTalk = 1 then IntroNextSection := 180 else IntroNextSection := 190; Synchronize (UpdatelntroBar) ; ) end; 190: begin ParamListen := Toy. Wait ( 12, 'W' ) ; if ParamListen = 1 then IntroNextSection := 180 else IntroNextSection := 195; Synchronize (UpdatelntroBar) ; end; 195: begin ParamTalk := Toy. Talk (IntroPath÷' SPml95. wav' , ' SP5 ' ) ; Syncnronize (UpdatelntroBar) ; IntroNextSection := 197; end; 196: begin {ParamTalk := Toy. Talk (IntroPath+ ' 23. wav' , ' S ' ) ; 289 Synchronize (UpdatelntroBar ) ; IntroNextSection : = 197 ; } end; 197 : begin ParamListen : = Toy. ait ( 12, 'W' ) ; if ParamListen = 2 then IntroNextSection := 200 else IntroNextSection := 205; Syncnronize (UpdatelntroBar) ; end; 200: begin ParamTalk := Toy. Talk (IntroPath+ ' ιn33. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 215; end; 205: begin ParamTalk := Toy. Talk (IntroPath÷ ' SPιn205. wav' , ' SP6' ) ; if ParamTalk = 2 then IntroNextSection := 200 else IntroNextSection := 210; Synchronize (UpdatelntroBar) ; end; 206: begin {ParamTalk := Toy. Talk (IntroPath 4 - ' inbeep .wav' ,* S ') ; if ParamTalk = 2 then IntroNextSection := 200 else IntroNextSection := 207; Synchronize (UpdatelntroBar) ; } end; 207: begin {ParamTalk := Toy. Talk (IntroPath+' 34b.wav' ,' S ') ; if ParamTalk = 2 then IntroNextSection := 200 else IntroNextSection := 210; Synchronize (UpdatelntroBar) ; ) end; 210: begin ParamListen := Toy. Wait (12, 'W' ) ; if ParamListen = 2 then IntroNextSection := 200 else IntroNextSection := 215; Synchronize (UpdatelntroBar) ; 290 end; 215: begin ParamTalk := Toy. Talk (IntroPath÷ ' SPm215. wav' , • SP7 ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 217; enα; 216: begin (ParamTalk := Toy. Talk (IntroPath+ ' ιn30. wav' , ' S ' ) ; Synchronize (UpdatelntroBar ) ; IntroNextSection := 217;} end; 217: begin ParamListen : = Toy. ait (12, ' ' ) ; if ParamListen = 3 then IntroNextSection := 220 else IntroNextSection := 221; Synchronize (UpdatelntroBar) ; end; 220: begin ParamTalk := Toy. Talk (IntroPath+' in36.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 230; end; 221: negin ParamTalk := Toy. Talk ( IntroPath+' SPιn221. wav ' , ' SP8 ' ) ; if ParamTalk = 3 then IntroNextSection := 220 else IntroNextSection := 224; Synchronize (UpdatelntroBar) ; end; 222: begin {ParamTalk := Toy. Talk (IntroPath+ ' inblerp.wav' , ' EC ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 90;) end; 223: begin {ParamTalk := Toy. Talk (IntroPath+' in37b.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; 291 IntroNextSection := 190;) end; 224: begin ParamTalk := Toy .Wait ( 12, 'W' ) ; if ParamTalk = 3 then IntroNextSection := 220 else IntroNextSection := 230; Synchronize (UpdatelntroBar) ; end; 230: begin ParamTalk := Toy. Talk ( IntroPath+ ' ιn38. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 235; end; 235: begin ParamTalk := Toy. Talk (IntroPath+ ' SPιn235.wav' , * SP9 ' ) ; if ParamTalk = 1 then IntroNextSection := 250 else IntroNextSection := 241; Synchronize (UpdatelntroBar) ; end; 241: begin ParamTalk := Toy. Talk (IntroPath+' ιn40a . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 242; end; 242: begin ParamTalk := Toy.Talk (IntroPath+ ' SPιn242. wav' , ' SP10 ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 248; end; 243: begin (ParamTalk := Toy. Talk ( IntroPath+ * l2b . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 90;) end; 244: begin (ParamTalk •= Toy. Talk (IntroPath+ ' ιnl2b . wav' , ' S ' ) ; 292 Synchronize (UpdatelntroBar; ; IntroNextSection := 90; ) end; 245: begin (ParamTalk := Toy. Talk ( IntroPath+ ' l2b.wav' , ' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 90;) end; 246: begin (ParamTalk := Toy. Talk (IntroPath+' ml2b.wav' , ' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 90;} end; 247: cegin (ParamTalk := Toy. Talk (IntroPath+ ' ιn24. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 190;} end; 248: begin ParamTalk := Toy. Talk ( IntroPath+' SPm235. wav' , ' SP9 ' ) ; if ParamTalk = 1 then IntroNextSection := 250 else IntroNextSection := 270; Synchronize (UpdatelntroBar) ; end; 250: begin ParamTalk := Toy. Talk (IntroPath+' 39.wav' , ' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 265; end; 265: begin ParamTalk := Toy. Talk ( IntroPath+ ' 41. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 270; end; 270: begin ParamTalk := Toy. Talk ( IntroPath+ ' 41m.wav' ,' EL ') ; 293 Synchronize (UpdatelntroBar) ; IntroNextSection := 275; end; 275: begin ParamTalk := Toy. Talk (IntroPath+'ιn44. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 295; end; 276: begin (ParamTalk := Toy. Talk (IntroPath+' 44c.wav' , 'E' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 277;} end; 277: begin (ParamTalk := Toy. Talk (IntroPath+' in44b.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 285;) end; 285: begin (ParamTalk := Toy. alk ( ' ' , ' EC ) ; // sleep(lOOO) wait 1 sec ??? Synchronize (UpdatelntroBar) ; IntroNextSection := 300;) end; 290: begin {ParamTalk := Toy. Talk (IntroPath+ ' l2b.wav' ,' S ') ; //?????? Synchronize (UpdatelntroBar) ; IntroNextSection := 90;) end; 295: begin ParamTalk := Toy. Talk (IntroPath+ ' 49. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 300; end; 300: begin 294 ParamTalk := Toy. Talk (IntroPath+ ' m50. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 305; end; 305: begin ParamListen := Toy. Listen ('too hot/7 ', 12, ' SR' , 'W' ) ; if ParamListen = 7 then IntroNextSection := 315 else IntroNextSection := 310; Synchronize (UpdatelntroBar) ; end; 310: begin ParamTalk := Toy. Talk ( IntroPath÷ ' in52. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 311; end; 311: begin ParamListen := Toy. Listen (' too hot/7 ', 12, ' SR' , 'W* ) ; if ParamListen = 7 then IntroNextSection := 315 else IntroNextSection := 320; Synchronize (UpdatelntroBar) ; end; 315: begin ParamTalk := Toy. Talk (IntroPath+ ' in52m.wav' , 'EL' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 316; end; 316: begin ParamTalk := Toy. Talk (IntroPath+' in51.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 320; end; 320: begin ParamTalk := Toy. Talk ( IntroPath+ ' in53. wa ' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 325; end; 295 325: oegm ParamListen := Toy. isten ('too cold/7 ', 12, ' SR' , 'W' ) ; if ParamListen = 7 then IntroNextSection := 335 else IntroNextSection := 331; Synchronize (UpdatelntroBar) ; end; 330: begin ParamTalk := Toy. Talk (IntroPath+' in55. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 331; end; 331: begin ParamListen := Toy. Listen ('too cold/7 ', 12, ' SR' , 'W' ) ; if ParamListen = 7 then IntroNextSection := 335 else IntroNextSection := 340; Synchronize (UpdatelntroBar) ; end; 335: begin ParamTalk := Toy. Talk (IntroPath+ ' in55m.wav' ,' E' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 336; end; 336: begin ParamTalk := Toy. Talk (IntroPath÷ ' in54. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 340; end; 340: begin ParamTalk := Toy. Talk (IntroPath+' m56.wav' , ' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 345; end; 345: begin ParamListen := Toy. Listen ('just nght/7 ' , 12, * SR' , 'W' ) ; if ParamListen = 7 then IntroNextSection := 355 else IntroNextSection := 350; Synchronize (UpdatelntroBar) ; 296 end; 350: begin ParamTalk := Toy. Talk (IntroPath+ ' 58. av' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 351; end; 351: begin ParamListen := Toy. Listen (' ust right/7 ' , 12, ' SR' , ' W' ) ; if ParamListen = 7 then IntroNextSection := 355 else IntroNextSection := 360; Synchronize (UpdatelntroBar) ; end; 355: begin ParamTalk := Toy. Talk (IntroPath+ ' 58m.wav' ,' EL' ) ; Synchroniz (UpdatelntroBar) ; IntroNextSection := 356; end; 356: begin ParamTalk := Toy. Talk (IntroPath+ ' m57. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 360; end; 360: begin ParamTalk := Toy. Talk (IntroPath+ ' 59.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 365; end; 365: begin ParamListen := Toy. Listen ( 'bears/7 ', 12, ' SR' , 'W' ) ; if ParamListen = 7 then IntroNextSection := 370 else IntroNextSection := 371; Synchronize (UpdatelntroBar) ; end; 370: begin ParamTalk := Toy. Talk (IntroPath+ ' in60.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; 297 IntroNextSection := 375; end; 371: begin ParamTalk := Toy. Talk ( IntroPath+ ' inδOa . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection : = 375; end; 375: begin ParamTalk := Toy. Talk (IntroPath+' inδlm.wav' ,' SP11 ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 385; end; 380: begin (ParamTalk := Toy. Talk ( IntroPath+ ' in61. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 385;) end; 385: begin ParamListen := Toy. Listen ('too hot/1, too cold/2, just right/3', 12, 'SR', 'W') ; case ParamListen of IntroNextSection = 390 IntroNextSection = 400 IntroNextSection = 405 else IntroNextSection := 410; end; Synchronize (UpdatelntroBar) ; end; 390: begin ParamTalk := Toy. alk ( IntroPath+ ' ιn62. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 415; end; 400: begin ParamTalk := Toy. Talk (IntroPath+' m63.wav' ,' S ') ; Synchronize (UpdatelntroBar ) ; IntroNextSection := 415; 298 enα; 405: begin ParamTalK := Toy. Talk (IntroPath+ ' m64. av' , ' S * ) ; Syncnronize 'UpdatelntroBar) ; IntroNextSection := 415; end; 410: begin ParamTalk := Toy. Talk ( IntroPath+ ' 62. wav + +IntroPath+' m63. wav + ' +IntroPath+' m64.wav + ' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 411; end; 411: begin ParamTalk := Toy. Talk ( IntroPath+ ' m67m.wav' , ' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 415; end; 415: begin ParamTalk := Toy. Talk (IntroPath+' ιn68. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 416; end; 416: begin ParamListen := Toy. Wait ( 12, ' W' ) ; if ParamListen = 3 then IntroNextSection := 419 else IntroNextSection := 417; Synchronize (UpdatelntroBar) ; end; 417: begin ParamTalk := Toy. alk (IntroPath÷ ' in68a.wav' ,' S • ) ; if ParamTalk = 3 then IntroNextSection := 419 else IntroNextSection := 418; Synchronize (UpdatelntroBar) ; end; 418: begin 299 ParamListen : = Toy . Wait ( 12 , 'W* ) ; if ParamListen = 3 then IntroNextSection := 419 else IntroNextSection := 420; Synchronize (UpdatelntroBar) ; end; 419: begin ParamTalk := Toy. Talk ( IntroPath+ ' in??? . wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 420; end; 420: begin ParamTalk := Toy. Talk ( IntroPath+ ' m68m. av' , ' E' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 425; end; 425: begin ParamTalk := Toy. Talk (IntroPath+* 69.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := 430; end; 430: begin if (Time < StrToTime ( '20:00:00' ) ) and (Time > StrToTime ( '5:00:00') ) then IntroNextSection := 435 else IntroNextSection := 440; Synchronize (UpdatelntroBar) ; end; 435: begin ParamTalk := Toy. Talk ( IntroPath+ ' 70. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 436; end; 436: begin ParamTalk := Toy. Talk ( IntroPath+ ' in70m.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := -1; //Goto Story : AnyTime Story PlayNextSection := 1; 300 enα; 440: begin ParamTalk := Toy. Talk ( IntroPath+ ' ιn71. wav' , ' S ' ) ; Synchronize (UpdatelntroBar) ; IntroNextSection := 441; end; 441: begin ParamTalk := Toy. Talk ( IntroPath+ ' in71m.wav' ,' S ') ; Synchronize (UpdatelntroBar) ; IntroNextSection := -1; PlayNextSection := -1; //Goto Menu : Bed Time Story end; end; // end of Intro sesions // write here all Play sessions / ========================================== case PlayNextSection of 1 : begin (sleep(300) ; ParamTalk := Toy. Talk (PlayPath+' inOOl . wav' , ' E' ) ; ParamListen := Toy. Listen ( ' yes/1, no, 2 ' , 1.5, ' SR and Sensor'); ) PlayNextSection := 2; end; 2 : begin ParamTalk := Toy. Talk (PlayPath+' Ola.wav' ,' E' ) ; Synchronize (UpdatePlayBar) ; PlayNextSection := 3; end; 3 : begin ParamTalk := Toy. Talk (PlayPath+' mOlb. wav' , 'EL' ) ; Synchronize (UpdatePlayBar) ; PlayNextSection := 5; end; 301 : begin {sleep (300) ; PlayNextSection := 5; end; : begin ParamTalk := Toy. Talk (PlayPath÷ • Ol . av' , ' S ' ) ; Synchronize (UpdatePlayBar) ; PlayNextSection := -1; end; {else begin Terminate; Exit; end; } end; // end of Play sesions *) // ============= The Princess and the Pea // write here all sessions // ======================================== case PrmcessNextSection of 1 : begin GamePπncessStatus := 'Princess';// Default is "Princess" PrincessNextSection := 5; end; 5 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp005. av' , ' S ' ) ; Synchronize (UpdatePr cessBar) ; Pr cessNextSection := 10; end; 10 : begin ParamListen := Toy. Listen ( 'boy/1, girl/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 302 1 : PrmcessNextSection := 30 2 : PrmcessNextSection := 35 else PrmcessNextSection := 15 end; Synchronize (UpαatePπncessBar ) ; end; : begin ParamTalk := Toy. Talk (PeasPath÷ 'pp020. wav' , ' S ' ) ; Synchronize (UpdatePπncessBar ) ; PrmcessNextSection := 20; end; : begin ParamListen := To . isten (' boy/1, girl/2 *, DTime, ' SR' , 'W' ) ; case ParamListen of 1 : PrmcessNextSection := 30 2 : PrmcessNextSection := 35 else PrmcessNextSection := 25 end; Synchronize (UpdatePnncessBar) ; end; : begin ParamTalk := Toy. Talk (PeasPath+'pp025. wav' , * S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 40; end; : begin GamePrincessStatus := 'Prince';// Story is for a "Prince" ParamTalk := Toy. Talk ( PeasPath+ ' pp030. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 31; end; : begin ParamTalk := Toy. Talk ( PeasPath+'pp031. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 37; end; 303 35 : Degin ParamTalk := Toy. Talk ( PeasPath+ ' pp035. wav' , ' S ' ) Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 36; end; 36 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp036. wav' , ' S ' ) , Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 37; end; 37 : begin if GamePπncessStatus = 'Prince' then PrmcessNextSection := 40 else Pr cessNextSection := 100; Synchronize (UpdatePnncessBar) ; end; 40 : begin ParamTalk := Toy. Talk (PeasPath+'pp040m. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 45; end; 45 : begin ParamTalk := Toy. Talk ( PeasPath+'pp045. wav' , ' S ' ) ; PrmcessNextSection := 50; if FavoriteColor = 'Red' then PrmcessNextSection = 50 if FavoriteColor = 'Blue' then PrmcessNextSection = 55 if FavoriteColor = 'Yellow' then PrmcessNextSection = 60 Synchronize (UpdatePnncessBar) ; end; 50 begin ParamTalk := Toy. Talk (PeasPath+'pp050. wav' , * S ' ) ; PrmcessNextSection := 65; if FavoriteFood = 'Pizza' then PrmcessNextSection := 65; if FavoriteFood = ' FrenchFries ' then PrmcessNextSection : = ; if FavoriteFood = 'MacaroniAndCheese' then PrmcessNextSection 75; 304 Syncnronize (UpdatePnncessBar) ; end; 55 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp055. wav' , ' S ' ) ; PrmcessNextSection := 65; if FavoriteFood = 'Pizza' then PrmcessNextSection := 65; if FavoriteFood = ' FrencnFπes ' then PrmcessNextSection : = 70; if FavoriteFood = 'MacaroniAndCheese' then Pr cessNextSection 75; Synchronize (UpdatePnncessBar) ; end; 60 : begin ParamTalk := Toy. Talk (PeasPath+ 'ppOδO . wav' , ' S ' ) ; PrmcessNextSection := 65; if FavoriteFood = 'Pizza' then PrmcessNextSection := 65; if FavoriteFood = ' FrenchFries ' then PrmcessNextSection := 70; f FavoriteFood = 'MacaroniAndCheese' then PrmcessNextSection := 75; Synchronize (UpdatePnncessBar) ; end; 65 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp065. wav' , ' S ' ) ; PrmcessNextSection := 80; if FavoriteActivity = 'Drawing' then PrmcessNextSection 80; if FavoriteActivity = ' PlayingComputerGames ' then PrmcessNextSection := 85; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection 90; Synchronize (UpdatePnncessBar) ; end; 70 : begin ParamTalk := Toy. Talk (PeasPath+'pp070. wav' , ' S ' ) ; PrmcessNextSection := 80; if FavoriteActivity = 'Drawing' then PrmcessNextSection 0; 305 if FavoriteActivity = ' PlaymgComputerGames ' then PrmcessNextSection : = 85 ; if FavoriteActivity = ' MakeBelieve ' then PrmcessNextSection : = 90 ; Synchronize ( UpdatePnnces sBar ) ; end; 75 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp075. wav' , ' S ' ) ; PrmcessNextSection := 80; if FavoriteActivity = 'Drawing' then PrmcessNextSection : = 80; if FavoriteActivity = 'PlaymgComputerGames' then PrmcessNextSection := 85; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection := 90; Synchronize (UpdatePnncessBar) ; end; 80 : begin ParamTalk := Toy. Talk (PeasPath+'pp080. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 95; end; 85 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp085.wav' ,' Ξ ') ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 95; end; 90 : begin ParamTalk : = Toy. Talk ( PeasPath+ ' pp090 . wav ' , ' S ' ) ; Syncnronize (UpdatePnncessBar ) ; PrmcessNextSection : = 95 ; end; 95 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp095. wav' , ' S * ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 165; end; 306 100 : begin ParamTalK := Toy. alk ( PeasPath+ ' pplOO . wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; Pr cessNextSection := 105; end; 105 : begin ParamTalk := Toy. Talk (PeasPath+ 'ppl05. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 110; end; 110 : begin ParamTalk := Toy. Talk ( PeasPath+ 'ppllO . wav' , ' S ' ) ; PrmcessNextSection := 115; if FavoriteColor = 'Red' then PrmcessNextSection = 115 if FavoriteColor = 'Blue' then PrmcessNextSection = 120 if FavoriteColor = 'Yellow' then PrmcessNextSection = 125 Synchronize (UpdatePnncessBar) ; end; 115 : begin ParamTalk := Toy. Talk (PeasPath+'ppll5. wav' , ' S ' ) ; Pr cessNextSection := 130; if FavoriteFood = 'Pizza' then PrmcessNextSection := 130; if FavoπteFooα = ' FrenchFnes ' then PrmcessNextSection : = 135; if FavoriteFood = 'MacaroniAndCheese' then PrmcessNextSection := 140; Synchronize (UpdatePnncessBar) ; end; 120 : begin ParamTalk := Toy. Talk (PeasPath+ p ppl20. wav' , ' S ' ) ; PrmcessNextSection := 130; if FavoriteFood = 'Pizza' then PrmcessNextSection := 130; if FavoriteFood = 'FrenchFnes' then PrmcessNextSection : = 135; if FavoriteFood = 'MacaroniAndCheese' then PrmcessNextSection := 140; 307 Synchronize (UpdatePnncessBar) ; end; 125 : begin ParamTalk := Toy. Talk ( PeasPath+'ppl25. wav' , ' S ' ) ; PrmcessNextSection := 130; if FavoriteFood = 'Pizza' then PrmcessNextSection := 130; if FavoriteFood = 'FrenchFnes' then PrmcessNextSection : = 135; if FavoriteFood = 'MacaroniAndCheese' then PrmcessNextSection := 140; Synchronize (UpdatePnncessBar) ; end; 130 : begin ParamTalk := Toy. Talk (PeasPath+'ppl30.wav' , ' S ' ) ; PrmcessNextSection := 145; if FavoriteActivity = 'Drawing' then PrmcessNextSection : = 145; if FavoriteActivity = 'Play gComputerGames' then PrmcessNextSection := 150; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection := 155; Synchronize (UpdatePnncessBar) ; end; 135 : begin ParamTalk := Toy. Talk ( PeasPath+'ppl35. wav' , ' S ' ) ; PrmcessNextSection := 145; if FavoriteActivity = 'Drawing' then PrmcessNextSection := 145; if FavoriteActivity = 'PlaymgComputerGames' then PrmcessNextSection := 150; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection : = 155; Synchronize (UpdatePnncessBar) ; end; 140 : begin ParamTalk := Toy. Talk (PeasPath+'ppl40. wav' , ' S ' ) ; PrmcessNextSection := 145; 308 if FavoriteActivity = 'Drawing' then PrmcessNextSection : = 145; if FavoriteActivity = 'PlaymgComputerGames' then PrmcessNextSection := 150; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection : = 155; Synchronize (UpdatePnncessBar) ; end; 145 : begin ParamTalk := Toy. Talk ( PeasPath+ ' ppl45. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 160; end; 150 : begin ParamTalk := Toy. Talk (PeasPath+'ppl50. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 160; end; 155 : begin ParamTalk := Toy. Talk (PeasPath+'ppl55.wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 160; end; 160 : begin ParamTalk := Toy. Talk ( PeasPath÷ ' pplδO . av' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 170; end; 165 : begin ParamTalk := Toy. Talk (PeasPath+'ppl65. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 171; end; 170 : begin ParamTalk := Toy. Talk (PeasPath+ 'ppl70. av' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; 309 PrmcessNextSection := 172; end; 172 : begin ParamTalk := Toy. Talk ( PeasPath÷ ' ppl72m.wav' ,' S ') ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 175; end; 175 : begin ParamTalk := Toy. Talk (PeasPath÷ 'ppl75. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 180; end; 180 : begin ParamTalk := Toy. Talk ( PeasPath+ ' ppl80. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 181; end; 181 : begin ParamTalk := Toy. Talk (PeasPath+'pplθlm.wav' , 'EL' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 185; end; 185 : begin ParamTalk := Toy. Talk (PeasPath+'ppl85. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 190; end; 190 : begin ParamTalk := Toy. Talk ( PeasPath+ 'ppl90. av' , * S ' ) ; Synchronize (UpdatePnncessBar) ; Pr cessNextSection := 195; end; 195 : begin ParamListen := Toy. isten (' yes/1, no/2 ', DTime, ' SR' , 'W' ) ; 310 case ParamListen of 1: IntroNextSection := 245; 2: IntroNextSection := 215; else IntroNextSection := 200; end; Synchronize (UpdatelntroBar) ; end; 200 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp200. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 205; end; 205 : begin ParamListen := Toy. Listen (' yes/1, no/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 1: IntroNextSection := 245; 2: IntroNextSection := 215; else IntroNextSection := 210; end; Synchronize (UpdatelntroBar) ; end; 210 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp210.wav' ,' S ') ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 245; end; 215 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp215. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 220; end; 220 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp220m.wav' , ' S ') ; if GamePrmcessStatus = 'Prince' then PrmcessNextSection := 226 else PrmcessNextSection := 225; Synchronize (UpdatePnncessBar) ; end; 311 225 : begin ParamTalk := Toy. alk ( PeasPath+ 'pp225. wav' , ' S • ) ; // change Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 230; end; 226 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp226.wav' ,' S ') ; //change Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 235; end; 230 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp230.wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 240; end; 235 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp235. av' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 240; end; 240 : begin ParamTalk := Toy. Talk (PeasPath+'pp240. av' , ' S ' ) ; if GamePπncessStatus = 'Prince' then PrmcessNextSection := 255 else PrmcessNextSection := 250; Synchronize (UpdatePnncessBar) ; end; 245 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp245.wav' ,' S ') ; if GamePrincessStatus = 'Prince' then PrmcessNextSection := 255 else PrmcessNextSection := 250; Synchronize (UpdatePnncessBar) ; end; 249 : begin ParamTalk : = Toy . Talk ( PeasPath÷ ' pp249m. wav ' , ' S ' ) ; PrmcessNextSection : = 249 ; 312 Synchronize (UpdatePnncessBar) ; enα; 250 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp250. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 260; end; 255 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp255. wav 1 , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 265; end; 260 : begin ParamTalk := Toy. Talk (PeasPath+'pp260. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 270; end; 265 : begin ParamTalk := Toy. Talk (PeasPath+'pp265. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 270; end; 270 : begin ParamTalk := Toy.Talk ( PeasPath+ ' pp270. wav' , ' S ' ) ; //change if GamePrmcessStatus = 'Prince' then PrmcessNextSection := 280 else PrmcessNextSection := 275; Synchronize (UpdatePnncessBar) ; end; 275 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp275. av' , ' S ' ) ; //change Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 285; end; 280 : begin 313 ParamTalk = Toy. Talk ( PeasPath+ ' pp280. wav' , ' S ' ) ; Syncnronize (UpdatePnncessBar) ; PrmcessNextSection := 290; end; 285 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp285. wav' , ' S ' ) ; Syncnronize (UpdatePnncessBar) ; PrmcessNextSection := 295; end; 290 : begin ParamTalk := Toy. Talk (PeasPath+ ' pp290. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 295; end; 295 : begin ParamListen := Toy. Listen (' yes/1, no/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 1 : begin if GamePrmcessStatus = 'Prmce' then PrmcessNextSection 320 else PrmcessNextSection := 315; end; 2: IntroNextSection := 345; else IntroNextSection := 300; end; Synchronize (UpdatelntroBar) ; end; 00 : begin ParamTalk := Toy. Talk (PeasPath+'pp300. av' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 305; end; 05 : begin ParamListen := Toy. Listen (' yes/1, no/2 ', DTime, ' SR' , 'W' ) ; case ParamListen of 1: begin 314 if GamePrmcessStatus = 'Prmce' then Pr cessNextSection 320 else PrmcessNextSection := 315; end; 2: IntroNextSection := 345; else IntroNextSection := 310; end; Synchronize (UpdatelntroBar ) ; end; 310 : begin ParamTalk := Toy. Talk (PeasPath+'pp310. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 345; end; 315 : begin ParamTalk := Toy.Talk (PeasPath÷ 'pp315.wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 325; end; 320 : begin ParamTalk := Toy. Talk (PeasPath+'pp320. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 326; end; 325 : begin ParamListen := Toy. Listen ( ' queen/1, king/2, prince/3 ' , DTime, 'SR' , 'W ) ; case ParamListen of 1: IntroNextSection := 445 2: IntroNextSection := 450 3: IntroNextSection := 465 else IntroNextSection := 450; end; Synchronize (UpdatelntroBar) ; end; 326 : begin 115 ParamListen := Toy. Listen 'queen/1, king/2, princess/3 ' , DTime, 'SR' , *W' ) ; case ParamListen of 1: IntroNextSection := 440 2: IntroNextSection := 450 3: IntroNextSection := 460 else IntroNextSection := 450; end; Synchronize (UpdatelntroBar) ; end; 330 : begin ParamTalk := Toy. Talk ( PeasPath+ "pp330. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 335; end; 331 : begin ParamTalk : = Toy. Talk ( PeasPath+ ' pp330. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection : = 336; end; 335 : begin ParamListen := Toy. Listen ( ' queen/1, kmg/2,prιnce/3 ' , DTime, 'SR' , 'W* ) ; case ParamListen of 1: IntroNextSection := 445 2: IntroNextSection := 450 3: IntroNextSection := 465 else IntroNextSection := 340; end; Synchronize (UpdatelntroBar) ; end; 336 : begin ParamListen := Toy. Listen ( ' queen/1, king/2, princess/3 ' , DTime, 'SR' , *W' ) ; case ParamListen of IntroNextSection := 440 IntroNextSection := 450 IntroNextSection := 460 116 else IntroNextSection := 340; end; Synchronize (UpdatelntroBar) ; end; 340 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp340. av' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 450; end; 345 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp345. wav' , ' S ' ) ; if GamePr cessStatus = 'Prmce' then PrmcessNextSection := 350 else PrmcessNextSection := 400; Synchronize (UpdatePnncessBar) ; end; 350 : begin ParamTalk := Toy. Talk (PeasPath+ ' pp350. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 405; end; 400 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp400. av' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 405; end; 405 : begin ParamTalk := Toy. Talk (PeasPath+ ' pp405. wav' , ' S ' ) ; if GamePrmcessStatus = 'Prmce' then PrmcessNextSection := 410 else PrmcessNextSection := 420; Synchronize (UpdatePnncessBar) ; end; 410 : begin ParamTalk := Toy. alk (PeasPath+ 'pp410. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 430; end; 317 420 : begin ParamTalk := Toy. Talk ' PeasPath+ ' pp420. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 430; end; 425 : begin ParamTalk := Toy. Talk ( PeasPath÷ 'pp425. wav' , ' S ' ) ; if GamePrmcessStatus = 'Prince' then PrmcessNextSection := 430 else PrmcessNextSection := 435; Synchronize (UpdatePnncessBar) ; end; 430 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp430. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 470; end; 435 : begin ParamTalk := Toy. Talk (PeasPath+'pp435. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 470; end; 440 : begin ParamTalk := Toy. Talk ιPeasPath+ ' pp440. wav' , ' Ξ ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 470; end; 445 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp445. wav' , ' S ' ) ; Syncnronize (UpdatePnncessBar) ; PrmcessNextSection := 470; end; 450 : begin ParamTalk := Toy. Talk ( PeasPath÷ ' pp450. wav' , ' S ' ) Syncnronize (UpdatePnncessBar ) ; 318 PrmcessNextSection := 470; end; 460 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp460. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 470; end; 465 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp465. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 470; end; 469 : begin ParamTalk := Toy. Talk (PeasPath+'pp436m. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 470; end; 470 : begin ParamTalk := Toy. Talk (PeasPath+'pp470.wav' , 'S' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 472; end; 472 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp472. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 475; end; 475 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp475.wav' ,' S ') ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 480; end; 480 : begin ParamTalk := Toy. Talk ( PeasPath+'pp480. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; 319 PrmcessNextSection := 485; end; 485 : begin ParamTalk := Toy. Talk (PeasPath+'pp485. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 490; end; 490 : begin ParamTalk := Toy. Talk (PeasPath+'pp490m. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 495; end; 495 : begin ParamTalk := Toy. Talk (PeasPath+'pp495.wav' , ' S ' ) ; if GamePrmcessStatus = 'Prince' then PrmcessNextSection := 505 else PrmcessNextSection := 500; Synchronize (UpdatePnncessBar) ; end; 500 : begin ParamTalk := Toy. Talk (PeasPath+'pp500.wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 510; end; 505 : begin ParamTalk := Toy. Talk (PeasPath+'pp505. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 510; end; 510 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp510m. wav' , ' S ' ) Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 515; end; 515 : begin 320 ParamTalk := Toy. Talk (PeasPath+'pp515. wav' , ' S ' ) ; if GamePrmcessStatus = 'Prmce' then PrmcessNextSection := 516 else PrmcessNextSection := 517; Synchronize (UpdatePnncessBar) ; end; 516 : begin ParamTalk := Toy. Talk (PeasPath+ 'pp516m.wav' , 'EC ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 520; end; 517 : begin ParamTalk := Toy. Talk ( PeasPath+' pp517m.wav' , 'E ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 520; end; 518 : begin ParamTalk := Toy. Talk (PeasPath+'pp521m.wav' , 'EL' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 520; end; 520 : begin ParamTalk := Toy. Talk (PeasPath+'pp520.wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 525; end; 525 : begin ParamTalk := Toy. Talk (PeasPath+'pp525. wav' , ' S ' ) ; //change if GamePrmcessStatus = 'Prmce' then PrmcessNextSection := 535 else PrmcessNextSection := 530; Synchronize (UpdatePnncessBar) ; end; 530 : begin ParamTalk := Toy. Talk (PeasPath+'pp530. wav' , ' S ' ) Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 540; end; 321 535 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp535. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 545; end; 540 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp540. wav' , ' S * ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 550; end; 545 : begin ParamTalk := Toy. Talk (PeasPath+'pp545. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 550; end; 550 : begin ParamTalk := Toy. Talk (PeasPath+'pp550.wav' , 'S' ) ; PrmcessNextSection := 555; if FavoriteColor = 'Red' then PrmcessNextSection = 555 if FavoriteColor = 'Blue' then PrmcessNextSection = 565 if FavoriteColor = 'Yellow' then PrmcessNextSection = 560 Synchronize (UpdatePnncessBar) ; end; 555 : begin ParamTalk := Toy. Talk ( PeasPath+'pp555. wav' , ' S ' ) ; PrmcessNextSection := 575; if FavoriteFood = 'Pizza' then PrmcessNextSection := 575; if FavoriteFood = 'FrenchFnes' then PrmcessNextSection : = 580; if FavoriteFood = 'MacaroniAndCheese' then PrmcessNextSection := 585; Synchronize (UpdatePnncessBar) ; end; 560 : begin ParamTalk := Toy. Talk (PeasPath+'pp560. wav' , ' S ' ) PrmcessNextSection := 575; 322 if FavoriteFood = 'Pizza' then PrmcessNextSection := 575; if FavoriteFood = 'FrenchFnes' then PrmcessNextSection : = 580; if FavoriteFood = 'MacaroniAndCheese' then PrmcessNextSection := 585; Synchronize (UpdatePnncessBar) ; end; 565 : begin ParamTalk : = Toy. Talk ( PeasPath+ 'pp565. wav' , ' S ' ) ; PrmcessNextSection : = 575 ; if FavoriteFood = ' Pizza ' then PrmcessNextSection : = 575; if FavoriteFood = ' FrenchFnes ' then PrmcessNextSection : = 580; if FavoriteFood = 'MacaroniAndCheese ' then PrmcessNextSection 585; Synchronize (UpdatePnncessBar) ; end; 575 : begin ParamTalk := Toy. Talk (PeasPath+'pp575. wav' , ' S ' ) ; PrmcessNextSection := 595; if FavoriteAnimal = 'Horse' then PrmcessNextSection 595 if FavoriteAnimal = 'Dog' then PrmcessNextSection 600 if FavoriteAnimal = 'Cat' then PrmcessNextSection 605 Synchronize (UpdatePnncessBar) ; end; 580 : begin ParamTalk := Toy. Talk (PeasPath+'pp580. wav' , * S ' ) ; PrmcessNextSection := 595; if FavoriteAnimal = 'Horse' then PrmcessNextSection 595 if FavoriteAnimal = 'Dog' then PrmcessNextSection 600 if FavoriteAnimal = 'Cat' then PrmcessNextSection 605 Synchronize (UpdatePnncessBar) ; end; 585 : begin ParamTalk := Toy. Talk (PeasPath+'pp585.wav' , 'S ' ) ; PrmcessNextSection := 595; if FavoriteAnimal = 'Horse' then PrmcessNextSection 595 ; if FavoriteAnimal = 'Dog' then PrmcessNextSection 600 ; 323 if FavoriteAnimal = 'Cat' then PrmcessNextSection := 605; Synchronize (UpdatePnncessBar) ; end; 595 : begin ParamTalk := Toy. Talk (PeasPath+'pp595. wav' , ' S ' ) ; PrmcessNextSection := 610; if FavoriteActivity = 'Draw' then PrmcessNextSection := 610; if FavoriteActivity = 'PlayComputerGame' then PrmcessNextSection 615; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection 620; Synchronize (UpdatePnncessBar) ; end; 600 : begin ParamTalk := Toy. Talk (PeasPath+ 'ppδOO . wav' , ' S ' ) ; PrmcessNextSection := 610; if FavoriteActivity = 'Draw' then PrmcessNextSection := 610; if FavoriteActivity = 'PlayComputerGame' then PrmcessNextSection 615; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection 620; Synchronize (UpdatePnncessBar) ; end; 605 : begin ParamTalk := Toy. Talk (PeasPath+'pp605. wav' , ' S ' ) ; PrmcessNextSection := 610; if FavoriteActivity = 'Draw' then PrmcessNextSection := 610; if FavoriteActivity = 'PlayComputerGame' then PrmcessNextSection 615; if FavoriteActivity = 'MakeBelieve' then PrmcessNextSection 620; Synchronize (UpdatePnncessBar) ; end; 610 : begin ParamTalk := Toy. Talk (PeasPath+'pp610. av' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 630; 324 end; 615 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp615. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 630; end; 620 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp620. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 630; end; 630 : begin ParamTalk := Toy. alk (PeasPath+ 'pp630m.wav' ,' S ') ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 635; end; 635 : begin ParamTalk := Toy.Talk ( PeasPath+' pp635. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := -1; PresentationNextSection := 4010; if (ChildSex = 'Girl') and (Time > StrToTime (' 19 : 00 : 00 ') ) then Degin PrmcessNextSection := 640; PresentationNextSection := -1; end; if (ChildSex = 'Boy') and (Time > StrToTime (' 19 : 00 : 00 ') ) then begin PrmcessNextSection := 645; PresentationNextSection := -1; end; end; 640 : begin ParamTalk : = Toy . Talk ( PeasPath+ ' pp640. wav ' , ' S ' ) ; Synchronize (UpdatePnncessBar ) ; Prmces sNextSection : = 650 ; end; 325 645 : begin ParamTalk := Toy. Talk ( PeasPath+ ' pp640. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := 650; end; 650 : begin ParamTalk := Toy. Talk ( PeasPath+ 'pp650m. wav' , ' S ' ) ; Synchronize (UpdatePnncessBar) ; PrmcessNextSection := -1; PresentationNextSection := 4010; end; { else begin Terminate; Exit; end; } end; // end of "The Princess and the Pea" sesions (* // ============= The Story Menu ====== // write here all sessions // ====================================== case TheStoryMenuNextSection of 1 : begin (sleep (300) ; ParamTalk := Toy. alk (StoryMenuPath+' inOOl . wav' , ' E' ) ; ParamListen := Toy. Listen ( ' yes/1, no, 2 ' , 1.5, ' SR and Sensor'); ) TheStoryMenuNextSection := 5; end; 5 : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; 326 : oegin ParamTal/c := Toy. Talk ( StoryMenuPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 5; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := -1; end; : begin ParamTalx := Toy. Talk (StoryMenuPath+ 'pp005. wav' , 'S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+ 'pp005.wav' ,' S ') ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 5 ; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := -1; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+ ' ppOOS . wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; 327 end; : begin ParamTalk := Tc;-. Talk ( StoryMenuPath+ ' pp005. wav' , ' S ' Syncnronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 5; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := -1; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 5; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' Synchronize (UpdateTheStoryMenuBar) ; 328 TheStoryMenuNextSection := -1; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'ppOOS . wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy.Talk (StoryMenuPath+'pp005.wav 1 , 'S' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+' pp005.wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 5; end; : begin ParamTalk := Toy. alk (StoryMenuPath+' pp005.wav 1 , 'S' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := -1; end; : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005.wav' , 'S' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. alk (StoryMenuPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; : begin ParamTalk := Toy.Talk (StoryMenuPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; 329 TheStoryMenuNextSection := 5; end; 100 : begin ParamTalk := Toy. Talk ( StoryMenuPath+ ' pp005. wav' , ' S ' ) ; Syncnronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := -1; end; 105 : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav" , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; 110 : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; 115 : begin ParamTalk := Toy. Talk (StoryMenuPath+'pp005. wav' , * S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 5 ; end; 120 : begin ParamTalk := Toy. Talk (StoryMenuPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := -1; end; 125 : begin ParamTalk := Toy. Talk (StoryMenuPath+ ' pp005. wav' , ' Ξ ' ) ; Synchronize (UpdateTheStoryMenuBar) ; TheStoryMenuNextSection := 10; end; end; end of "The Story Menu" sesions 330 // ============= Run - Story Menu ========================== // write here all sessions // ================================================================= case RunStoryMenuNextSection of 1 : begin (sleep(300) ; ParamTalk := Toy. Talk (RunStoryPath+ ' OOl . av' , 'E' ) ; ParamListen := Toy. Listen ( ' yes/1, no, 2 ' , 1.5, ' SR and Sensor'); RunStoryMenuNextSection := 5; end; 5 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 10 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 5; end; 15 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; 20 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 25 : begin ParamTalk := Toy. Talk (RunStoryPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 331 : begin ParamTalk := Toy. Talk ( RunStoryPath+ ' pp005. wav' , ' S ' ) Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 5; end; : begin ParamTalk := Toy. alk (RunStoryPath+ 'pp005.wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. av' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005.wav' , 'S ') ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (RunStoryPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 5; end; : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. av' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; 332 enα; : begin ParamTalk := Toy. Talk ( RunStoryPath+ 'pt : IΞ wav','S*); Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (RunStoryPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 5; end; : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005.wav" , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; : begin ParamTalk := Toy.Talk (RunStoryPath+' pp005.wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 5; end; : begin ParamTalk := Toy.Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; 333 RunStoryMenuNextSection : = - 1 ; end; 85 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 90 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. av' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 95 : begin ParamTalk : = Toy . Talk ( RunStoryPath+ ' pp005 . wav " , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar ) ; RunStoryMenuNextSection : = 5 ; end; 100 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; 105 : begin ParamTalk : = Toy . Talk ( RunStoryPath+ ' pp005 . wav ' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection : = 10 ; end; 110 : begin ParamTalk := Toy. Talk (RunStoryPath÷ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 115 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; 334 RunStoryMenuNextSection := 5; end; 120 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; 121 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005.wav' , 'S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 122 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 123 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. wav* , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 130 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; 135 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 140 : begin ParamTalk := Toy. Talk (RunStoryPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; 335 RunStoryMenuNextSection : = 10; end; 145 : begin ParamTalk := Toy. Talk ( RunStoryPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 5; end; 150 : begin ParamTalk := Toy. Talk (RunStoryPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; 155 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005.wav' ,' S ') ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 160 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 165 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 170 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005.wav' , ' S ') ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 5; end; 175 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'ppOOS . wav' , ' S ' •^ -> r JJO Syncnronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := -1; end; 180 : begin ParamTalk := Toy. Talk (RunStoryPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 185 : begin ParamTalk := Toy. Talk (RunStoryPath+'ppOOS .wav' , ' S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; 190 : begin ParamTalk := Toy. Talk (RunStoryPath+'pp005.wav' , * S ' ) ; Synchronize (UpdateRunStoryMenuBar) ; RunStoryMenuNextSection := 10; end; end; // end of "Run-Story Menu" sesions // ============= Bunny ================ // write here all sessions // ====================================== case BunnvNextSection of begin (sleep(300) ; ParamTalk := Toy. Talk (BunnyPath+ ' inOOl . wav' , ' E' ) ; ParamListen := Toy. Listen ( ' es/1, no, 2 ' , 1.5, 'SR and Sensor'); } BunnyNextSection := 5; end; begin ParamTalk := Toy. Talk (BunnyPath+ ' rb005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 337 : Degm ParamTalk := Toy. Talk (BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5 ; end; : begin ParamTalk := Toy. Talk (BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , * S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 338 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. av' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; : begin ParamTalk := Toy. Talk (BunnyPath+' pp005.wav' , ' S ' ) ; //choose 553 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 339 75 : begin ParamTalk := Toy. Talk ( BunnyPath+ ' pp005. wav" , ' S ' ) ; //cnoose in 751-753 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 80 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 85 : begin ParamTalk := Toy. Talk (BunnyPath÷ ' pp005. wav' ,' S '); //choose m 851-853 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 90 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 100 : begin ParamTalk := Toy. Talk ( BunnyPath+ 'pp005.wav' ,' S '); //choose in 1001-1003 Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 105 : begin ParamTalk := Toy. Talk ( BunnyPath+ ' pp005. av' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 340 110 : cegin ParamTalk := Toy. Talk ( BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar ) ; BunnyNextSection := 10; end; 115 : cegin ParamTalk := Toy. Talk ιBunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 120 : begin ParamTalk := Toy. Talk (BunnyPath+ 'ppOOS . wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 125 : Deg ParamTalk := Toy.Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 130 : oegin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 135 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005.wav' , ' S '); //choose in 1351-1353 Synchronize (UpdateBunnyBar ) ; BunnyNextSection := 5; end; 150 : cegir. ParamTalk := Toy. Talk ( BunnyPath+ ' ppOOS . wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; 341 BunnyNextSection • = 10 ; end; 155 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 160 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005.wav" , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 165 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 166 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 171 : begin ParamTalk := Toy. Talk (BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 180 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; //choose 1802-18010 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 185 : begin 342 ParamTalk • = Toy. alk (BunnyPath+ 'pp005. wav' Syncnronize (UpdateBunnyBar ) ; BunnyNextSection := 10; end; 190 : begin ParamTalk := Toy. Talk (BunnyPath+ "pp005. wav' , ' S ' ) ; //choose in 1901-1903 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 195 : begin ParamTalk := Toy.Talk (BunnyPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 200 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005.wav' , *S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 205 : begin ParamTalk := Toy. Talk (BunnyPath÷ r pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 220 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 225 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005.wav' ,' S *); //choose in 2251-2253 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 343 230 : oegin ParamTalk := Toy. Talk ( BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 235 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 240 : begin ParamTalk := Toy. Talk (BunnyPath+' pp005.wav' , 'S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 245 : begin ParamTalk := Toy. Talk (BunnyPath+'ppO05. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 250 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 255 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005.wav' , ' S '); //choose m 2551-25510 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 260 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 344 265 : begin ParamTalt := Toy. Talk ' BunnyPath+ ' pp005. av' , ' S '); //choose in 2651-2653 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 270 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 275 : begin ParamTalk := Toy. Talk (BunnyPath+ 'ppOOS . wav' , ' S ' ) ;//choose in 2751-2753 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 280 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , * S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 285 : begin ParamTalk := Toy. Talk (BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 290 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ;//choose in 2901-2903 Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 295 : begin ParamTalk := Toy.Talk <BunnyPath+ 'pp005. wav' , ' S ' ) ; 345 Syncnronize ( UpdateBunnyBar ) ; BunnyNextSection : = 10 ; end; 296 : begin ParamTalk := Toy. Talk (BunnyPath+' pp005.wav' ,' Ξ '); //choose in 2961-2963 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 300 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , * S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 305 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' ,' S '); //choose in 3051-3053 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 315 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 320 : begin ParamTalk := Toy. Talk (BunnyPath+'ppOOS . wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 330 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 346 335 : begin ParamTalk := Toy. Talk ( BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 345 : begin ParamTalk := Toy. Talk (BunnyPath+ "pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 350 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 355 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 360 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 365 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 370 : begin ParamTalk := Toy. Talk (BunnyPath+' pp005. av' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 347 375 : oegin ParamTalk • = Toy. Talk ( BunnyPath+ ' pp005. av' , ' S ' ) ; Syncnronize (UpdateBunnyBar ) ; BunnyNextSection := 5; end; 380 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 382 : begin ParamTalk := Toy. Talk (BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 385 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 390 : begin ParamTalk := Toy. Talk (BunnyPath+'ppO05.wav* , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 395 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; Syncnronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 400 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := -1; end; 405 : begin 348 ParamTalk := Toy. Talk (BunnyPath 4 - 'pp005.wav' Syncnronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 410 : begin ParamTalk := Toy. Talk (BunnyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 415 : begin ParamTalk := Toy. Talk (BunnyPath÷ 'pp005. wav' , ' S ' ) ; //choose in 4151-4153 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 420 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S ' ) ; //choose in 4201-4203 Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 425 : begin ParamTalk := Toy. Talk (BunnyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; 435 : begin ParamTalk := Toy. Talk (BunnyPath+ ' pp005. av' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 440 : begin ParamTalk := Toy. Talk (BunnyPath+'pp005. wav' , ' S • ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 10; end; 349 445 : begin ParamTalk := Toy. Talk (BunnyPath+ ' pp005. av' , ' S ' ) ; Synchronize (UpdateBunnyBar) ; BunnyNextSection := 5; end; (else begin Terminate; Exit; end; } end; // end of "Bunny" sesions // ============= Grouchy ============== // write here all sessions // ====================================== case GrouchyNextSection of 1 : begin {sleep (300) ; ParamTalk := Toy. Talk (GrouchyPath+' inOOl . av' , 'E' ) ; ParamListen := Toy. Listen ( ' yes/1, no, 2 ' , 1.5, ' SR and Sensor'); } GrouchyNextSection := 5; end; 5 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. av' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 10 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. av' , * S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 15 : begin 350 ParamTalk := Toy. alk (GrouchyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , * S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin 351 ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Syncnronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav' , ' Ξ ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 552 : cegin ParamTalk := Toy. Talk (GroucnyPath+ 'ppOOS . av" , * S ' ) ; Syncnronize (UpdateGrouchyBar) ; GroucnyNextSection := 10; end; : begin ParamTalk : = Toy . Talk ( GrouchyPath+ ' ppOOS . av ' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection : = 5 ; end; : begin ParamTalk : = Toy. Talk ( GrouchyPath+ ' pp005 . av ' , ' S ' ) ; Synchronize (UpdateGrouchyBar ) ; GrouchyNextSection : = -1 ; end; : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005.wav' , 'S ') ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 353 105 : begin ParamTalk : = Toy . Talk ( GrouchyPath+ ' pp005 . wav ' , ' S ' ) ; Synchronize (UpdateGrouchyBar ) ; GrouchyNextSection : = 10 ; end; 110 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav ' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 115 : begin ParamTalk := Toy. Talk (GrouchyPath+ 'ppOOS . wav' , 'S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 120 : begin ParamTalk := Toy. Talk (GrouchyPath+'ppOOS . wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 125 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 130 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 135 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 354 140 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' p005. av ' , ' S ' ) ; Synchronize (UpdateGrouchyBar ) ; GrouchyNextSection := -1; end; 145 : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 150 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 155 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 160 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 165 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. av' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 170 : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 355 171 : oegin ParamTalk := Toy. Talk (GroucnyPath+ ' pp005. av' , ' S ' ) ; Synchronize (UpdateGroucnyBar) ; GrouchyNextSection := 5; end; 175 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. av' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 180 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 185 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. av' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 190 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 195 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005.wav' , ' S ' Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 200 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. av' , ' Ξ ' Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 356 205 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav ' , ' S ' ) ; Synchronize (UpdateGroucnyBar) ; GrouchyNextSection := 10; end; 210 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. av ' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 215 : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005.wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 220 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005.wav' , ' S' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 225 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. av' , * S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 226 : begin ParamTalk := Toy. Talk (GrouchyPath+'ppOOS . wav * , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 230 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav* , * S ' ) ; Synchronize (UpdateGrouchyBar) ; GroucnyNextSection := -1; end; 357 235 : cegin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav ' , ' S ' ) ; Synchronize (UpdateGrouchyBar ) ; GrouchyNextSection := 10; end; 240 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 245 : begin ParamTalk := Toy. Talk (GrouchyPath+ "pp005. wav 1 , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 250 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 255 : begin ParamTalk := Toy.Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 260 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; 265 : begin ParamTalk := Toy. Talk (GrouchyPath+'pp005. av' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 5; end; 358 270 : begin ParamTalk := Toy. Talk (GrouchyPath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := -1; end; 275 : begin ParamTalk := Toy. Talk (GrouchyPath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateGrouchyBar) ; GrouchyNextSection := 10; end; {else begin Terminate; Exit; end; } end; // end of "Grouchy" sesions // ============= BedTimeRitual =========== // write here all sessions case BedTimeRitualNextSection of 1 : begin (sleep(300) ; ParamTalk := Toy. Talk (BedTιmePath+ ' mOOl . wav' , ' E" ) ; ParamListen := Toy. Listen ( ' yes/1, no, 2 ' , 1.5, ' SR and Sensor'); } BedTimeRitualNextSection := 5; end; 5 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. av' , * S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 10 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; 359 BeαTimeRitualNextSection := 5; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Syncnronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'ppO05.wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005.wav' ,' S ') ; 360 Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+ ' pp005. av' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S * ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : negin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; : begin ParamTalk := Toy. Talk (BedTιmePath+ 'ppOOS . wav' , ' S ' , Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; : cegin 361 ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; : oegin ParamTalk := Toy. Talk (BedTιmePath+ 'ppOOS . wav' , ' S * ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 362 100 : cegin ParamTalk := Toy. Talk ( BedTιmePath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 105 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 110 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 115 : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. av' , I' S ς I Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 120 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005.wav' , ' S ' Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 125 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005.wav' , ' S ' Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 130 : begin ParamTalk := Toy. Talk ( BedTιmePath+ ' pp005. av ' , ' S ' ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 363 135 : cegin ParamTalK • = Toy. Talk (3edTιmePath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 140 : begin ParamTalk •= Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 145 : begin ParamTalk := Toy. Talk (BedTιmePath+'ppO05. wav* , * S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 150 : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , * S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 155 : begin ParamTalk := Toy. Talk (BedTimePath+'ppOOS . av' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BeαTimeRitualNextSection := 5; end; 160 : begin ParamTalk := Toy. Talk (BedTιmePath+' pp005. wav' , * S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 165 : begin ParamTalk := Toy. Talk (BedTιmePath+ ' pp005. av' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 364 170 : begin ParamTalk := Toy. Talk (BedTιmePath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 171 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 175 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 180 : begin ParamTalk := Toy. Talk (BedTimePath+'ppOOS . wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 185 : begin ParamTalk := Toy. Talk (BedTιmePath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 190 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. av' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 195 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'ppOOS . av' , ' S ' ) ; Syncnronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 365 200 : oegm ParamTalk := Toy. Talk ( BedTιmePath+ ' pp005. wav' , ' S * ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 205 : begin ParamTalk := Toy. Talk (BedTιmePath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 210 : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. av' , • S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 215 : begin ParamTalk := Toy. Talk (BedTimePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 220 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'ppOOS . wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 225 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 226 : begin ParamTalk := Toy. Talk (BedTιmePath+'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 366 230 : Degin ParamTalk •= Toy. Talk (BedTιmePath+ ' p005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 235 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 240 : begin ParamTalk := Toy. Talk (BedTιmePath+ ' p005. wav' , ' S * ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 245 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005.wav' ,' S ') ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5; end; 250 : begin ParamTalk := Toy. Talk (BedTιmePath+' pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 255 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'ppOOS .wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 260 : begin ParamTalk := Toy. Talk (BedTιmePath+ ' pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; 567 265 : begin ParamTalk := Toy. Talk < BedTιmePath+ ' pp005. wav ' , ' S ' Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 5 ; end; 270 : begin ParamTalk := Toy. Talk (BedTιmePath+ 'pp005. wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := -1; end; 275 : begin ParamTalk := Toy. Talk (BedTimePath+'pp005.wav' , ' S ' ) ; Synchronize (UpdateBedTimeRitualBar) ; BedTimeRitualNextSection := 10; end; (else begin Terminate; Exit; end; ) end; // end of "BedTimeRitual" sesions if (IntroNextSection = -1) and (PlayNextSection = -1) and (PrmcessNextSection = -1) and (TheStoryMenuNextSection = -1) and (RunStoryMenuNextSection = -1) and (BedTimeRitualNextSection = -1) and (GrouchyNextSection = -1) and (BunnyNextSection = -1) then Terminate; f ((ParamTalk = -2)or (ParamListen = -9999)) and [PresentationNextSection <> 750) then begin PrmcessNextSection := -1; PresentationNextSection := 750; 368 ParamTalk = 0; ParamListen := 0; if LastPresentation < 1 then LastPresentation 699; Synchronize (UpdatePresentationBar) ; end; if PanelControlForm. Status = 'STOP' then begin PresentationNextSection := 6; Synchronize (ClearStatusControl) ; end; if PanelControlForm. Status = 'START' then begin PresentationNextSection := 10; Synchronize (ClearStatusControl) ; VisitSongMenu = 0; VisltGameMenu = 0; VisitStoryMenu = 0; VisitBunnyShort = 0; VisitBunnyLong = 0; VisitPrincess = 0; BunnyFavoriteFood end; if PanelControlForm. Status = 'PAUSE' then begin if PresentationNextSection = 10000 then PresentationNextSection := LastPresentation else begin LastPresentation := PresentationNextSection; PresentationNextSection := 10000; end; Synchronize (ClearStatusControl ) ; Synchronize (UpdatePresentationBar) ; end; end;// End of Terminate Terminate; Exit; end; 369 proceαure TIntro . UpαatelntroBar ; begin // Intro nave 450 sections StatusForm. StatusGauge. Progress := Trunc (IntroNextSectιon/4.5) ; StatusForm. Labell. Caption := IntToStr ( IntroNextSection) ; end; procedure TIntro . UpdatePlayBar; begin // Play have 450 sections StatusForm. StatusGauge. Progress := Trunc (PlayNextSectιon/4.5) ; StatusForm. Labell. Caption := IntToStr (PlayNextSection) ; end; procedure TIntro . UpdatePnncessBar; begin // Princess have 450 sections StatusForm. StatusGauge. Progress := Trunc (PπncessNextSectιon/4.5) ; StatusForm. Labell. Caption := IntToStr (PrmcessNextSection) ; end; procedure TIntro. UpdateTheStoryMenuBar; begin // The Story Menu have 450 sections StatusForm. StatusGauge. Progress := Trunc (TheStoryMenuNextSectιon/4.5) ; Status Form. Labell. Caption := IntToStr (TheStoryMenuNextSection) ; end; procedure TIntro .UpdateRunStoryMenuBar; begin // Run Story Menu have 450 sections StatusForm. StatusGauge. Progress := Trunc (RunStoryMenuNextSection/4.5 ) ; StatusForm. Labell. Caption := IntToStr (RunStoryMenuNextSection) ; end; procedure TIntro .UpdateBedTimeRitualBar ; begin // Bed Time Ritual have 450 sections StatusForm. StatusGauge. Progress := Trunc (BedTimeRitualNextSection/ 4.5 ) ; StatusForm. Labell. Caption := IntToStr (BedTimeRitualNextSection) ; end; 370 procedure TIntro . UpdateGrcucnyBar; begin // Grouchy have 450 sections StatusForm. StatusGauge. Progress := Trunc (GrouchyNextSectιon/4.5) ; StatusForm. Labell. Caption := IntToStr (GrouchyNextSection) ; end; procedure TIntro. UpdateBunnyBar; begin // Bunny have 450 sections StatusForm. StatusGauge. Progress := Trunc (BunnyNextSectιon/4.5) ; StatusForm. Labell. Caption := IntToStr (BunnyNextSection) ; end; procedure TIntro. UpdatePresentationBar; begin // Presentation have 5000 sections StatusForm. StatusGauge. Progress := Trunc (PresentatιonNextSectιon/50) ; StatusForm. Labell. Caption := IntToStr (PresentationNextSection) ; StatusForm. StandByLabel.Visible := False; if PresentationNextSection = 699 then begin StatusForm. StandByLabel.Visible := True; StatusForm. StandByLabel. Caption := ' STANDBY MODE' ; end; if PresentationNextSection = 750 then begin StatusForm. StandByLabel.Visible := True; StatusForm. StandByLabel. Caption := 'SLEEP MODE'; end; if PresentationNextSection = 10000 then begin StatusForm. StandByLabel.Visible := True; StatusForm. StandByLaoel. Caption := 'PAUSE'; end; end; procedure TIntro . Clear Status Control ; 371 begin PanelControlForm. Status := ' ' ; end; procedure TIntro .ApplicationMinimize; begin StatusForm. Hide; StatusForm. indowState := wsNormal; StatusForm. Show; Application.Minimize; end; end. 372 Base Station Source Code 373 Serial Uniport Microchip of the Base Station (BS) Source Code 374 ; 14.04.98 18:00 MH_RF.asm UART, 14.7456 MHZ, FIFO 8 KB M.Kholod. ; MH: 1. CTPl&org 04 2. VER,CMH:3. Del CMH.asm, 4. Copy MH->\CMH, ; 6. Ren MH->CMH, 7. B CTP1 & org4: MH->CMH, 8. CTP4: ";CEIBO config 06.04: 1. Memory Distribution { PAC| | PEDELEHIE) 06.04: 2. In "MHf if o8K. asm" BF=42, BYTE=43 (before 40,41) COMH/COHM PC-HUB: FF 05 (Type=81 Leng=01 Data=47) KS=C9 (=81+01+47) RF TX/RX: 55*5 Bar=32 (Type=Dl Leng=02 Data=2C Al) KS=A0 (=Dl+02+2C+Al) LIST p=16c73a _config B* 00000000110010' ; for CEIBO = Y6PAT6 3TY CTPOKY ! I I I I M Select XT Oscil = 01 = 04 MHZ I i i | ++ > select HS Oscil = 10 = 10, 20 MHZ 114.7 MHZ|='10' MI+ > WDT Disabled 11+ > Power-up Timer Enabled ++ > Code protection off yel red + > Brown-out Reset Disabled RX TX 0 x x x x x x x x =================== 14.7 MHZ <==> 0.2712673611 U 2 3 7 I * * * ? 3 ? | Tcomm = lcycl = 0.27 U X X X X X X X =================== Baud Rate = 115200, 8-bit 1-StopBit, No Parity RAO A/D Works 8KHz, 8 bit PIC16C73A xOl RESET ( ) RB7 28x B7 =>COMP_EN AUD_IN A/D => A0 x02 RA0/AN0 W RB6 27x B6 => RF_EN TX+B2_IN <= Al x03 RA1/AN1 RB5 26x B5 TX_DATA <= A2 x04 RA2/AN2 RB4 25x B4 <=> FIFO VREF => A3 x05 RA3/AN3/REF RB3 24x B3 CD_N => A4 xOδ RA4/TOCKI_ RB2 23x B2 OE <= A5 x07 RA5/AN4/SS RBI 22x BI => CLK Ground => x08 VSS RB0/INT 21x B0 => DATA OSCi 14MHZ => x09 OSCl/CLKIN VDD 20x <= OSCo <= xlO OSC2/CLKOUT VSS 19x <= WE <= CO xll RC0/T1OSO/T1CKI RC7/RX/DT 18x C7 <=BASE_RX BASE_CTS => Cl xl2 RC1/T10SI/CCP2 RC6/TX/CK 17x C6 =>BASE_TX PWM <= C2 xl3 RC2/CCP1 RC5/SDO 16x C5 =>G (CLK) BASE RTS <= C3 xl4 RC3/SCK/SCL RC4/SDI/SDA 15x C4 <=RX DATA 375 PC_ 0 1 2 3 4 5 6 η PC_ STRB / 1 1 1 1 1 1 \ ACK PC CONNECTOR 1 2 3 4 5 6 7 8 9 10 X X X X X X X X X X X COMM, PWM I I COMM I I -Data— > I I | I I PC I > |PIC|-Clock->| RFI-+ < +— RF UART I I — EN >| I A/D, STATUS I |< |HUB|RC2=PWM | PLL I ACK, SENSOR PIC I Corn-port I ACK I I > | (Comp-| TOY I I STATUS I |< lander) I SENSOR RA0=A/D MFPW: | | PWMI I I COMM I HEAD I | 11 7 1 6 ( 5 1 1 I 0 I I I I I PWM=0->Not Read / 1 -> Read I 0-Wait COh I 1-Yes HEADO(CO) I and Leng = CNT l->Yes Head, Wait and Read Command from PC + MFAD: I I AD I I I ! APK I ACN I ALH I ATP I I | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 I I I I I I AD = 0 -> A/D Not Started I I = 1->HEAD0=FF I I Wait Type l-> Yes LSB = LCL -> Yes ACN + I +- =l-> Yes Type ALH = 1 -> Yes MSB Leng = ACNH #INCLUDE "microch.asm" #DEFINE HUB ; For HUB. HUB=BASE / TOY=HAND Select 376 *• + * + ★* Constants M_VER EQU 45 ; 8 = Year (98), 3 = Month (Marcn) . (HO POKA: M D/2) MSYNC EQU 05 ; HHeadl =05h: Sync PC <—> HUB = FF 05 . . . SYNC01B EQU B'01010101' Sync Frequence RF SYNC5L EQU 05 5 Bytes in Sync RF SYNC5R EQU 05 5 Bytes SYNC Compare in RX BARKERB EQU B'00110010' BARK TO EQU (SYNC5L+5)* Max Bits beefore BARKER ;4 MHZ, F[USER]=8KHZ, Presc=l: 4000/ ( 4*8 ) -1= 124 ' •' TOY: 4 MHZ RF ' ;14.7456MHZ, F [USER] =8.014KHZ, Presc=4 (T2CON, 0=1) : 14745/ ( 4*8*4 ) -1= 114 • RF_PR2 EQU d'114' ; and Presc. = 4 = T2CON,0:=1 RF ' ' ' PWMI if F[osc]=14745.6 KHZ, Presc=l, PR2= ( 14745.6/4*56) ) -1 = 64.8 = 651 F[user]=F(osc]/ ( (PR2+1) *4*Presc) =14745 / (66*4) = 55.854(54) KHZ | PR2=(F[osc]/ (4*F[user]*Presc) )-l = (14,745/(4*56*1))-! = 65 I PWM_PR2 EQU d'65' ; 11 1 PR2>CCPR1L,CCP1C0N=8 Bit ' ■ 11.1 I OVERSAMPLING EQU 7 ;(BO CK. PA3 PEREKRYTIE) 17.9U*7=125.3U | ;F[pwm]=7*8KHZ=56 KHZ -> F[user]=56 KHZ -> 17.86U = .01786 MS -> ;ιf F[osc]=10.2 MHZ, Presc=l, PR2= ( 10, 200/4*40*1) ) -1 = 62.8 = 63 ;F[user]=F[osc]/ ( (PR2+1 ) *4*Presc) = 10 200 / (63*4) = 40.5 KHZ ;ιf F[osc)=4 MHZ, Presc=l, PR2 = (4,000 / 4*40*1) )-l= 24 ;ιf F[osc] = 10 MHZ, Presc = 1, PR2 = ( 10, 000/4*40*1 )) -1= 61.5=62 ;F[user] = F[osc] / ( (PR2+1) *4*Presc) = 10 000 / (63*4) = 39.68 KHZ ;ιf F[osc] = 20 MHZ, Presc = 1, PR2 = (20,000/4*40*1)1-1=124 ;F[user] = F[osc] / ( (PR2+1) *4*Presc) = 20 000 /(125*4) = 40.00 KHZ PWM RTS_TRIS EQU TRISC RTS_PORT EQU PORTC RTS_BIT EQU 3 RC3 CTS_TRIS EQU TRISC CTS_PORT EQU PORTC CTS BIT EQU 1 CTS=RC1=1 => PC Not Ready to Read 377 CLK_PORT EQU PORTB CLK_TRIS EQU TRISB CLK EQU 1 RBI DATA_PORT EQU PORTB DATA_TRIS EQU TRISB DATABIT EQU 0 RBO RX_DATA_P EQU PORTC RX_DATA_T EQU TRISC RX_DATA EQU 4 ; RC4 TX_DATA_P EQU PORTA TX_DATA_T EQU TRISA TX_DATA EQU 2 ; RA2 ENMC_PORT EQU PORTB ENMC_TRIS EQU TRISB ENMC EQU 7 RB7 ENRF_PORT EQU PORTB ENRF_TRIS EQU TRISB ENRF EQU 6 RB6 ****** Variables ****** W_TMP EQU 20 Temp Storage for W [ 20 ] STATUS_TMP EQU 21 for STATUS [ 21 ] FSR_TMP EQU 22 for FSR [ 22 ] ; PCLATH TMP EQU 23 for PCLATH [ 23 ] MF EQU 2 Curent Process, STATE (COCTORHIE) PWMS EQU / 1: PC -UART-> MBYTE -FIFO-> Sample PWM / 0: COMH COPW EQU 6 1: Source State = PWM, aval(ODHAKO) FF 05 ...?!' COHM EQU 4 1: HUB(HBYTE) -> PC: ACK or STATUS COHMRF EQU 3 1: TOY-HUB-> PC: ACK or SENSOR (STATUS) from TOY ADSM EQU 2 1: A/D Sample -FIF0-> HBYTE -UART-> PC RFTX EQU 0 •1: RF TX /0: RF RX if COPW=COHM=COHMRF=0 :Not PWM&COHM FRF EQU 2 ; RF Flags: ■' To Begin RF: FRF(,_BUSY) := 00(0) ' BUSY EQU - ; 1: RF Busy: Process RF T I X in Interrupt 378 _ERR ΞQU 6 ; 1: KΞ Error (RX) CUR ECU 4 ; 1: Yes Barker, RX | TX WaitlSend Cur. Data BitslBytes NLEN EQU 3 ; 1: Yes Length, RX I TX : WaitlSend Curr.Data Bit I Byte TYPR EQU 2 ; 1: Yes Type, RX: Wait Length BAR EQU 1 • 1: Yes SYNC, RXITX: Wait BarkerlSend SYNC and Barker NIB ECU 0 ; 1: Low Nibble s Received MFH ECU 26 HUB Flags CMB ECU 7 1: Yes MBYTE from PC. HADO EGO 06PA60TAT6 & :=0 0: HADO Read Byte: PC -> MBYTE & _CMB:=0 _PWM EQU 6 1: HADO FIFO -BUF_R-> W(Sample) & _PWM:=0 0: Wait untill in Interrupt 8 KHZ _PWM := 1 _DAT ECU 5 1: Yes min (>1K Bytes) in FIFO 0: FIFO still empty ( < IK ) -> Not Sing AD ECU 4 1: HADO A/D Sample -BUF_W-> FIFO & AD := 0 0: Wait untill in Interrupt 8 KHZ AD := 1 PLA EQU 3 1: Fluent end (PLABH 3ABEPWEHIE DO IC4EP Buff}) ; 0: Immedmate (HEMEDLEHHOE) End PWM or A/D, and => BUF_SET TSTAD EQU 2 1: TEST HUB -> PC: 00, 01,. . FE, FE(#FF), 00, . . TSTPW EQU 1 1: TEST PC -> HUB: 00, 01,. . FE, FE(#FF), 00, . . TSMPL EQU 0 1: Sa le renewing (06H0BIL0C6) FCOMH EQU 28 Flags for COMH FCOHM EQU 29 Flags for COHM _COM EQU 1: Read COMH or Send COHM ( TEK Bytes COMM ) _LEN EQU 1: Read (PC->HUB) or Send (HUB->PC) Length COMM _TYP EQU 1: -"- Type: p.6=l=TOY / 0=HUB; p.5=l=Yes ACK/0=No _SYN EQU 1: Read (PC->HUB) or Send (HUB->PC) Headl = 05h _MES EQU 1: Yes Special HUB Message (8E) : Error or Information 2L3 ECU rl: Length COMH=l, 3, .. odd (HE4ETH) / 0: =0,2,.. even MBYTE ECU 2A ; Byte from PC -> HUB HBYTE ECU 2B ; Byte from HUB to PC ; BMH for COMH (PC->HUB): 2E(MTYPE) 2F(MHCNT) 30-40 (BMH_DATA) +( SCOMH) 2C-40 SCOMH ECU 2C ; KS COMH = Type+Length (=n) +BMHD0+ .. +BMHDn-l ACOMH EQU 2D ; Address Current Byte Buff BMH(COMH) (PC->HUB): 30h-3Fh MTYPE ECU 2E ; Type COMH PC -> HUB MHCNT ECU 2F ; Counter COMH PC -> HUB = Length COMM <= 16 = lOh ACOMH0 ECU 30 ; Address COMH PC->HUB (Leng <= lOh) , COMH0=INSTR ' PLLADR ECU ACOMH0 ; Address PLL Reg. [30] PLLDATH ECU ACOMHO+1 , Data (MSB) [31] 379 PLLDATL ECU ACOMHO+2 Data (LSB) [32] • [3F] [40] ; 42 BF: FW=1, FR=0; 0 -> BUF empty (FR=0) or full (FR=1) ; 43 BYTE ; 44-45 BCM 46-47 BARH, BARL 48-49 BAWH, BAWL ; BHM for COHM (HUB->PC) : 4E(MTYPE) 4F(HLENG) 50-60 (BHM_DATA) + (SCOHM) 4C-60 SCOHM ECU 4B ; KS COHM HUB -> PC ACOHM ECU 4C ; Address Current Byte Buff BHM (COHM) (HUB->PC) : 50h-5Fh HM_CNT EQU 4D ; Counter COHM HUB -> PC HTYPE EQU 4E ; Type COHM HUB -> PC HLENG EQU 4F ; Length COHM HUB -> PC ACOHMO EQU 50 ; Addr COHM HUB->PC, COHM0 = Instr. Sens, or ACK ''' PSHADR EQU ACOHMO ; Address PLL Shadow Reg. [50] PSHDATH EQU ACOHMO+1 ; Data (MSB) [51] PSHDATL EQU ACOHMO+2 ; Data (LSB) [52] . . [5F] [60] PWMI PWM_Cntr EQU 61 ; PWM Pulse Counter for Oversamplmg [60] | Sample EQU 62 ; Current Sample [61] | Sample TMP EQU 63 ; Current Sample TMP [62] | ; PWMI MM11PW EQU 64 MM12AD EQU 65 MM EQU 66 MM1 EQU 67 M CNT EQU 68 PLLBYTE EQU 6A ; => s/r PLLOut PLLCOUNT EQU 6B ; Counter s/r PLLOut PLL_LENG EQU 6C ; pOOO 1111, p=l=Mc/ p=0=Sharp; llll=Leng (1-8) PLLSCNT EQU 6D ; Counter s/r PLLSetup MSTATUS EQU 70 ; EC: cccc eeee = Exit Code = HUB Status MCODE EQU 71 ; EC: cccc eeee = Exit Code = HUB Status cccc = 7|615|4 = where to (KYDA), eeee = Error Code Oh = 0 x x x => Cycle: MCOMH->MCOHM->MPWMS->MADSM->MCOMH . . . 8h = 1 0 x x => MLOOP00 = BUF_SET -> MCOMH-> ... (Start PWM or A/D) Ch = 1 1 0 x => M_START = Break HUB Eh = 1 1 1 0 => START = Reset HUB Fh = 1 1 1 1 => Error or Message => FCOMH:=0; MSTATUS : =Status=MCODE; if COPW=l, Restore Sourse PWM Mode eeee Oh OK. lh = Stop D/A, but Not PWM. 2h = Not UART. 380 3h = UART bus y 4h = CTS=1 => PC Not Ready to Read . 5h = Headl # 05 . 7h = KS Erro r . 8h = Yes FFh . 9h = Stop PWM, then => ACK : HM90PWMF . Dh = Error : FI FO empty . Eh = Error Test PC->HUB Fh = HeadO # FF . MFIF08K Variable EQU >= 4Oh ! ! RF_BYTE EQU 7 744 ; (If Error RX->FRF,_ERR:=1 & RF_BYTE:= Error Code) RF_CNT EQU 75 ; Counter Bits to TX RFMCNT EQU 76 ; Counter Bytes to TX RF_FSR EQU 77 ; Address BUFF to RX/TX TX_CNT EQU 78 ;CNT l/2Bytes Message to TX=2* (Leng+3 (TYP, LEN, KS) ) RX_CNT EQU 79 ;CNT Bytes Message TOY-HUB->PC: =Leng+3 (TYP, LEN, KS) SRF KS EQU 7A ; KS RF RX M8CNT EQU 7C 125.32552088U, M8CNT=0 -> Yes 1 KHZ = 1002.6MS TMR_125U EQU 7D 125 U = 17.90364584U * 7 = 125.32552088U TMR_32MS EQU 7E 32 MS = 125.32552088U * 256 = 32083.333345 MS TMR 8SEC EQU 7F 8 SEC = 32.08333MS * 256 = 8.2133333364 SEC BANK 1 ! ! ! ! BANK 1 ; BMT for PC -UART-HUB-RF-> TOY: Al (TXTYPE) A2 (TXLENG) A3-B3 (BMT_DATA+KS) TXTYPE EQU 0A1 ; Type TX Instr. PC ->TOY [Al] TXLENG EQU 0A2 ; Counter (Length) [A2] BMT0 EQU 0A3 ; BMT (Instr. PC -> TOY) + KS : [A3] - [B3] SHARPSH EQU 0B4 ! ! BANK 1 ! [B4] - [BD] SHARP_RX16 ECU SHARPSH+0 0000 OHL(Dlδ) MSB [B4] SHARP_RX08 ECU SHARPSH+1 (D15) . . (D8) [B5] SHARP RX00 EQU SHARPSH+2 (D7) . . (DO) LSB [B6] SHARP_TX16 EQU SHARPSH+3 0000 0LH(D16) MSB [B7] SHARP_T 08 EQU SHARPSH+4 (D15) . . (D8) [B8] SHARP TX00 EQU SHARPSH+5 (D7) . . (DO) LSB [B9] SHARP_REF8 EQU SHARPSH+6 ; 00HH ( Dll ) ( D10 ) (D9) (D8 ) , Dll ■■ MSB SHARP REF0 EQU SHARPSH+7 ; (D7) . . (DO) LSB [BB] 381 SHARP_OPT8 EQU SHARPSH-"-8 00LL (Dll) (D10) (D9) (D8) , Dll = MSB SHARP OPT0 EQU SHARPSH+9 (D7) . . (DO) LSB [BD] ; BTM for TOY -RF-HUB-UART-> PC: BE(RXTYPE) BF(RXLENG) CO-DO (BTM_DATA+KS) RXTYPE EQU OBE ; Type RX ACK or Sensor [BE] RXLENG EQU OBF ; Counter (Length) [BF] BTMO ECU 0C0 ; BTM (Instr. Sensor or ACK) + KS : [CO] - [DO] PLLSHAD ECU 0D0 • • ' BANK 1 [DO PLLSH1H ECU PLLSHAD+2 ( +2*1 ) [D2 PLLSH1L EQU PLLSHAD+3 ( +2*1+1 ) [D3 PLLSH2H EQU PLLSHAD+4 ( +2*2 ) PLLSH2L EQU PLLSHAD+5 ( +2*2+1 ) PLLSH3H EQU PLLSHAD+6 ( +2*3 ) PLLSH3L EQU PLLSHAD+7 ( +2*3+1 ) PLLSH4H EQU PLLSHAD+8 : 00000000 ;ALC-Enable, Limiter-Enable, Clk-Disable I ||\/+ > Volume Control (MSB) I j i \ > cij out Select I | + > i _ cik Disable I + > 1 - Limiter Disable + > 1 - ALC Disable PLLSH4L EQU PLLSHAD+9 • 00000000 ;Mode-Actιv, Tx-UnMuted, Rx-Muted, SP-On :\ /Ml ι+ > 1 - Speaker Mute I i j | + > i - R X Mute I | |+ > i _ Tx Mu e I | + > R X Mode \ 00 - Active I + > StendBy Mode / 11 - Inactive + > Volume Control ( bιt2 - LSB ) PLLSH5H EQU PLLSHAD+0A PLLSH5L ECU PLLSHAD+0B PLLSH6H EQU PLLSHAD+0C 00000000 \_/ +— -> Voltage Reference Adjust PLLSH6L EQU PLLSHAD+0D 382 00000000 I ι \ / I I + > Filter Clock Counter |+ > 1 - Tx Scrambler Bypass + > 1 - Rx Scrambler Bypass PLLSH7H EQU PLLSHAD+OE ; ( +2*7 ) [DE] PLLSH7L EQU PLLSHAD+OF ; ( +2*7+1 ) [DF] MM1 -> Addr: EOh - EFh, MM -> Addr: FOh - ■ FFh #IFDEF HUB ; HUB = BASE: RY3GH045 (Baseset) ;***Default SHARP Settings for HUB!!! (For TOY Contrary RX<—>TX) ;fRX = 70504 * 0.0125 + 21.7 = 903.000 MHZ nRX = 70504 = 011368h SHARP_RX16DF EQU 05 0 0 0 0 0 H L D16 (101) SHARP_RX08DF ECU 13 D15 D14 D13 D12 Dll D10 D9 D8 SHARP_RX00DF ECU 68 D7 D6 D5 D4 D3 D2 Dl DO ; fTX = 74160 * 0.0125 927.000 MHZ nTX = 74160 = O121B0h SHARP TX16DF ECU 03 0 0 0 0 0 L H D16 (011) SHARP_TX08DF ECU 21 D15 D14 D13 D12 Dll D10 D9 D8 SHARP TXOODF EQU 0B0 D7 D6 D5 D4 D3 D2 Dl DO ; Reference 3400 = ι0D48h SHARP_REF8DF EQU 3D 0 0 H H Dll D10 D9 D8 B'0011' Dh SHARP REFODF EQU 48 D7 D6 D5 D4 D3 D2 Dl DO ; Seting Options for Normal Operating Mode=B'0000 1010 0000 0000' SHARP_OPT8DF EQU 0A ; 0 0 L L Dll D10 D9 D8 SHARP_OPT0DF EQU 00 ; D7 Dδ D5 D4 D3 D2 Dl DO #ELSE ; TOY = HAND: RY3GH045 (Handset) ; Default SHARP Settings for TOY. (For HUB Contrary, but Formula the same!) ;fRX = 72424 * 0.0125 + 21.7 = 927.000 MHZ nRX=72424=011AE8h SHARP_RX16DF EQU 05 ; 0 0 0 0 0 H L D16 (101) SHARP_RX08DF EQU 1A ; D15 D14 D13 D12 Dll D10 D9 D8 SHARP_RX00DF EQU 0E8 ; D7 D6 D5 D4 D3 D2 Dl DO ; fTX = 72240 * 0.0125 = 903.000 MHZ nTX = 72240 = 011A30h SHARP_TX16DF EQU 03 ; 0 0 0 0 0 L H D16 (011 ) SHARP TX08DF EQU 1A ; D15 D14 D13 D12 Dll D10 D9 D8 SHARPJTXOODF EQU 30 ; D7 D6 D5 D4 D3 D2 Dl DO ; Reference = 3400 = 0D48h SHARP_REF8DF EQU 3D ; 0 0 H H Dll D10 D9 D8 B'0011' Dh SHARP_REFODF EQU 48 ; D7 D6 D5 D4 D3 D2 Dl DO ; Seting Options for Normal Operating Mode=B'0000 1010 0000 0000' SHARP_OPT8DF EQU 0A ; 0 0 L L Dll D10 D9 D8 383 SHARP_OFT0DF ΞQU 00 ; Dl D6 D5 D4 D3 D2 D l DO #ENDI F ; [A2 ] - [AB] Default PLL Settings (description see upword) PLLDR1H ECU 00 PLLDR1L EQU 00 PLLDR2H EQU 00 PLLDR2L EQU 00 PLLDR3H EQU 00 PLLDR3L EQU 00 PLLDR4H EQU 18 PLLDR4L EQU 0C3 PLLDR5H EQU 3D PLLDR5L EQU 0E0 PLLDR6H EQU 00 PLLDR6L EQU 0DF PLLDR7H EQU 00 PLLDR7L EQU 00 org OOOOh goto START 09.04.98 18:00 MH_RF.asm UART, 14.7456 MHZ, FIFO 8 KB M.Kholod org 0004h GOTO INT HANDLERR ****** ROM Constants ****** PLLSetDF: clrf PCLATH Should be in page 0 ADDWF PCL,F NOP NOP RETLW PLLDR1H RETLW PLLDR1L 384 RETLW PLLDR2H RETLW PLLDR2L RETLW PLLDR3H RETLW PLLDR3L RETLW PLLDR4H RETLW PLLDR4L RETLW PLLDR5H RETLW PLLDR5L RETLW PLLDR6H RETLW PLLDR6L RETLW PLLDR7H RETLW PLLDR7L EncodeTable: ; RF Message Encoding Table clrf PCLATH ; Should be in page 0 addwf PCL,F retlw B'01001010' Oh retlw B'01010010' lh retlw B'01011010' 2h retlw B'01101010' 3h retlw B'01001100* 4h retlw B'01010100' 5h retlw B'01100100' 6h retlw B'01101100* 7h retlw B'10010010' 8h retlw B'10011010' 9h retlw B'10101010' Ah retlw 3'IOHOOIO' Bh retlw B'10010100' Ch retlw B'10100100' Dh retlw B'lOlOllOO' Eh retlw B'10110100' Fh DecodeTable: RF Message Decoding Table clrf PCLATH Should be in page 0 addwf PCL,F Input: Corrected to: retlw B'00001000' 00000 00100 retlw B'00001100' 00001 00101 retlw B'00001001' 00010 00110 retlw B'00001110' 00011 01011 retlw B'00001000' 00100 retlw B'00001100' 00101 retlw B'00001001' 00110 385 retlw B '00001001' 00111 00110 retlw B • 00001101' 01000 01010 retlw B • 00001101' 01001 retlw B • 00001010' 01010 retlw B • 00001110' 01011 retlw B • 00001011' 01100 retlw B '00001111' 01101 retlw B • 00001011' OHIO 01100 retlw B '00001111' 01111 01101 retlw B ■ 00000000' 10000 10010 retlw B 1 '00000100' 10001 10011 retlw B' ΌOOOOOOO* 10010 retlw B 1 ΌOOOOIOO* 10011 retlw B' ΌOOOOOOI* 10100 retlw B' 00000101* 10101 retlw B' 00000010* 10110 retlw B' 00000010' 10111 10110 retlw B' 00000110' 11000 11001 retlw B* 00000110* 11001 retlw B' 00000011' 11010 retlw B' 00000111' 11011 retlw B' 00000001' 11100 10100 retlw B' 00000110' 11101 11001 retlw B' 00000011' 11110 11010 retlw B' 00000111' 11111 11011 (♦INCLUDE "MHfιfo8K . asm" ; FIFO BUF SHARPSET Set SHARP Registers to default SHARPSET: BSF FCOMH,_2L3 =1 -> For 19 Bit : Length = 3 MOVLW SHARP_RX16DF MOVWF PLLADR MOVLW SHARP_RX08DF MOVWF PLLDATH MOVLW SHARP_RX00DF MOVWF PLLDATL CALL SHARP_W MOVLW SHARP_TX16DF MOVWF PLLADR 386 MOVLW SHARP TX08DF MOVWF PLLDATH MOVLW SHARPJTXOODF MOVWF PLLDATL CALL SHARP_W BCF FCOMH,_2L3 =0 -> For 14 Bit : Length = 2 MOVLW SHARP_REF8DF MOVWF PLLADR MOVLW SHARP_REF0DF MOVWF PLLDATH CALL SHARP W MOVLW SHARP_OPT8DF MOVWF PLLADR MOVLW SHARPJDPTODF MOVWF PLLDATH CALL SHARP_W RETURN PLLSetup - Set Compander Registers to default PLLSetup: CLRF PLLADR MOVLW 7 MOVWF PLLSCNT PLLSetL: INCF PLLADR, F (PLLADR) := Addr=ι (i=l, 2, . ., 7) BCF STATUS , C C:=0 RLF PLLADR, W *2 CALL PLLSetDF ; (W) := PLLDRiH, ι=l, ...,7 MOVWF PLLDATH BCF STATUS , C ; C:=0 RLF PLLADR, W ; *2 ADDLW 1 CALL PLLSetDF ; (W) := PLLDRiL MOVWF PLLDATL 387 CALL PLL W Write ( output ) to PLL DECFSZ PLLSCNT , F GOTO PLLSetL RETURN PLLListenOpen => Set: Tx-Mute; Rx-on; Spk-on ( listen open => bits: 1 0 0 ) PLLListenClose => Set: Tx-on; Rx-Mute; Spk-Mute ( listen close => bits: 0 1 1 ) PLLListenOpen MOVLW 04 MOVWF PLLADR MOVLW PLLSH4L MOVWF FSR in BANK 1, indirect MOVF INDF,W ANDLW 0F8 ; clear last 3 bits: Tx, Rx, Spk IORLW 04 ; 4=100 => Tx-Mute; Rx-on; Spk-on GOTO PLLListen PLLListenClose MOVLW 04 MOVWF PLLADR MOVLW PLLSH4L MOVWF FSR in BANK 1, indirect MOVF INDF, W ANDLW 0F8 ; clear last 3 bits: Tx, Rx, Spk IORLW 03 ; 3=011 => Tx-on; Rx-Mute; Spk-Mute PLLListen ; Common: MOVWF PLLDATL MOVLW PLLSH4H MOVWF FSR in BANK 1, indirect MOVF INDF,W MOVWF PLLDATH 388 CALL PLL W RETURN PLL_W - write (output) to PLL (Compander) (PLLADR) = fACOMHO) = Reg. Number (1 . . 7) (PLLDATH, PLLDATL) =MSB,LSB= (ACOMHO+1, ACOMHO+2) PLL W: BSF ENMC PORT,ENMC ; EN := 1 BSF PLL LENG, 7 p=l -> Leng = 8 Bits: All Byte MOVF PLLADR, W MOVWF FSR ; Addr = . Reg . : 1 . . 7 CALL PLLOut ; Out Addr. ??? If (W) = 0 or (W) > 7 ??!! BCF STATUS, ι z ; C:=0 RLF FSR,W ; *2 ADDLW PLLSHAD MOVWF FSR ; Address PLLSHiH BCF ENMC_PORT r ENMC ; EN := 0 MOVF PLLDATH, ; PLLDATH MOVWF INDF ; Save PLLDATH to Shadow (indirect) CALL PLLOut ; Output MSB-Byte to PLL MOVF PLLDATL, W ; PLLDATL INCF FSR,F ; Address PLLSHiL MOVWF INDF ; Save PLLDATL to Shadow (indirect) CALL PLLOut ; output LSB-Byte to PLL BSF ENMC_PORT, ,ENMC ; EN := 1 NOP US NOP / US NOP r US BCF ENMC_PORT,ENMC EN := 0 RETURN SHARP V - Write (Output) to PLL SHARP: (PLLADR, 389 PLLDATH , PLLDATL) = (ACOMH0 , ACOMHO+ 1 , ACOMHO+2 ) FCOMH, _2L3=0 ( Leng=2 ) -> For 14bit / =1 -> For 19 bit 0 0 [ 0 ] MSB = a , b , D16 ( o r Dl l ) . . D2 , Dl , DO = LSB ab : 10=RX, 01=TX, ll=Ref erence , 00=Options SHARP W : MOVLW 08 MOVWF PLL LENG Bits: LSB = DO Dl D7 SKIP_IF_SET FCOMH,_2L3 GOTO SHARPW14 ; 0 -> Leng = 2 -> For 14 bit 1 -> Leng = 3 -> For 19 bit: MOVLW SHARP_RX00 For 19 bit SKIP_IF_SET PLLADR, 2 2 2 ADDLW 03 0000 OOlx = 0000 OLHx -> SHARPJTX00 MOVWF FSR MOVF PLLDATL,W PLLDATL = ACOMHO+2 = D7 - DO for 19 bit GOTO SHARPW2 SHARPW14: 0 -> Leng = 2 -> For 14 bit MOVLW SHARP_REF0 For 14 bit SKIP_IF _SET PLLADR, 5 5 5 ADDLW 02 0000 xxxx = 00LL xxxx -> SHARP_OPT0 MOVWF FSR MOVF PLLDATH, W ; PLLDATH = ACOMHO+1 = D7 - DO for 14 bit SHARPW2 : MOVWF INDF ; Save SHARP LSB-BYTE to Shadow (indirect) CALL PLLOut ; Output LSB-Byte to SHARP: DO Dl . . D7 DECF FSR,F MOVLW 06 ; 6 Bits: D8 D9 D10 Dll b a - MSB SKIP_IF_SET FCOMH, _2L3 GOTO SHARPW4 ; 0 -> Leng = 2 -> For 14 bit Leng = 3 -> For 19 bit MOVF PLLDATH, W ; PLLDATH = ACOMHO+1 = D15 - D8 for 19 bit MOVWF INDF ; Save SHARP middle-BYTE to Shadow (indir.) CALL PLLOut ; Out middle-Byte to SHARP: D8 D9 . . D15 DECF FSR, F MOVLW 03 3 Bits: D16 b a MSB 390 SHARPW4 : MOVWF PLL_LENG MOVF PLLADR, W MOVWF INDF ; Save SHARP MSB-BYTE to Shadow (indirect) CALL PLLOut ; Out MSB-Byte to SHARP: . . D16 (Dll) b a BSF ENRF_PORT,ENRF EN NOP US NOP US NOP US NOP > 1 . 0 U 5*Tcomm = 5cycl = 1.35 U BCF ENRF PORT, ENRF ; EN := 0 RETURN PLLOut - Out PLL_LENG (8 . . 1) Bits (W) to PLL (Compander) PLL_LENG = pOOO 1111, 1111 = Leng (1, 2, . ., 8), p = 1 = Mc = MSB — LSB / p = 0 = SHARP = LSB - MSB PLLOut: MOVWF PLLBYTE MOVLW 08 SKIP_IF_SET PLL_LENG,7 MOVF PLL_LENG,W p=0 -> SHARP -> W := Leng <= 8 MOVWF PLLCOUNT PLLOutL: ; loop SKIP_IF_NOT PLL_LENG,7 2 cycl GOTO PLLOutMc p = 0 -> SHARP -> LSB — MSB MOVLW OFC ; -4 • 1 cycl PLLOutSH: ADDLW 01 • 1 cycl SKIP_IF _Z • 5 = 3+2 GOTO PLLOutSH • 6 = 3*2 RRF PLLBYTE, F ; C := LSB 1 cycl GOTO PLLOutSHARP 2 cycl ; tCKR = Rate of CLK = 18 + 3 (cycles) > 5 U PLLOutMc : RLF PLLBYTE, F ; C := MSB PLLOutSHARP: 391 SKI P_ _NC GOTO PLLOutl ; c = 1 BCF DATA_PORT , DATABIT ; DATA = C GOTO PLLOutC PLLOutl : BSF DATA PORT , DATABIT DATA = C = 1 PLLOutC : NOP ; > 0.1 U Tcomm = lcycl = 0.27 U BSF CLK_PORT,CLK ; CLK := 1 NOP ; US NOP ; US NOP ; US NOP ; > 1.0 U 5*Tcomm = 5cycl = 1.35 U BCF CLK PORT, CLK ; CLK := 0 RBI NOP ; US >= 5 u ?7?77 7 ?? i i i i i i i i i i US NOP ; US DECFSZ PLLCOUNT,F GOTO PLLOutL ; loop RETURN PLL_R - Read Bytes (MSB, SB) from Shadow Memory to (PSHDATH, PSHDATL) =MSB,LSB= (ACOHMO+l, ACOHMO+2) (PSHADR)= (ACOHMO) := (PLLADR) = (ACOMH0 ) = N. Reg. PLL R: MOVF PLLADR,W MOVWF PSHADR MOVWF FSR address BCF STATUS, C C:=0 RLF FSR,W *2 ADDLW PLLSHAD MOVWF FSR ; address PLLSHiH MOVF INDF,W ; Restore (MSB) from Shadow (indirect) MOVWF PSHDATH ; to PSHDATH INCF FSR, F ; address PLLSHiL MOVF INDF,W ; Restore ( LSB) from Shadow ( indirect) 392 MOVWF PSHDATL ; to PSHDATL RETURN SHARP_R - Read Bytes (3 - for 19 bit or 2 - for 14 bit) from Shadow Memory to (PSHADR, PSHDATH, PSHDATL) = (ACOHMO,ACOHMO+1,ACOHMO+2) (PLLADR) = xxxx xxcd: 00=RX, 01=TX, 10=Reference, ll=Optιons SHARP R: SKIP_IF_NOT PLLADR, 1 c = ? GOTO SHARPR14 Ix -> for 14 bit: REFerence or OPTions Ox -> for 19 bit (3 Bytes): RX or TX MOVLW SHARP_RX16 00 -> RX SKIP_IF_NOT PLLADR, 0 d = ? MOVLW SHARPJT 16 01 -> TX MOVWF FSR MOVLW 03 GOTO SHARPR2 SHARPR14: lχ -> Leng = 2 (For 14 bit) MOVLW SHARP_REF8 10 -> OPTions SKIP_IF_NOT PLLADR, 0 d = ? MOVLW SHARP_OPT8 11 -> REFerence MOVWF FSR MOVLW 02 SHARPR2 : MOVWF HLENG MOVF INDF,W Restore (MSB) from Shadow (indirect) MOVWF PSHADR INCF FSR,F MOVF INDF,W MOVWF PSHDATH INCF FSR, F MOVF INDF,W MOVWF PSHDATL RETURN MZP/MZP0 - Move (W)/00 to Addr=(FSR) Length= (M_CNT! 393 MZPO: CLRW MZP: MOVWF INDF INCF FSR, F DECFSZ M_CNT,F GOTO MZP RETURN Start of Program START: RAM20-RAM7F, RAMAO-RAMFF := OOh CLRF FSR BSF FSR, 5 ; FSR := 20h MZP00_L: SKIP_IF_NOT FSR, 7 BSF FSR, 5 FSR=80h -> FSR := AOh CLRF INDF INCFSZ FSR, F GOTO MZP00 L ; PowerOn Settings ; Initialize A/D SELECT_BANK_1 ; ' ' Bank 1 ' ' ' movlw 0x05 movwf ADCON1 ; Select RA0,RA1 - Analog Input, Vref=RA3 SELECT_BANK_0 ' ' Bank 0 » ' ' movlw B' 10000001' movwf ADCON0 ; Select Fosc/32, ChannelO-RAO, A/D-On Initialize USART SELECT_BANK_1 ' ' Bank 1 ' " movlw 0x01 Set Baud Rate for 115.200KHZ ■ ■ movwf SPBRG = 14745.6KHZ / ( 64* (SPBRG+1) ) bcf TXSTA, SYNC Set Asynchronoys Mode bcf TXSTA, BRGH Set Low Speed Baud Rate SELECT_BANK_0 ' ' Bank 0 • ' ' bs f RCSTA, CREN Enable RX bsf RCSTA, SPEN Enable Serial Port 394 SELECT_BANK_1 Banx 1 bs f TXSTA, TXEN ;bcf TRISC, TX Set RF frequency 8.014KHZ and Presc. = 4 = T2CON,0:=1 RF ' ' ' SELECT_BANK_1 ; ' • Bank 1 ' • * movlw RF_PR2 ; (RF) , 14745.6/ ( 4*8kHz) - 1 = 115.2-1 = 114 Set PWM frequency 8*7=56KHZ ;Set Tιmer2 for 8 kHz frequency ;US (PWM) movlw PWM_PR2 ; 14745.6/ (4*8kHz*7) - 1 = 64.8 = 65 movwf PR2 1 ' Bank 1 ' ' ' SELECT_BANK_0 ' ' Bank 0 ' ' ' movlw 01 ; (RF) Set Prescaler (Postscaler=l) to 4:1 = 4 ;US (PWM) movlw 00 ; Set Prescaler & Postscaler to 1 movwf T2CON movlw OVERSAMPLING movwf PWM_Cntr ; Setup PWM Pulse Counter clrf Sample Setup Sample Index ; Set PWM Duty Cycle CLRF CCPR1L ; Enable Tιmer2 Interrupt BCF PIR1, TMR2IF Clear Int Flag SELECT_BANK_1 1 ' Bank 1 " • bsf PIE1, TMR2IE Enable TMR2=PR2 Int bsf INTCON, PEIE Enable Peripheral Int bsf INTCON, GIE Global Int Enable ; Set CTS, RX_DATA to input and PWM Pin, TX_DATA to Output ' ' Bank 1 I I BSF CTS_TRIS,CTS_BIT =1 -> CTS = RC1 to Input BSF RX_DATA_P,RX_DATA =1 -> RC4 to Input BCF TRISC, 2 =0 -> PWM = RC2 to Output BCF TX DATA P,TX DATA =0 -> RA2 to Output CCPlCON,3 1 -> PWM-Mode: CCP1CON<3:0> = llxx / = 0 -> Not PWM ADCON0, ADON 1 -> Yes A/D = A/D On, = 0 -> Not A/D SELECT_BANK_0 ' ' Bank 0 ' ' ' CALL PLLSetup ; Set Compander Registers to default NOP ;US CALL SHARPSET ; Set SHARP Registers to default MOVLW 81 ; RESET ACK GOTO M START2 395 M_START : <=== Break HUB SELECT_BANK_0 ' ' Bank 0 ' ! ! MOVLW 82 M_START2 : MOVWF HTYPE ; ACK RESET (81) or BREAK (82) CLRF HLENG CLRF MF ; 0 -> wait COMH PC -> HUB BSF MF,COHM ; Yes COHM: HUB -> PC: BCF CCP1C0N,3 ; Disable PWM BCF ADCON0, ADON ; Disable A/D, Switch Off CLRF MFH CLRF FCOMH CLRF FCOHM CLRF MCODE CLRF MSTATUS MLOO i /PcD0fiU0CUi: • . ; Start PWM or A/D -> BUF_SET CLRF FRF ; RF all over again CALL BUF_SET ; Reset FIFO (RTS_BIT:=0 - Rec. from PC) NOP ;US Enable Timer2 ; ! ! Bank 0 ! ! ! BSF T2CON, TMR20N ; Enable Timer2 MLOOP : SKIP_IF_SET RCSTA, OERR ; Overrun Error Bit GOTO MLCOMH ; 0 -> Not Error UART Error USART: Overrun Error Bit = 1 (RCSTA=18h = 92h ) BCF RCSTA, CREN ; Receive Enable Bit := 0 -> Enable Change BCF RCSTA, OERR ; Overrun Error Bit := 0 -> No Error BSF RCSTA, CREN ; Restore Bit := 1 MLCOMH : SKIP_IF_NOT MF,PWMS GOTO MLPWMS 1 -> PWM Mode NOP ;US CALL MCOMH 0 -> COMM: PC -> HUB MOVWF MCODE SKIP_IF_SET MCODE, 7 GOTO MLCOHM OXh => Cycle: MCOMH->MCOHM->RF-> SKIP IF SET MCODE, 6 396 GOTO MLOOP00 ; 8Xh => Start PWM (A/D) and Stop A/D (PWM) SKIP_IF_SET MCODE, 5 GOTO M_START ; CXh => Break HUB SKIP_IF_SET MCODE, 4 GOTO START ; EXh => Reset HUB CLRF FCOMH FXh: Error COMM: FCOMH := OOh MOVF MCODE, W MOVWF MSTATUS SKIP_IF NOT MF,COPW BSF MF, PWMS ; FXh & COPW=l: Restore PWM Mode: PWMS:=1 GOTO MLCOHM ; Cycle: MCOMH->MCOHM->RF-> MLPWMS : NOP ;US CALL MPWMS NOP ;US MOVWF MCODE GOTO MLCOHM Cycle: MPWMS ->MCOHM-> MLCOHM: SKIP_IF_ _SET MF,COHM GOTO MLCOHMRF ; COHM = 0 -> Test COHMRF NOP ;US CALL MCOHM NOP ;US MOVWF MCODE GOTO MLOOP Cycle: MCOHM->MCOMH MLCOHMRF: SKIP_IF_SET MF, COHMRF GOTO MLADSM ; COHMRF = 0 -> Not COHM, Test A/D NOP ;US CALL MCOHM ; For COHMRF NOP ;US MOVWF MCODE GOTO MLOOP ; Cycle: MCOHM->MCOMH MLADSM: SKIP_IF_SET MF,ADSM GOTO ML_RF Cycle: MCOMH-XMADSM) ->RF-> . NOP ;US CALL MADSM 397 NOP ;US MOVWF MCODE ML_RF: ; Cycle: MCOMH-XMADSM) ->RF-> . . . SKIP_IF_NOT MF,COPW GOTO MLOOP ; COPW=l : Yes PWM (Not yet[od lo] End PWM) SKIP_IF_NOT FRF,_BUSY GOTO MLOOP ; =1 -> RF - Busy SKIP_IF_NOT MF,COHM ; {HE HADO ??) GOTO MLOOP ; Yes COHM: Not RF ?? TX/RX ?? {HE HADO ?) SKIP_IF_NOT MF, COHMRF GOTO MLOOP ; COHMRF=l -> Yes COHM: Not RF ?? TX/RX ?? SKIP_IF_SET MF,RFTX GOTO MLRFRX ; RX: PWMS=COPW=RFTX=COHM=0 : RF RX Message ; TX: PWMS=COPW=0, RFTX=1: Transmit = Send Message NOP ;US CALL MRFTX ; Prepare RF TX, Start TX, Transmit in Inter. NOP ;US MOVWF MCODE GOTO MLOOP ; Cycle: MCOMH-> (MADSM) ->RF->MCOMH. . . MLRFRX : NOP ;US CALL MRFRX ; RX: PWMS=COPW=RFTX=COHM=0 : RF RX Message NOP ;US MOVWF MCODE GOTO MLOOP ; Cycle: MCOMH-XMADSM) ->RF->MCOMH. . . MRFTX : ; RFTX=1: Transmit = Send Message -> Prepare RF TX CLRF M8CNT INCF M8CNT,F CLRF FRF MOVLW SYNC5L ; Prepare Sem MOVWF RFMCNT ; 5*SYN( MOVLW SYNC01B MOVWF RF BYTE ; S SYYNNCC 1Byte: 01010101 398 MOVLW 08 MOVWF RF CNT ; 8 Bits MOVLW TXTYPE MOVWF RF_FSR Addr BUF TX = Alh BSF FRF,_BUSY Ready to RF TX RETLW 00 MRFRX : RFTX=0 : Receive RF All Mes sage NOP ; US CLRF M8CNT INCF M8CNT, F CLRF FRF MOVLW RXTYPE MOVWF FSR Addr BUF RX = COh (BE, BF, CO, . ., CF) CLRF M_CNT BSF M_CNT,3 ; := 8 CALL MZPO ; MZP/MZPO - Move (W)/00 to Addr=(FSR) Leng=(M_CNT) NOP ;US CLRF RF_CNT BSF FRF,_BUSY ; RFBO - RFB7, RF_CNT, . . ready to RF RX RETLW 00 MCOMH: ; PC -UART_R-> HUB (MBYTE) SKIP_IF_NOT MFH,_CMB GOTO MCMH ; 1: Yes Byte, -> Processing (HADO EGO 06PA60TAT6) MCMHR: ; _CMB = 0: Read Byte from UART (PC -> HUB) SKIP_IF_SET PIR1, RCIF RETLW 02 ; RCIF = 0 -> Not UART Byte from PC ;US CALL IMPULS TEST IMPULS I |- BPEMEHHO Yes UART Byte from PC to HUB -> W MOVF RCREG,W MOVWF MBYTE MCMH: ; Processing (06PA60TKA) MBYTE from PC BCF MFH,_CMB ; _CMB = 0: Byte olredy Processing 399 MOVF MBYTE, SKIP_IF_NOT FCOMH, _COM GOTO MCMHCOM SKIP_IF_NOT FCOMH, _LEN GOTO MCMHLEN SKIP_IF_NOT FCOMH, _TYP GOTO MCMHTYP SKIP_IF_NOT FCOMH, _SYN GOTO MCMHSYN BSF FCOMH, _SYN SKIP_IF_WNEQUL OFF 0-Byte = HEADO = FFh ? RETLW 00 Yes -> MCOMH->MCOHM->MPWMS-> . . . RETLW OFF Error (Head 0 # FFh) -> Clean FCOMH MCMHSYN: ; Sync-Byte = 05 BSF FCOMH, _TYP SKIP_IF_WNEQUL MSYNC RETLW 00 ; = 05h -> MCOMH->MCOHM->MPWMS->MADSM->MCOMH RETLW 0F5 ; Error (Head 1 # 05h) -> Clean FCOMH MCMHTYP : Type: p.6=l=TOY / 0=HUB; p.5=l=Yes ACK / 0=No BSF FCOMH,_LEN MOVWF MTYPE MOVWF SCOMH RETLW 00 ; MCOMH->MCOHM->MPWMS->MADSM->MCOMH . MCMHLEN : BSF FCOMH, _COM ADDWF SCOMH, F KS MOVWF MHCNT MOVLW ACOMH0 SKIP_IF_SET MTYPE, 6 GOTO MCMHLEN2 ; =0: PC -> HUB: COMH =1: PC -HUB-RF_TX-> TOY: COM RF TX SKIP_IF_NOT MF,RFTX CLRF FRF 1: RF TX Stop TX 400 BCF MF, RFTX always to RF RX MOVLW RXTYPE MOVWF FSR MOVF MTYPE, MOVWF INDF INCF FSR, F MOVF MHCNT,W MOVWF INDF ADDWF MHCNT,W (W) : = 2 MHCNT ) ADDLW 06 2* 3 (TYPE+LENG+KS ) -> MOVWF TX_CNT For RF TX : (TX_CNT) : = 2* ( Length+3 ) MOVLW BMTO MCMHLEN2 : MOVWF ACOMH ; = ACOMHO(BMHO) or BMTO (BUFF RF TX) BCF FCOMH, _2L3 ; Length = 0, 2, . . . even (4ETH) SKIP_IF_ NOT MHCNT,0 BSF FCOMH,_2L3 =1 -> Length = 1, 3, . . . odd (HE4ETH) INCF MHCNT,F CNT := Leng COMM + 1(KS) RETLW 00 MCOMH->MCOHM->MPWMS->MADSM->MCOMH . . . MCMHCOM: MOVF ACOMH, W INCF ACOMH, F MOVWF FSR MOVF MBYTE, W MOVWF INDF ADDWF SCOMH, F KS DECFSZ MHCNT,F RETLW 00 ; Current (TEK) Byte COMH: ->MCOHM->(MADSM) ->MCOMH End COMM: (W) = KSR, SCOMH = KS + KSR ( = 2*KS ? ) ADDWF INDF,W ; (W) := KSR + KSR SKIP_IF_WEQU SCOMH RETLW 0F7 ; 2*KSR # KS+KSR -> KS KSR •> Error ; KS=KSR -> OK: Prepare to RF TX -> TOY and to Read COMM again (CHOBA ) CLRF FCOMH ; Prepare to Read COMM again (CHOBA ) SKIP_IF_NOT MF,COPW BSF MF, PWMS ; COPW=l: PWM Not end => Continue PWM 401 SKIP_IF_SET MTYPE, 6 GOTO MCOMHAN ; 0: PC -> HUB: COMH -> Analiz MTYPE, COMH BSF MF,RFTX ; 1: PC -HUB-RF_TX-> TOY: RF TX RETLW 00 ; ->MRFTX->MCOHM->(MADSM) ->MCOMH MCOMHAN: ; COMH end: ANALIZ MTYPE&COMH and PROCESSING{06PA60TKA) COMH SKIP_IF_NEQUL MTYPE, 00 GOTO MH00PWM ; PC -> FIFO (IK) and Enable PWM !'* SKIP_IF_NEQUL MTYPE, 01 GOTO MH01PLP ; Fluent End PWM (PLABH 3ABEPWEHIE DO IC4EP BUF) SKIP_IF_NECUL MTYPE, 02 GOTO MH02ATD ; Enable A/D: HUB -> PC SKIP_IF_NEQUL MTYPE, 11 ;USx2 (BPEMEHHO) GOTO MH11TSTPW ; PC -> HUB (PWM) : 00 01 . . FE FE(#FF) 00 SKIP_IF_NEQUL MTYPE, 12 ;USx2 (BPEMEHHO) GOTO MH12TSTAD ; HUB -> PC (A/D): 00 01 . . FE FE(#FF) 00 SKIP_IF_NECUL MTYPE, 20 GOTO MH20VER ; HUB Get Version SKIP_IF_NEOUL MTYPE, 21 RETLW 0E0 ; HUB Reset => START SKIP_IF_NECUL MTYPE, 22 RETLW 0C0 ; HUB Break: Stop PWM and A/D => M_START SKIP_IF_NEOUL MTYPE, 23 GOTO MH23WMC ; Write to PLL (Compander Motorola) SKIP_IF_NEQUL MTYPE, 24 GOTO MH24RMC ; Read from Shadow Memory (Comp. Motorola ) SKIP_IF_NEQUL MTYPE, 25 GOTO MH25WSH ; Write to SHARP SKIP_IF_NEQUL MTYPE, 26 402 GOTO MH26RSH ; Read from Shadow Memory SHARP SKIP_IF_NECUL MTYPE, 2E GOTO MH2EMES ; HUB Get Status MHO0PWM: ; PC -> FIFO ({3APOLHEHIE FIFO HA) IK) and Enable PWM BCF ADCON0, ADON A/D Off BCF MF,ADSM Disable A/D BSF MF, COPW BSF MF, PWMS RETLW 80 => MLOOP00 -> BUF SET ->MPWMS->MCOMH MH01PLP: ; Fluent End PWM {PLABH 3ABEPWEHIE DO IC4EP Buff}} SKIP_IF_SET MF,COPW RETLW 01 COPW=0 = Not Source PWM: Ignore COMM BSF MFH,PLA PWM - Not Finish. MF, PWMS:=1 already !! RETLW 00 MCOMH->MPWMS->MCOHM->(MADSM)->MPWMS . . MH02ATD : ; Enable A/D HUB -> PC (and Disable PWM) BCF MF, PWMS BCF MF, COPW BSF ADCON0, ADON ; A A//.D Switch On BSF MF,ADSM RETLW 80 => MLOOP00->BUF SET->MCOMH->MCOHM|MADSM->MCOMH . . MH11TSTPW: ; T TEESSTT:: PC -> HUB (PWM): 00 01 . . FE FE(#FF) 00 01 CLRF MM CLRF MM1 CLRF MM11PW BSF MFH,TSTPW BSF MF,COPW BSF MF, PWMS RETLW 00 MCOMH->MCOHM->MPWMS-> (MADSM) ->MPWMS MH12TSTAD: ; ; TTEESSTT:: HUB -> PC (A/D) : 00 01 FE FE(#FF) 00 01 CLRF MM12AD BSF MFH,TSTAD BSF ADCON0, ; 403 BSF MF, ADSM RETLW 00 ; MCOMH->MCOHM | MADSM->MCOMH . MH20VER: ; HUB Get Version MOVLW 80 MOVWF HTYPE MOVLW 01 MOVWF HLENG MOVLW M_VER MOVWF ACOHMO ; 83: 8 = Year (98), 3 = Month (March) BSF MF, COHM BCF FCOHM,_MES ; Not Message RETLW 00 ; MCOMH->MCOHM->MCOMH . . . MH23WMC: ; Write to PLL (Compander Motorola) . Addr, MSB-Byte, LSB CALL PLL_W MOVLW 83 GOTO MH24RMC2 MH24RMC: ; Read from Shadow Memory (Compander Motorola) MOVLW 84 MH24RMC2: MOVWF HTYPE MOVLW 03 MOVWF HLENG CALL PLL R ; (ACOHMO) := (ACOMH0), Restore MSB, LSB BSF MF,COHM BCF FCOHM, _MES ; Not Message RETLW 00 ; MCOMH->MCOHM->MCOMH MH25WSH : ; Write to SHARP CALL SHARP_W MOVLW 85 GOTO MH26RSH2 MH26RSH : ; Read from Shadow Memory SHARP MOVLW 86 MH26RSH2 : MOVWF HTYPE 404 CALL SHARP R BSF MF,COHM BCF FCOHM, _MES ; Not Mes s age RETLW 00 ; MCOMH->MCOHM->MCOMH MH2EMES ; HUB Get Status BSF MF, COHM BSF FCOHM, _MES ; Message S tatus RETLW 00 ; MCOMH->MCOHM->MCOMH MCOHM: ; HUB (HBYTE) -UART_W-> PC SKIP_IF_NOT CTS_TRIS,CTS_BIT ; CTS = RC1 RETLW 04 ; CTS=1 => PC Not Ready to Read Check USART Busy SELECT_BANK_1 ; ' ' Bank 1 ' ' • SKIP_IF_NOT TXSTA, TRMT GOTO MCHM =1 it is possible Send HUB -> PC SELECT_BANK_0 • • Bank 0 ■ ' ' Not Delete ' ' ' RETLW 03 USART busy: MCOHM->MCOMH (MPWMS) . . MCHM: ; Prepare (PODGOTOBKA) HBYTE to Send HUB -> PC SELECT_BANK_0 ; ' ' Bank 0 ' ' • Not Delete ' ' ' SKIP_IF_NOT FCOHM, _COM GOTO MCHMCOM SKIP_IF_NOT FCOHM, _TYP GOTO MCHMTYP SKIP_IF_NOT FCOHM, _SYN GOTO MCHMSYN BSF FCOHM, _SYN MOVLW OFF 0-Byte Packet = HEAD0 = FFh GOTO MCOHMSEND MCHMSYN: ; Sync-Byte 05 BSF FCOHM,_TYP MOVLW MSYNC GOTO MCOHMSEND 405 MCHMTYP : BSF FCOHM, _LEN SKIP IF SET FCOHM, MES GOTC MCHMTYP2 MES = 0 => Not Special HUB Message ; Yes Special HUB Message (Error or Information) : BCF FCOHM, MES MOVLW 8E MOVWF HTYPE MOVLW 04 MOVWF HLENG MOVLW M_VER MOVWF ACOHMO 83: 8 = Year (98), 3 = Month (March) MOVF MSTATUS , W MOVWF ACOHMO+1 see STATUS, MCODE = HUB Status MOVF BCM,W MOVWF ACOHMO+2 MOVF BCM+1,W MOVWF ACOHMO+3 BCM = (BCM=BCH, BCM+1=BCL) - free space ) ; BSF FCOHM, _COM CLRF SCOHM MOVF HLENG, W W := Length COHM (SENSOR or ACK) to PC ADDLW 03 MOVWF HM_CNT CNT = n+3 = Length+3 (Type, Length, KS) MOVLW HTYPE SKIP_IF_NOT MF,COHM GOTO MCHM2 COHM=l: Yes COHM, Not COHMRF BCF MF, COHMRF COHM = 0 -> Not COHM, Yes COHMRF BSF MF, COHM Chang: COHMRF <--> COHM MOVF RX_CNT,W W := Length COHMRF (SENSOR or ACK) MOVWF HM_CNT CNT = n+3 = Length+3 (Type, Length, KS) MOVLW RXTYPE MCHM2: MOVWF ACOHM MCHMCOM: DECFSZ HM_CNT,F GOTO MCHMCOM2 406 ; END COHM: SENSOR (ACK) already Sent to PC: Send KS, COHM:=0, FCOHM:=0 BCF MF, COHM CLRF FCOHM MOVF SCOHM, W MOVWF TXREG ; Send KS to PC, and then RETLW 00 ; MCOHM->MCOMH . . . MCHMCOM2 : Send Current (TEK) Byte COHM to PC MOVF ACOHM, W INCF ACOHM, F MOVWF FSR MOVF INDF,W ADDWF SCOHM, F ; KS ; {HE HADO?) GOTO MCOHMSEND NOP MCOHMSEND: Send Byte to USART MOVWF TXREG RETLW 00 MCOHM->MCOMH / MPWMS: ; PC -UART-> MBYTE -FIFO-> Sample PWM ========- SKIP_IF_SET MFH,_PWM ; \ GOTO MPWM ; _PWM = 0 => Sample od lo Sing, in Int(8KHZ) :=1 SKIP_IF_SET MFH,_DAT ; { BCE EWE P04TI } GOTO MPWM ; DAT = 0 -> FIFO still almost empty < IK Prepare Next Sample to Play CLRW CALL BUF_R SKIP_IF_C GOTO MPWSAMPL ; C = 0 FIFO Not empty -> OK SKIP_IF_SET MFH,PLA GOTO MPWM ; FIFO empty & Not PLA end ; C=l & PLA=1: FIFO empty & PLA end: Stop PWM, COHM (ACK) to PC and Wait COMM BCF MFH, PLA BCF MFH,_DAT ; FIFO empty -> especially (TEM 60LEE) < IK 407 BCF CCP 1CON , 3 0 -> Not PWM Set RF frequency 8 . 014KHZ and Pres c . = 4 = T2CON , 0 : = 1 RF SELECT_BANK_1 1 ' Bank 1 ' ' * movlw RF_PR2 ; ( RF) 14745.6/ (4*8kHz) - 1 = 115.2-1 = 114 movwf PR2 1 ' Bank 1 ' ' ! SELECT_BANK_0 1 ' Bank 0 ' • ' BSF T2CON,0 ; (RF) Set Prescaler (Postscaler=l) to 4:1 = 4 BCF MF, PWMS BCF MF, COPW BSF MF, COHM CLRF HLENG MOVLW 90 Status: Finish PWM (COHM: HM90PWMF) MOVWF HTYPE RETLW 09 Stop PWM and => COHM => HM90PWMF MPWSAMPL: ; C = 0 -> FIFO Not empty -> OK MOVWF Sample Set next PWM Sample BCF MFH,_PWM PWM := 0 -> Prepare: Not Read BSF MFH,TSMPL 1: Sample renewed (06HOBILOC6} SKIP_IF _NOT MM1,3 GOTO MPWM RLF MM1,W ANDLW 0E ADDLW 0F0 MOVWF FSR MOVF Sample, W MOVWF INDF INCF MM1,F INCF FSR, F DECF BARL,W MOVWF INDF MPWM: ; Read Packet Data: PC -UART-> HUB -> FIF08K SKIP_IF_SET PIR1, RCIF RETLW 02 ; RCIF = 0 -> Not UART Byte from PC ;US CALL IMPULS ; TEST IMPULS I BPEMEHHO Yes UART Byte from PC to HUB ( -> W ) MOVF RCREG,W 408 MOVWF MBYTE SKIP_IF_WECUL OFF GOTO MPWM2 ; MBYTE # FFh -> Not COMM (Audio PWM) BSF MF,COPW :US? ; MBYTE = FFh -> bat Source State = PWM -> BCF MF, PWMS ; -> may be (HABEPHO) yes COMH -> End PWM BSF MFH,_CMB ; and may be Start COMM: HeadO = FFh RETLW 08 ; Yes FFh: MPWMS->COHM-XMADSM) ->MCOMH . . MPWM2: ; Audio, PWM (No COMM) MOVF MBYTE, W CALL BUF W NOP ;US SKIP_IF _NOT MM, 3 GOTO MPWMJTST RLF MM,W ANDLW 0E ADDLW 0E0 MOVWF FSR MOVF MBYTE, W MOVWF INDF INCF MM, F INCF FSR, F DECF BAWL,W MOVWF INDF MPWMJTST : SKIP_IF_ NOT MFH,J RETLW 00 ; 1: Yes Data-min in FIFO for PWM-Out: BCM < 1C00 ; Start and Beginning Read Data from PC (HUB) to FIFO until BCM >= ICOOh SKIP_IFM_LELM BCM, IC, 00 ; Skip if (BCM,BCM+1) < ICOOh = 7168 RETLW 00 ; MCOMH->MCOHM->MPWMS->MADSM->MCOMH . . . BSF MFH,_DAT BCM < 1C00 -> Yes 400h Bytes in FIFO (>1000) Enable PWM Set PWM frequency 8*7=56KHZ Set Tιmer2 for 8 kHz frequency SELECT_BANK_1 1 ' Bank 1 ' ' ' movlw PWM_PR2 14745.6/(4*8kHz*7) - 1 = 64.8 = 65 movwf PR2 1 * Bank 1 ' ' ' SELECT BANK 0 1 ' Bank 0 ' ' ' 409 BCF T2CON,0 ; Set Prescaler & Postscaler to 1 movlw OVERSAMPLING movwf PWM_Cntr ; Setup PWM Pulse Counter MOVLW OF PWM - Mode: CCP1CON<3:0> = llxx MOVWF CCP1CON RETLW 00 ; MPWMS->MCOHM-> (MADSM) ->MCOMH . MADSM: ; -= A/D -FIFO-> HBYTE -UART-> PC SKIP_IF_SET MFH, AD GOTO MAD ; A/D Not Started ;US SKIP_IF_SET ADCON0, ADON ;US GOTO MAD ; ADCON0, ADON = 0 -> Not A/D ;US; ADCON0, ADON = 1 -> Yes A/D = A/D On SKIP_IF_NOT ADCON0, GO GOTO MAD _GO = 1 -> A/D Busy ; GO = 0 -> A/D Complete: Read A/D Result and Store to FIFO MOVF ADRES,W ; ADRES = lEh = A/D Result Register SKIP_IF_SET MFH,TSTAD GOTO MADSM2 ; 0 = No Test A/D: 00 01 . . FE FE . ; Test HUB -> PC A/D: 00 01 . . FE FE(#FF) 00 . . MOVF MM12AD,W INCF MM12AD, F MADSM2: CALL BUF_W BCF MFH, AD Set A/D Not Started Flag MAD: ; Send Samples from FIFO to USART -> PC SKIP_IF_NOT CTS_TRIS,CTS_BIT ; CTS = RC1 RETLW 04 ; CTS=1 => PC Not Ready to Read Check USART Busy SELECT_BANK_1 Bank 1 SKIP_IF_NOT TXSTA, TRMT GOTO MAD2 ; =1 it is possible Send HUB -> PC SELECT BANK 0 ' ' Bank 0 ' ' ' Not Delete ' ' ' 410 RETLW 03 USART busy: MADSM->MCOMH->MPWMS MAD2: SELECT_BANK_0 Bank 0 I Not Delete ' ' ' CALL BUF_R SKIP_I F_NC RETLW OD C = 1 -> BUF empty -> Cycle MOVWF HBYTE SKIP_IF_WNEQUL OFF DECF HBYTE, F (HBYTE) = FFh -> Change: FFh -> FEh MOVF HBYTE, W MOVWF TXREG ; HBYTE -UART-> PC ;US CALL IMPULS ; TEST IMPULS | |~ RETLW 00 ; MADSM->MCOMH-> (MPWMS ) -> { {TEST IMPULS UM BPEMEHHO IMPULS : ; TEST IMPULS I BPEMEHHO BTFSC PORTA, 2 Test IMPULS Pin -> XOR: 0 <=> 1 BPEMEHHO) GOTO IMPULS1 : BPEMEHHO BSF PORTA, 2 0 -> 1 BPEMEHHO GOTO IMPULSEND BPEMEHHO IMPULS1: BPEMEHHO BCF PORTA, 2 1 -> 0 BPEMEHHO IMPULSEND: BPEMEHHO RETURN BPEMEHHO ; TEST IMPULS } ;UM ; BPEMEHHO UM} ****** Interrupt Handler ****** BANK 0 ' ' ■ INT_HANDLERR: INT_STORE MOVF PCLATH, W MOVWF PCLATHJTMP ; Store PCLATH to PCLATHJTMP in BankO CLRF PCLATH ; Page Zero, regardless of current page 411 => 3ANK 0 SKIP_IF_SET PIR1, TMR2IF , if TMR2 Interrupt "> GOTO IRET TMR2IF = 0 -> No TMR2 ; TMR2IF = 1 -> Yes TMR 2 Interrupt ' ' Bank 0 ' ' ' ; Process Tιmer2 Int -> Test and Set PWM TMR2_INT : BCF PIR1, TMR2IF ; Clear Int Flag SKIP_IF_NOT T2CON,0 ; ' ' if 1 -> Presc = 4 -> Not 56KHZ GOTO TMR2_8KHZ ; 1 -> RF (Not PWM) -> 8KHZ (Not 56KHZ) DECFSZ PWM_Cntr,F GOTO IRET ; PWM Cntr # 0 movlw OVERSAMPLING ; =7 -> 8KHZ * 7 = 56 KHZ movwf PWM Cntr ; Reset PWM Pulse Counter TMR2_8KHZ: INCFSZ TMR_125U,F 125 U = 17.90364584U * 7 = 125.32552088U GOTO TMRJTIME Time = (TMR_125U) * 125.3255U INCFSZ TMRJ32MS,F 32 MS = 125.32552088U*256 = 32.083333345MS GOTO TMRJTIME Time = (TMR_32MS) * 32.08333 MS INCF TMR 8SEC,F 8 SEC = 32.08333MS * 256 = 8.213333336 SEC TMR TIME: Time = (TMR 8SEC) * 8.213333336 SEC NOP BSF ADCON0, GO Start A/D BSF MFH, AD Set A/D Started Flag BSF MFH, PWM PWM := 1 -> Read next Sample SKIP_IF_SET MF,COPW ; and PWMS ' '> '> '> GOTO RF_BEG ; 0 -> Not PWM Mode -> Block TX or RX Set New Duty Cycle PWM Sample 8 bit: Sample<7:0> CCPR1L<7:0> CCP1C0N<5:4> 10(01 I I I I I I I I I \ / I I Sample<7:2> Sample<l:0> SWAPF Sample, ANDLW 30 ; W<5:4> • = Sample<l:0> 412 BCF CCP1C0N,4 BCF CCP1C0N,5 ; CCP1C0N<5:4> := 0 0 IORWF CCP1C0N,F ; CCP1C0N<5:4> := Sample<l:0> RRF Sample, MOVWF SampleJTMP RRF Sample_TMP,W ; W<5:0> := Sample<7:2> ANDLW 3F MOVWF CCPR1L ; CCPR1L := 0 0 Sample<7:2> - PWM Sample End RF_BEG: ; Begin Block RF TX or RF RX SKIP_IF_SET FRF,_BUSY GOTO RF END ; BUSY=0: Wait Start RF RX/TX DECFSZ M8CNT,F GOTO RF 8KHZ #0: Not 1 KHZ ( 1 KHZ = 1 MS = 8 * 125U) M8CNT = 00: Yes 1KHZ = 1002.6MS: TX I RX Barker or Curr. Data | RX SYNC BSF M8CNT,3 ; M8CNT := 08h SKIP_IF_NOT MF, RFTX GOTO RF TX 1: TX & 1KHZ (& COPW=PWMS=0) => TX SKIP_IF_NOT FRF,_CUR GOTO RX CUR 1: Wait Current Data-Bit SKIP_IF_NOT FRF,_BAR GOTO RX BAR 1: Wait Barker-Bit RF_8KHZ: SKIP_IF_NOT FRF,_BAR If _BAR = 1: SYNC Full => GOTO RF END Wait 1 KHZ only for Barker or Data Current Sine-Bit = SYNC13 MOVF M8CNT,W SUBLW BTM0+8 8->BTM0, 7->BTMl, . ., 1->BTM7 MOVWF FSR BSF STATUS, C SKIP_IF_SET RX_DATA_P, RX_DATA RC4 BCF STATUS , C RLF INDF, F ; Shift bit to Correlator 413 Compare Correlator SKIP_IF_EQUL INDF, -SYNC01B ; RF Bits Inverse. Skip if GOTO RXNO ; Not Sync-Byte INCF RF_CNT, F GOTO RF END RXNO: ; Not Sync-Byte MOVLW SYNC5R SUBWF RF_CNT,W (W) := (RF CNT) -5 BTFSC STATUS, C GOTO RXOK ; C=l: (RF_CNT) >= 5 CLRF RF_CNT ; (RF CNT) < 5 -> Start SYNC again GOTO RF END RXOK: BCF STATUS , C RRF RF_CNT,W ; W = RF_CNT/2 SUBLW 07 ; W = 8-RF CNT/2-1 = 7-RF CNT/2 MOVWF M8CNT Yes SYNC. Detected. Lock CLK BSF FRF,_BAR MOVLW BARK_TO ; Max Bits beefore BARKER MOVWF RF_CNT ; Used Like Timeout Counter CLRF RF_BYTE ; Used Like BARKER Detector Buffer GOTO RF END RX_BAR: ; Wait Barker BSF STATUS, C SKIP_IF_SET RX_DATA_P, RX_DATA ; RC4 BCF STATUS , C RLF RF_BYTE,F ; C=x xxxx xxxX, X:= Next Bit, MSB First SKIP_IF_NEQUL RF_BYTE, -BARKERB ; Skip if Not Barker GOTO RX_BAR_OK ; Yes Barker, Detectes Barker OK DECF. > Z RF_CNT,F Not Barker -> Check TimeOut GOTO RF_END CLRF FRF ; TimeOut Reset, Not BAR: Start SYNC again BSF FRF, ERR ; ERR Barker: FRF, ERR:=1 ( FRF,_BUSY: =0) 414 MOVLW 81 MOVWF RF_BYTE Error Code Barker Error GOTO RX_ERR RX_BAR_OK: Barker OK, Prepare to RX Current Bytes BSF FRF,_CUR MOVLW 3TM0 Buff COHM = Buff RF RX MOVWF RF_FSR BCF FRF,_NIB GOTO RF_CUR_END Prepare: RF_BYTE := FCh for Curr. Bytes RX CUR: ; 1: Wait ( Processing { 06PA60TKA) ) Current Data-Bit BCF STATUS, C ; Bits Inverse' 1 1 I Must: BSF STATUS, C SKIP_IF_SET RX_DATA_P,RX_DATA ; RC4 BSF STATUS, C ; Bits Inverse 1 ' 1 I Must: BCF STATUS, C RLF RF_BYTE,F ; C=l 1..100x..xX, X:= Next Bit, MSB First SKIP_IF_NC GOTO RF END ; C=l 1..100x..xx C=0 Oxxx xxxx = 7 Bit Received, Store Nibble MOVF RF_FSR,W MOVWF FSR ; Indirect Address: BUFi . RRF RF_BYTE,W Cut off Bit 0, (W) := OOxx xxxx ANDLW IF Cut off Bit 6, (W) := OOOx xxxx CALL DecodeTable (W) :=Decode(W) = 0000 NNNN, NNNN = Nibble NOP ; US [for CEIBO: OTLADKA) SKIP_IF_NOT FRF,_NIB GOTO RX CUR L ; 1 -> Low Nibble RX MOVWF INDF ; 0: Hi Nibble Receive to RF BUF: SWAPF INDF,F BSF FRF,_NIB ; Next Low Nibble GOTO RF_CUR_END ; Prepare: RF_BYTE := FCh RX_CUR_L: Low Nibble RX IORWF INDF,W ; (W) = All Byte MOVWF INDF INCF RF_FSR, F ; To next Byte BUF RF BCF FRF, NIB ; Next Hi Nibble SKIP_IF_NOT FRF,_NLEN GOTO RX CUR B ; 1: Not Length-Byte, Current Byte 415 SKIP_IF_NOT FRF,_TYPR GOTO RX_CUR_LENG ; 1: Not Type-Byte, to Length-Byte BSF FRF,_TYPR ; Receiv Type-Byte, next Length-Byte MOVWF SRFJKS ; KS GOTO RF CUR END ; Prepare: RF_BYTE := FCh _CUR_LENG: BSF FRF,_NLEN ; Receiv Length-Byte, next Current Byte MOVWF RX_CNT ; For COHMRF ADDWF SRF_KS,F ; KS ADDLW 01 ; + 1 (Byte with KS) MOVWF RF_CNT GOTO RF CUR END ; Prepare: RF_BYTE := FCh RX CUR B: DECFSZ RF_CNT,F GOTO RF CUR KS Current Byte Received: KS+=Cur.Byte RF Receive Finish: Compare KS CLRF FRF FRF,_BUSY := 0. KS OK: FRF,_ERR = 0 MOVWF RF_BYTE RF_BYTE := RX KS SKIP_IF_WEQU SRF_KS Skip if (W) = KS GOTO RX ERR RF RX Successful Complete ( Finish) OK! -> to PC: TOY -RF-HUB-UART-> PC BSF MF, COHMRF GOTO RF END RX_ERR: BSF FRF,_ERR ERR: FRF, ERR := 1 GOTO RF_END RF_CUR_KS : ; Current Byte Received ADDWF SRF_KS,F ; KS+=Cur.Byte RF_CUR_END: ; Prepare: RF_BYTE := FCh MOVLW OFC MOVWF RF_BYTE GOTO RF END 416 RF Data Transmitting RF TX: RLF RF_BYTE, F ; Send Next Bit to RF, MSB First SKIP_IF_C GOTO RFTXO BSF TX_DATA_P, TX_DATA RA2 = 1 GOTO TX DEC RFTXO: BCF TX DATA P,TX DATA ; RA2 = 0 TX DEC: Decrement Bit Counter DECFSZ RF_CNT,F GOTO RF_END BSF RF_CNT, 3 RF_CNT := 8 Bits RLF RF BYTE, F RF BYTE := SYNC-Byte again: 01010101 SKIP_IF_NOT FRF,_CUR GOTO MTX CUR ; 1: Yes BARker, Transmits Current half-Bytes DECFSZ RFMCNT,F ; 5 * δbits SYNC GOTO RF END End Sync, Transmits Barker-Byte: 00110010 (Send BARKER), but before Prepare Transmits Current half-Bytes: (0-15 Bytes) BCF FRF,_NIB ; 0 -> Hi-Nibble to TX / 1 -> Low Nibble BSF FRF,_CUR ; Yes BARker, Transmits Current half-Bytes MOVLW BARKERB MOVWF RF BYTE ; RF TX Byte: Barker = 00110010 MTX_CUR: ; Transmits Current half-Bytes, Send Message MOVF RF_FSR,W MOVWF FSR ; Indirect Address: BUFi SKIP_IF_SET FRF,_NIB GOTO MTX CUR H ; 0 -> Hi Nibble to TX MOVF INDF,W ; Low Nibble to TX, W := (BUFi) = Byte<7:0> INCF RF_FSR, F ; To next Byte BUF RF BCF FRF,_NIB ; Next Hi Nibble GOTO MTX CUR L ; Low Nibble Ready to Encoding and RX TX 417 MTX_CUR_H : SWAPF INDF,W W := Byte<3: 0>Byte<7 : 4> => Hi Nibble BSF FRF, NIB :=1 = Next Low Nibble MTX_CUR_L: ANDLW OFh CALL EncodeTable Encode (W) = <7:1> 0 NOP ;US MOVWF RF_BYTE DECF RF_CNT,F ; RF_CNT := 7 Bits (=8-1) DECFSZ TX_CNT, F ; Counter Bytes Message to TX GOTO RF END ; TX CNTO = 2* (Length+3 (TYPE, LENG, KS)) ; RF TX Finished, Message Fully Transmits ' ' ' CLRF FRF ; FRF,_BUSY := 0 BCF MF, RFTX ; RF Transmit Finish -> RF RX GOTO RF END RF END: End Block RF TX or RF RX SKIP_IF_SET MFH,TSTPW GOTO IRET ; 0 = No Test PWM: 00 01 . . FE FE Test PC -> HUB PWM: 00 01 FE FE(#FF) 00 SKIP_IF_EQUL MM11PW, 0FF Skip if MM11PW # FFh GOTO TST_NOFF W # FFh MOVLW 0FE = FFh -> W := FEh GOTO TST FE TST_NOFF: MOVF MM11PW,W TST_FE: SKIP_IF_SET MFH,TSMPL GOTO IRET ; 0: Sample Not changed BCF MFH,TSMPL ; 1: Sample renewed (06HOBILOC6) (: = 0 ) INCF MM11PW,F SKIP_IF_WNEQU Sample Skip if (W) # Sample GOTO IRET W = Sample -> OK NOP ; US MM11PW # Sample -> Tes t Erro r DECF MM11PW,F Restore MM11PW ; U CALL IMPULS 418 MOVWF MSTATUS SKIP_IF_NLEL TMR_32MS,20 GOTO IRET ; Time < 32MS * 32 = 1.024 Sec BSF FCOHM, _MES ; Message Error BSF MF,COHM IRET: MOVF PCLATH_TMP, W MOVWF PCLATH ; Restore PCLATH INT_RESTORE END 419 04.02.98 19:00 Microch.asm PIC16C7x Michael Kholoder 01.04.98 14:00 1. Comment: 19h => 99h INDF EQU 00 ;&80h ; Indirect Access Register TMRO EQU 01 ; TimerO Register. See Also OPTIONR Bits ; F0 = Fosc/4/Presc/(256-TMR0) = Fosc/4/[ 2 Λ (OPTION<2 : 0>+l) ]/(256-TMR0) ; TMRO = 256 - Fosc/4/[ 2 Λ (OPTION<2 : 0>+l) ]/F0 OPTIONR EQU 01 ; 81h Options Register RBPU EQU 7 1 - PORTB pull-up are disabled INTEDG EQU 6 1 - Int on Rising Edge of RB0/INT pin T0SC EQU 5 TMRO Clock Source 1-External (RA4 ) 0-Internal T0SE EQU 4 External Edge PSA EQU 3 Prescaller Assigment 1-WDT 0-TιmerO 2 Prescaller Value 1 TMRO Presc = 2 Λ Value+l 1:2, 1:4, ... 1:256 0 WDT Presc = 2 Λ Value 1:1, 1:2, ... 1:128 PCL EQU 02 ;&82h ; Program Counter STATUS EQU 03 ;&83h ; Status Register IRP EQU 7 Reg. Bank Bit for Indirect Addr. 0=00-0FF, 1=100-1FF RP1 EQU 6 Reg. Bank Bit Select for Direct Addr. RP0 EQU 5 00=00-7F, 01=80-OFF z EQU 2 Zero Flag c EQU 0 Carry Flag FSR EQU 04 ;S84h ; Indirect Addressing Registers ; I/O Ports Registers PORTA EQU 05 TRISA EQU 05 ; 85h PORTB EQU 06 TRISB EQU 06 ; 86h PORTC EQU 07 TRISC EQU 07 ; 87h RX EQU 7 ; USART RX Pin RC7 TX EQU 6 ; USART TX Pin RC6 PCLATH EQU 0A ;&8Ah ; Interrupt Registers INTCON EQU 0B ; &8B ; Interrupts Config. Register 420 GIE EQU 7 ; Global Int Enable Bit PEIE EQU 6 ; Peripheral Int Enable Bit TOIE EQU 5 ; TimerO Int Enable Bit TOIF EQU 2 ; TimerO Int Flag PIR1 EQU OC ; Interrupts Status Flags Register ADIF EQU 6 A/D Int Flag RCIF EQU 5 USART Receive Int Flag TXIF EQU 4 USART Transmit Int Flag SSPIF EQU 3 SSP Int Flag CCP1IF EQU 2 TMRl Capture Int Flag TMR2IF EQU 1 TMR2=PR2 Int Flag TMRlIF EQU 0 TMRl Overflow Int Flag PIE1 EQU OC ; 8Ch ; Peripheral Ints Control Register ADIE EQU 6 A/D Converter Int Enable Bit RCIE EQU 5 USART Receive Int Enable Bit TXIE EQU 4 USART Transmit IntEnable Bit SSPIE EQU 3 SSP Int Enable Bit CCP1IE EQU 2 CCP1 Int Enable Bit TMR2IE ECU 1 TMR2=PR2 Int Enable Bit TMRlIE EQU 0 TMRl overflow Int Enable Bit TMR1L EQU OE ; Holding R for the Least Signif. Byte of TMRl Reg TMR1H EQU OF ; Hold. Reg for the Most Significant Byte of 16-b TMRl T1CON EQU 10 ; Timerl Control Register Bit 5-4 Prescale: 11-1:8, 10-1:4, 01-1:2, 00-1:1 TMRION EQU 0 ; 1 => Enables / 0 => Stops TIMER1 T2CON EQU 12 ; Timer 2 Control Register Bit 6-3 Postscale: 0000-1, 0001-2, ... 1111-16 TMR20N EQU 2 ; 1 => Tιmer2 On Bit 1-0 Prescaler: 00-1, 01-4, lx-16 PR2 EQU 12 92h Timer 2 Period Reg: PR2 = (Fosc/ [4*Fuser*Presc] ) -1 ; SSP Module Registers SSPBUF EQU 13 ; SSP Buffer Register SSPCON EQU 14 ; Sync Serial Port Control Register WCOL EQU 7 ; Write Collision Bit (0-No Collision) SSPOV ECU 6 ; Receive owerflow Indicator (0-No owerflow) SS EN EQU 5 ; SSP Enable Bit 421 CKP EQU ; Clock Polarity Bit ; Bits 3-0 Mode Select SSPSTAT EQU 14 ; 94h ; SSP Status Register BF EQU 0 ; Buffer Full Status Bit ; Capture/Compare/PWM Module 1 CCPR1L ECU 15 ; Capture/Compare/PWM Register 1 LSB CCPR1H EQU 16 ; Capture/Compare/PWM Register 1 MSB CCP1CON EQU 17 ; Capture/Compare/PWM Control Register 1 CCP1M0 EQU 0 ; Bit 3-0: 0100 = Falling / 0101 = Rising USART Module R, RCSTA EQU 18 ; Receive Status & Control Register SPEN EQU 7 Serial Port Enable Bit R 9 EQU 6 SREN ECU 5 CREN ECU 4 Receive Enable Bit FERR ECU 2 Framing Error Bit OERR ECU 1 Overrun Error Bit RX9D ECU 0 TXSTA ECU 18 ; 89h ; Transmit Status & Control Register CSRC ECU 7 Clock Source Select T 9 EQU 6 9-Bit Transmit Enable Bit TXEN EQU 5 Transmit Enable Bit SYNC EQU 4 Mode Select Bit 1-Synchronous, 0-Asynchronous BRGH EQU 2 Hi Baud Selectt 1-Hι, 0-Low TRMT EQU 1 Transmit Status 1-Empty, 0-Full T 9D EQU 0 9th bit of Data TXREG EQU 19 ; Tranceive Register SPBRG EQU 19 ; 99h ; Baud Rate Register Baud=Fosc/ [ 6 (SPBRG+1) RCREG EQU 1A ; Receive Register ; Capture/Compare/PWM Module 2 CCPR2L EQU IB ; Capture/Compare/PWM Register 1 LSB CCPR2H EQU IC ; Capture/Compare/PWM Register 1 MSB CCP2CON EQU ID ; Capture/Compare/PWM Control Register 2 ; A/D Convertor Module Registers ADRES EQU IE ; A/D Convertion Result ADCON0 EQU IF ; A/D Port Config. Register _ADCS1 EQU A/D Clock Select Bits ADCS0 EQU OO-Fosc/2 Ol-Fosc/8 10-Fosc/32 11-Frc Bits 5-3 -Channel Select 0-7 422 GO EQU 2 ; A/ D Conversion Status / Start Bit ADON EQU 0 ; A/ D Converter Module On/Off ADCON1 EQU IF ; 9Fh ; A/D Port Channels Select Bits +**★★*★ MACRO ******* SELECT_BANK_0 MACRO bcf STATUS, RPO 0 bank 0 ENDM SELECT_BANK_1 MACRO bsf STATUS, RPO ; 1 bank 1 ENDM SKIP IF Z MACRO btfss STATUS, Z ; Skip if ZERO: Z = 1 ENDM SKIP IF NZ MACRO btfsc STATUS, Z Skip if Not ZERO: Z = 0 ENDM SKIP IF C MACRO btfss STATUS, C Skip if C = 1 ENDM SKIP IF NC MACRO btfsc STATUS, C ; Skip if C = 0 ENDM SKIP_IF_SET MACRO Reg, Bit btfss Reg, Bit ; Skip if Bit = 1 ENDM SKIP_IF_NOT MACRO Reg, Bit btfsc Reg, Bit ; Skip if Bit = 0 ENDM SKIP_IF_NLESS MACRO X,Y ; Skip if X >= Y movf Y,W subwf X,W ; w=X-Y /*ιf was barrow Carry=0*/ btfss STATUS, C ; Skip if X >= Y ( C = 1 ) ENDM SKIP IF LESS MACRO X,Y ; Skip if X < Y 423 movf ιr,w W=Y subwf x,w ; W=X-Y /*ιf was barrow Carry=0*/ btfsc STATUS, C ; Skip if X < Y ( C = 0 ) ENDM SKIP_IF_EQUL MACRO X,L Skip if (X) = (L) MOVF X,W XORLW L SKIP_I _ Z Skip f (X) = (L) ENDM SKIP_IF_NECUL MACRO X,L Skip if (X) ϋ (L) MOVF X,W XORLW T, SKIP_IF NZ Skip if (X) # (L) ENDM SKIP_IF_WEQUL MACRO L ; Skip if (W) = (L) XORLW L SKIP_IF_Z ; Skip if (W) = (L) ENDM SKIP_IF_WNECUL MACRO L Skip if (W) # (L) XORLW L SKIP_IF_NZ Skip if (W) # (L) ENDM SKIP_IF_WEQU MACRO X Skip i f (W ) XORWF X,W SKIP_I _Z ; Skip i f (W ) = (X ) ENDM SKIP_I F_WNEQU MACRO X Skip if (W) (X) XORWF X , W SKI P_I F_NZ Skip if (W) # (X) ENDM SKIP_IF_LEL MACRO X,L ; Skip if X < L MOVLW L W=L SUBWF X,W W=X-L /*ιf was barrow Carry=0*/ btfsc STATUS, C Skip if X < L ( C = 0 ) ENDM 424 SKIP_IF_NLEL MACRO X, , Skip if X >= L MOVLW L W=L SUBWF X,W W=X-L /*ιf was barrow Carry=0*/ btfss STATUS , C SkiD if X >= L { C = 1 ) ENDM SKIP_IFM_LELM MACRO X,L,M ; Skip if (X,X+1) < L,M MOVLW L SUBWF X,W (X)-L SKIP_IF_ C GOTO $+7 C = 0 -> (X) < L -> Skip SKIP_IF_ _z C = 1 -> (X) >= L GOTO $+4 Not Zero -> (X) > L -> Not Skip MOVLW M ; (X) = L -> check (X+l) , M SUBWF X+1,W ; W=(X+1)-M SKIP_IF_ _NC ; Skip if (X,X+1) < L,M ENDM SKIP_IFM_NLELM MACRO X,L,M Skip if (X,X+1) >= L,M MOVLW L SUBWF X,W W := (X)-L SKIP_IF_C GOTO $+6 C = 0 -> (X) < L -> Not Skip SKIP_IF_Z C = 1 -> (X) >= L GOTO $+5 Not Zero -> (X) > L -> Skip MOVLW M (X) = L -> check (X+l) , M SUBWF X+1,W W=(X+1)-M SKIP_IF_C Skip if (X,X+1) >= L,M ENDM SKIP_IFM_LESS MACRO X,Y Skip if (X,X+1) < (Y,Y+1) movf Y,W subwf X,W W := (X)-(Y) SKIP_IF_C GOTO $+7 C = 0 -> (X) < (Y) -> Skip SKIP_IF_Z C = 1 -> IX) >= (Y) GOTO $+4 Not Zero -> (X) > (Y) -> Not Skip movf Y+1,W (X) = (Y) -> check (X+l) , (Y+l) subwf X+1,W W=(X+1)-(Y+1) SKIP_IF_NC Skip if (X,X+D < (Y,Y+D ENDM SKIP IFM NLESS MACRO X,Y ; Skip if (X,X+1) >= (Y,Y+1 ) 425 movf Y,W subwf x,w (X) - (Y) SKIP_Ir _C GOTO $+6 C = 0 -> (X < (Y) -> Not Skip SKIP_IF Z c = 1 -> (X >= (Y) GOTO $+5 Not Zero -> (X) > (Y) -> Skip movf Y+1,W (X) = (Y) -> check (X+l), (Y+l) subwf X+1,W W=(X+1)-(Y+1) SKIP_IF C Skip if (X,X+1) >= (Y,Y+1) ENDM SKIP_IFM_Z MACRO X Skip if (X) = (X+l ) OOh MOVF X,F SKIP_IF _Z GOTO $+3 (X) # OOh MOVF X+1,F (X) = OOh SKIP_IF _Z Skip if (X) = (X+l) = OOh ENDM SKIP_IFM_NZ MACRO X Skip if (X) # OOh .or. (X+l) # OOh MOVF X,F SKIP_IF _Z GOTO $+4 (X) # OOh => Skip MOVF X+1,F (X) = OOh SKIP_IF _Z Skip if (X) # OOh .or. (X+l) # OOh ENDM I CM MACRO X X = (XH,XL) X++ (+=1) INCFSZ X+1,F GOTO $+2 INCF X,F ; X = (XH,XL) := X++ (+=1) ENDM DECM MACRO X ; X = (XH,XL) := X— (-=D MOVF X+1,F SKIP_IF_ _NZ DECF X,F ; (XL) = (X+l) = 0 (XH)— (-=1) DECF X+1,F ENDM INT_STORE MACRO movwf W TMP ; Store W to W_TMP in bank one or zero swapf STATUS , ,W ; Store swapped STATUS to W CLRF STATUS ; 0 bank 0 426 movwf STATUSJTMP Store swapped STATUS to STATUS TMP in BankO MOVF FSR,W MOVWF FSR TMP Store FSR to FSR TMP ENDM INT_RESTORE MACRO SELECT_BANK_0 ; 0 bank 0 MOVF FSR TMP, MOVWF FSR ; Restore FSR swapf STATUSJTMP, W ; Load W with Stored STATUS movwf STATUS ; Restore STATUS and Bank swapf W_TMP,1 ; Swap WJTMP swapf W TMP,W ; Swap W TMP to W RETFIE ENDM 427 06.04.98 12:30 MHfifoθK.asm FIFO 8 KB Michael Kholodenko, Creator 06.4: 2. BF=42, BYTE=43 (before 40,41) 16.3: 1. Only GG = RC5. Net G1(RC4) Not G2 19.2: 1. Change: Gl : =RC4 (NotA2=TEST) , (CTS:=RC1 in MH.asm) 12.2: 1. Delete NOP-s in "B IN", "B OUT" ****** Constants ****** BC_rest ECU 10 =16 BCH_max ECU 20 8K -> 20, SET BCM0: BCM := 8192 = 2000h BOxlF ECU IF 8K -> IF *★+★★* Variables BF EQU 42 Flags: FW EQU 1 0 -> BUF empty (FR=0) or full (FR=1) FR EQU 0 BYTE EQU BF+1 ; -> s/r BUF_R, BUF_W, B_IN_OUT BCM EQU BF+2 ; BCM+1 EQU BF+5. Counter -> s/r BUF_R, BUF_W ; BCM+1 EQU BF+3 BCM + BAW - BAR = 2000h or OOOOh BARH EQU BF+4 Address for read -> s/r BUF R, BUF W BARL EQU BF+5 BAWH EQU BF+6 Address for write -> s/r BUF R, BUF W BAWL EQU BF+7 BPORT EQU PORTB BTRIΞ EQU TRISB BGGPORT EQU PORTC BGGTRIS EQU TRISC B GG EQU 5 GG = BGGPORT, B GG = PORTC, 5 RC5 428 BWEPORT EQU PORTC BWETRIS EQU TRISC B WE EQU 0 WE = BWEPORT , B WE = PORTC , 0 RCO BOEPORT EQU PORTA BOETRIS ECU TRISA B OE EQU 5 OE = BOEPORT, B OE = PORTA, 5 RA5 Macro: B_IN - input Byte from FIFO 8K -> to BYTE. (FIFO address<12:0> = BARH<4 : 0> & BARL<7:0>) B IN MACRO BCF BGGPORT, B_GG ; GG:=0 MOVF BARL,W MOVWF BPORT ; Address<7:0> = B_ADL<7 : 0> BSF BGGPORT, B GG ; GG:=1 RC5 | — MOVF BARH,W MOVWF BPORT ; Address<12 : 8> = B_ADH<4:0> BCF BGGPORT, B GG ; GG:=0 RC4 — I MOVLW OFF SELECT_BANK_1 MOVWF BTRIS FF -> input data BYTE in PORTB SELECT_BANK_0 OE,WE BCF BOEPORT, B_OE OE:=0 0 1 - read (input) RA5 MOVF BPORT, W BSF BOEPORT, B_OE ; OE:=l 1 1 - No w/r RA5 MOVWF BYTE ; read (input) in BYTE SELECT_BANK_1 CLRF BTRIS 00 -> output data BYTE in PORTB SELECT_BANK_0 ENDM Macro: B_OUT - output Byte to FIFO 8K <- from BYTE. (FIFO adαress<12:0> = BAWH<4:0> & BAWL<7:0> ) B_OUT MACRO BCF BGGPORT, B_GG ; GG : =0 MOVF BAWL,W 429 MOVWF BPORT ; Address<7:0> = B_ADL<7 : 0; BSF BGGPORT B_GG ; GG:=1 RC5 l~ MOVF 3AWH,W MOVWF SPORT ; Address<12:3> = B_ADH<4:0> BCF BGGPORT B GG ; GG:=0 RC5 —I MOVF BYTE,W MOVWF BPORT OE,WE BCF BWEPORT, B WE WE:=0 1 0 - write (output) RCO BSF BWEPORT, B WE WE:=1 1 1 - No w/r RCO ENDM BUF SET - setup BUF - FIFO ***** BUF SET SELECT_BANK_1 MOVLW 05 ; Pin RA0,RA1 - Analog, RA2 - D, RA3 Vref MOVLW 07 ; Pin RAO - RA7 = D MOVWF ADCON1 NOP Set OE, WE, GG -> Out 1 1 0 BCF BOETRIS,B_OE ; A.5 = p07 RA5 BCF BWETRIS,B_WE • A.4 = p06 RCO BCF BGGTRIΞ,B_GG • C.5 = plδ RC5 NOP SELECT_ _BANK_0 BSF BOEPORT, B_OE /OE:=l RA5 BSF BWEPORT, B_WE /WE:=1 RCO BCF BGGPORT, B_GG GG:=0 RC5 NOP CLRF BCM+1 ; BCL =: OOh MOVLW BCH_max MOVWF BCM ; BCM:=. OOOh = long BUF BAR)=(BAW) • =0000 CLRF BARH CLRF BARL 430 CLRF 3AWH CLRF BAWL CLRF 3F CLRF BPORT SELECT_BANK_1 NOP CLRF BTRIS ; output addr7-0 ; Prepare RTS Pin for Output SELECT_BANK_0 NOP BCF RTS_PORT,RTS_BIT ; RC3 = RTS := 0 to Recive from PC ! ! ! SELECT_BANK_1 NOP bcf RTSJTRIS, RTS_BIT ; RC3 -> Output SELECT_BANK_0 NOP RETURN ***** BUF_W - write BYTE from W in BUFfer ***** BUF_R - read BYTE in W from BUFfer exit: C=0 - OK, C=l - not w/r (BUF empty or full) BAW = (BAWH, BAWL) - address for write BAR = (BARH, BARD - address for read BCM = (BCM=BCH, BCM+1=BCL) - buffer counter (W) = (BYTE) for save byte source BF - buffers flags BF, 1 = FW, BF, 0 = FR BCM (hex) BCM BF w R 0 0 <= 0 1 - BUFfer full 1 1 1 <= 1 1 - no write 2 2 1 lOh _ 16 _ι <= 1 1 - no write llh 16+1 I <= 1 0 - write and read 12h 18 I 431 13h 1 0 write ana reaa 14h 20 1FFE I 8190 | 1FFF 1 8191 | <= 1 0 write and read 2000h 1 8192 | <= 0 0 BUFfer empty BUF_R - read BYTE in W from BUFfer exit: C=0 - OK, C=l - not read (BUF empty) BUF_R MOVWF BYTE save (W) BTFSC BF,FW GOTO B R l Oi => BUF empty or full BTFSS BF,FR GOTO BRWE ; 00 => BUF empty ; 01 => BUF full -> read, and then BF,W R = BF<1:0> := 11 BSF BF,FW ; read byte from BUFfer B_R: B_IN INCFSZ BARL,F GOTO B R2 FF + 1 => + 1 00 INCF BARH,W ANDLW BOxlF long BUF = 8192 => 0-1FFF MOVWF BARH B R2: INCM BCM BCM counter +=1 MOVF BCM,W SKIP_IF_NZ GOTO B R0 BCH = 0 -> BCM < 256 432 SUBLW SCH_max ; BCH = 2 Oh ? SKI P_I F_Z GOTO BRW_OK ; BCH # 2Oh ; BCH = 20h -> BCM = 2000h -> BUF empty -> ; -> BF,W R := 00 (before: 10) BCF BF,FW B_R0: ; BCM < 256 MOVF BCM+1,W SKIP_IF_WNEQUL BC_rest+l ; Skip if BCM # 16+1 GOTO B_R17 ; BCM = 17 SKIP_IF_WECUL BC_rest+20 ; Skip if BCM = 16+32 = 48 GOTO BRWJOK ; BCM < 48 ; BCM = 48 : 1. Enable FILLING BUF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! bcf RTS_PORT,RTS_BIT ; RC3 := 0 -> Enable GOTO BRWJOK B_R17 BCF BF,FR ; BCM = 16+1 -> BF,W R := 10 (before: 11) GOTO BRW OK **** BUF_W - write BYTE from W in BUFfer exit: C=0 - OK, C=l - not write (BUF full) BUF_W MOVWF BYTE ; save (W)=byte source BTFSC BF,FW GOTO B_W ; li Oi => BUF empty or full BTFSC BF, FR GOTO BRWE ; 01 => BUF full ; 00 => BUF empty -> write, and then BF,W R := 10 BSF BF,FW ; write BYTE in BUFfer B_W B_OUT 433 INCFSZ BAWL, F GOTO 3 W2 FF + 1 => + 1 00 INCF BAWH , W ANDLW BOxlF long BUF = 8192 => 0- 1FFF MOVWF BAWH B W2: ;{{{=>BRW_OK ??NO))) DECM BCM ; BCM counter -=1 SKIP_IFM_Z BCM ; Skip if BCM = 00 00 GOTO B W4 ; BCM > 0 ; BCM = 0 -> BUF full -> BF,W R := 01 (before: 11) BCF BF, FW GOTO BRW_OK B_W4: MOVF BCM, F SKIP_IF_Z GOTO BRW_OK ; BCH = 0 -> BCM < 256 MOVF BCM+1,W SUBLW BC_rest SKIP_IF_Z GOTO BRW_OK ; BCM = 16 -> BF,W R := 11 (before: 10) BSF BF,FR ; 1. STOP FILLING BUF !!!!!!!!!!!!!!''!!'!!!'!!'''!!!! bsf RTS_PORT,RTS_BIT ; RC3 BRW_OK BCF STATUS, C GOTO BRW END BRWE BSF STATUS, C:=l Not r/w BRW END MOVF BYTE,W RETURN 434 Toy Control Device Source Code 435 Serial Uniport Motorola Toy Control Device Source Code 436 *************************+********★************.»•*******»***♦*,►**,►*** ^fjT£ . | ~ u.asm DATE:25/07/97 * $include "motorola. h" ,,,,,,,,,,,,, ,,,,,, ; Story Teller Demo. ; Januar 1988 *************************************************************** *****ππ»r'p D TM _PORT EQU PORTA BEEP_PIN_DDR EQU DDRA BEEP PIN BIT EQU 0 TX_DATA_PORT ECU PORTD TX_DATA_DDR ECU DDRD TX DATA BIT EQU 5 MUTE_PORT EQU PORTA MUTE_DDR EQU DDRA MUTE_BIT EQU 1 MOTOR_l_PORT EQU PORTB MOTOR_l_DDR EQU DDRB MOTOR_l_BIT EQU 5 LED_PORT EQU PORTB LED_DDR EQU DDRB LED_BIT ECU 6 MOTOR_2_PORT ECU PORTB MOTOR_2_DDR ECU DDRB MOTOR_2_BIT ECU 7 RF_EN_PORT EQU PORTA RF_EN_DDR EQU DDRA RF_EN_BIT EQU 3 SENSE_3_PORT EQU PORTA SENSE_3_DDR EQU DDRA SENSE_3_BIT EQU 5 SENΞE_2_PORT EQU PORTA SENSE 2 DDR EQU DDRA 437 SENSE 3IT EQU SENSE_l_?ORT EQU PORTA SENSE_I_DDR EQU DDRA SENSE_1_3IT EQU 7 CLK_PORT ECU PORTC CLK_DDR ECU DDRC CLK_BIT EQU 0 POWER_LCCK_PORT ECU PORTA ; " l "=ON POWER_LOCK_DDR ECU DDRA POWER_LOCK_BIT ECU 2 TX_B2_PORT ECU PORTA TX_B2_DDR ECU DDRA TX_B2_BIT ECU 4 LOW_BATT_PORT ECU PORTC ; ANALOG INPUT AN3 LOW_BATT_DDR EQU DDRC LOW_BATT_BIT EQU 4 CAR_DETECT_PORT EQU PORTC CAR_DETECT_DDR EQU DDRC CAR_DETECT_BIT EQU 3 LDT_PORT EQU PORTC LDT_DDR EQU DDRC LDT BIT EQU 5 RSS I_PORT ECU PORTC ;ANALOG INPUT - ANO RSSI_DDR EQU DDRC RSSI BIT EQU 6 f* + + + + + + ιH RX_DATA_PORT ECU PORTD ; PORTD RX_DATA_DDR ECU DDRD ; DDRD RX_DATA_BIT ECU 7 DATA_PORT ECU PORTC DATA_DDR EQU DDRC DATA BIT EQU 1 ; SAME PIN AS TXRX_PLL_DATA 438 *** + **********ιc*****-*-«πc* r********+ **+*+**-*"* **;COP REGISTERS COP_BIT EQU SID ;COP BIT COP REGISTER ECU $1FF0 ;COP REGISTER IRQ_OPT_REG EQU $1FDF IRQ OPT VAL EQU $00 ;EDGE TRIGGERED INTERRUPT , ************•) ; TIMER CONSTANTS & REGISTERS WITH CRYSTAL OF 4MHZ, THE TIMER INCREMENTS EVERY 2US . TCR_REG EQU $12 TIMER CONTROL REG OLVL_BIT EQU $00 OUTPUT LEVEL BIT POSITION IN TCR. IEDG_BIT EQU $01 l=POSITIVE EDGE TRIGGERS INPUT CAPTURE ICIE_BIT EQU $07 ;1=INPUT CAPTURE IRQ ENABLE (TCAP/PD7) TOIEJBIT EQU $05 ;1=TIMER OVERFLOW IRQ ENABLE OCIE_BIT EQU $06 ;l=OUTPUT COMPARE IRQ ENABLE (TCMP) TSR_REG EQU $13 TIMER STATUS REGISTER ICRH_REG EQU $14 INPUT CAPTURE REG HIGH ICRL_REG EQU $15 INPUT CAPTURE REG LOW TIMER_HIGH EQU $18 ; TIMER HIGH REGISTER TIMER LOW EQU $19 OCR_HIGH EQU $16 ; OUTPUT COMPARE REGISTER MSB IN MEMORY OCR LOW EQU $17 ************** * ***** * ******* *** *** * ** * ** * *************** * * * *** * **** ************** ** ***** * *** ** ** * ******* * * * **** * * * * * **** * ** ** * **** * * **** START OF RAM ****** ** ***** * ****************************************************** ORG $80 WAIT_REG1 RMB ; RESERVE 1 BYTE FOR WAIT REGISTER WAIT REG2 RMB 439 REG1 RMB - REG2 RMB 1 REG3 RMB 1 REG4 RMB 1 TXRX BYTE RMB 1_ TXRXJTRAN BUFF RMB 5 ; TRANSMIT BUFFER TXRX_REC_BUFF RMB 5 ; RECEIVE BUFFER ; DECLARE FLAGS FLAGS_BYTE RMB 1 OK_FLAG EQU 0 REC_BIT EQU 1 MIDI_OK_FLAG EQU 2 ; USED IN MIDI PROC SYNC_DET_FLAG EQU 3 IF_FLAG ECU 4 FIND_SYNC_FLAG EQU 5 FIND_BIT_FLAG EQU 6 CAPTURE FLAG EQU 7 FLAGS1_BYTE RMB 1 MIC_OPEN_FLAG EQU 3 ; Mιcrophone was open by ListenStart BIT_DTCTED_FLAG EQU 4 BIT_DETECTED_BIT EQU 5 BIT_DET_FAIL_FL EQU 6 REC_HEADER_FLAG EQU 7 BYTE DTCTED FLAG ECU 7 ; SAME AS HEADER FLAG SYNC_COUNTER RMB 1 TIMER_MSB_BYTE RMB 1 TIMER_LSB_BYTE RMB 1 TIMER_DI FF_MS B RMB 1 TIMER_DI FF_LS B RMB 1 kbd_counter_m≤D rmb 1 kbd_counter_l sb rmb 1 kbd_counter_l l equ ' 01 kbd_counter_12 equ ' 100 ; One time counters pwm_regl rmb 1 pwm_reg2 rmb 1 pwm regl rmb 1 440 ; Zero Time Counters pwm_regl_z rmb 1 pwm_reg2_2 rmb 1 pwm_regl_z rmb 1 ; One/Zero Time Duration in 100 ms one_tιmel rmo 1 one_tιme2 rmb 1 zero_tιmel rmb 1 zero_tιme2 rmb 1 ;Motors /LED Enable Flags Register ml_enable rmb 1 . ****** xoL ******* Tmpl db 0 Tmp2 db 0 Tmp3 db 0 header_bit_cntr db 0 ; Time WordCounter Counter_Low db 0 Counter_Hi db 0 .****** Compander's PLL Write Only Data Shadow Memory PllShadow: PlllHi db 0 PlllLo db 0 P112H1 db 0 P112Lo db 0 P113H1 db 0 P113Lo db 0 P114Hi db % %00011000 ; (18h) ALC-Enable, Limiter-Enable, Clk-Disable I ||\/+ > Volume Control (MSB) I i i \ > ik out Select I |+ > i _ elk Disable I + > 1 - Limiter Disable + > 1 - ALC Disable P114Lo db %00000000 ; (OOh) Mode-Activ, Tx-UnMuted, Rx-Muted, SP-On \ /I I I 1+ > 1 - Speaker Mute I { i i + > 1 - Rx Mute I i | + > i - Tx Mute I i + > Rx Mode \ 00 - Active I + > StendBy Mode / 11 - Inactive * > Volume Control ( bιt2 - LSB ) 441 P115H1 co P115Lo αb PII6H1 db ^00000000 +— -> Voltage Reference Adjust PII6L0 db %11000000 11\ / I I +— -> Filter Clock Counter 1 + -> 1 - Tx Scrambler Bypass + -> 1 - Rx Scrambler Bypass P117H1 db P117LO db .****** Default PLL Settings (description see upword) REG1HI EQU OOh REG1LO EQU OOh REG2HI EQU OOh REG2LO ECU OOh REG3HI ECU OOh REG3LO ECU OOh REG4HI ECU 08h REG4LO EQU 0A7h REG5HI EQU 3Eh REG5LO EQU OCOh REG6HI ECU OOh REG6LO ECU OCAh REG7HI ECU OOh REG7LO ECU OOh **** ** * * ** * ; COSTANT S: MIDI START BYTE ECU $90 UNIT_CODE_NUMBER ECU $21 ;UNIT_CODE NUMBER ECU $22 442 ;UNIT CODE NUMBER EQU $23 ;UNIT_CCDE_NUMBER ECU $24 ; Book ;UNIT_CCDE NUMBER EQU $25 ; Frog ; UNIT_CODE_NUMBER EQU $26 ;UNIT_CCDE_NUMBER EQU $27 BASE_CODE_NUMBER EQU $98 B ROADCAST EQU $055h *** * * ************* * ** * ***** * *********** * ****** * * ******************** ;unιt command declarations: unιt_OLDtalk_cmd equ $10 unιt_talk_cmd equ $80 uni t_mι c_t_cmd equ $90 unit_mιc_st_cmd equ $21 unit_mι c_s top_c equ $22 unit_general_cmd equ $70 unit_status_cmd equ $80 unit_reset_cmd equ $0a0 unit_turn_of f_c equ $0a3 unit turn on cmd equ $0a5 .**** * * X0L unit compand cmd equ $60 set script equ $30 .*** *** END χoL LISTEN AFTER equ $08h MOTORl_ENABLE equ $01h M1_ENABLE_BIT equ $00h MOTOR2_ENABLE equ $02h M2_ENABLE_BIT equ $01h LED_ENABLE equ $04h LED ENABLE BIT equ $02h * * *** *********** * ** * * ** * * ************ START OF PROGRAM *** ** » ********* ** ** ** * * * * * * **** * **** *********************************sss 443 ORG $ 100 START OP : ; INIT INTERRUPT TYPE : RSP ; RESET STACK POINTER LDA #IRQ_C?T_VAL STA IRC_OPT_REG sei ; DISABLE IRC jsr shutt on ; supply voltage to the rest of the board JSR TXRX_INIT_PINS ; INIT TO ' 0 ' JSR TXRX_SET_FREO JSR SPKR INIT ;XOL Delay Ida #70 jsr wait ace ms ;END XOL Ida #unit_reset_cmd ldx #1 sta txrx rec buff,x ; jsr send ack ; Reset Delay JSR BEEP_INIT JSR BEEP_1 Ida #!60 jsr wait acm 100ms ;delay 6sec JSR BEEP_INIT JSR BEEP_1 jsr send ack MAIN: JSR TIMER_INIT ; and enable irq from the receiver Ida #kbd_counter_ll sta kbd_ccunter_msb clr kbd counter lsb 444 ; XOL Pπmaty Setup For Compander ' s PLL . *** ** * Enable SIOP in Master Mode Ida #50h sta SCR ] s r SetupPllPort ]sr RegSetup ; Write Defaults to Regs & Shadow Ida #070h ; Delay j sr waιt_acc_ms ; Stop Script Ida #0FFh jsr SendM ; END XOL CLI ; ENABLE ALL IRQS NOP M AIN LOOP: nop MAIN 1: BRCLR SYNC_DET_FLAG, FLAGS_BYTE,MAIN_2 jsr waιt_rf_mssg_2 ;get the rf message brclr sync_det_flag, flags_byte,maιn_l_l ;msg fail? BCLR SYNC_DET_FLAG,FLAGS_BYTE SEI ; DISABLE ALL IRQS jsr decode_cmd main 1 1 : JSR TIMER_INIT ; and enable irq from the receiver CLI ; ENABLE ALL IRQS MAIN 2: dec kbd_counter_lsb bne maιn_3 dec kbd_counter_msb bne mam 3 Ida #kbd_counter_l1 sta kbd counter msb SEI : DISABLE ALL IRQS jsr scan sensor CLI : ENABLE ALL IRQS main 3 : ; Check End of Listen Time brclr MIC_OPEN_FLAG, FLAGSl_BYTE,MAIN_LOOP ;Mιc Closed brset TOIE,TCR,MAIN LOOP ; Timer Still Work : Close MicroDnone 445 j sr ListenClose ; Set Tx-On, Rx-Mute , Spk-Mute ; Stop Script Ida #0FFh sr SendM BRA MAIN_LOOP , . * ** * * * ** ** ** * * ** **** * **** * *** * ******** ***** ** * ** ** *** * **** ** ** * * *** scan_sensor: jsr get_sensor cmp #$0ff beq scan_sensor_exιt Ida #unιt_status_cmd ldx #1 sta txrx_rec_buff,x jsr send_ack Ida #kbd_counter_12 ;longer time for next scan time. sta kbd_counter_msb ; Stop Current Script ;lda #0FFh ;jsr SendM scan_sensor_exιt: rts .**********************************************+******************** GET_SENSOR: ; check if a sensor is pressed and if so, return a value in the ACC ;ιf no sensor, then the ACC=FF clra brset ΞENSE_l_bιt, SENSE_l_port, get_sensor_l Ida #'03 bra get sensor exit get_sensor_l : brset SENSE_2_bιt, SENSE_2_port, get_sensor_2 Ida #'01 bra get_sensor_exιt get_sensor_2 : brset SENSE_3_bιt, SENSE_3_port, get_sensor_3 Ida #<02 bra get_sensor_exιt get_sensor_3 : Ida #$0ff 446 get_sensor_exιt : rts SEND_ACK: ;send an ack to the base unit of a command that was ust received. ; format: <base#> <unιt#> <command byte> <sensor status> <0> ; Check Broadcast, if yes no ACK Ida txrx_rec_buff c p SBROADCAST beq send_ack_exιt clrx ;place the base id number Ida #base__code_number sta txrx tran buff,x incx ;x=l ;place the unit # Ida #unit_code_number sta txrx tran buff,x ;place the command Ida txrx_rec_buff,x incx ;x=2 sta txrx tran buff,x ;x=3 ;place the sensors status jsr get sensor sta txrx_tran buff,x incx ;place 0 Ida #$00 sta txrx tran buff,x jsr tx rf string send ack exit: rts .*******************************+******+********+**++**************+ SEND ACK COMPAND: 447 ;send an ack to the case unit of a companαer commanα. ; format: <base#> <unιt#> <commanα_Dyte> <compander_MSB> <compander_LSB> clrx ;place the base id number Ida #base_code_number sta txrx tran buff,x mcx ;x=l ;place the unit # Ida #unιt_code_number sta txrx tran buff,x ;place the command Ida txrx rec buff,x incx ;x=2 sta txrx_tran_buff,x and #07h deca asla ; Calculate MSB Index in Shadow tax ; X-index of MSB Ida PllShadow,X sta txrx tran_buff+3 ;Load MSB incx Ida PllShadow,X sta txrx tran buff+4 ;Load LSB sr tx_rf_strιng rts .***** ****** *. * ** * * **** * ****** * *** ** **** *** ** ** ** * ** * *** * ********** *;******* ************************************************************; start Unit commands .*** **** ** **************** ** ********** *** * * * * * ** ***** ** *** * * * *** *** * ;** * **** **** **** * * * ******* * *** * ** * *************** * *** * ************** decode_cmd: ; decode unit commands. bclr ICIE_BIT,TCR_REG ; INPUT CAPTURE IRQ DISABLED SEI ; DISABLE ALL IRQS ldx #$00 Ida txrx_rec_buff , x ; unιt number c p #unιt code number 448 oeq do_decoαe_cmα cmp ^BROADCAST check broadcast bne decode cmd exit do decode cmd incx ; command byte Ida txrx rec buff,x and #0F0h cmp #unιt OLDtalk cmd bne decode cmd 111 jsr unit OLDtalk Ida txrx rec buff+1 ; restore A bra decode cmd exit decode cmd 111: Ida txrx rec buff+1 ; restore A and #0F0h cmp #unit talk cmd bne decode cmd 1 jsr unιt_talk Ida txrx_rec_buff+l ; restore A bra decode cmd exit decode cmd 1 : Ida txrx rec buff+1 ; restore A cmp #unιt_mιc_t_cmd bne decode cmd 2 jsr unit mic time bra decode cmd exit decode cmd 2 : cmp #unit mic st cmd bne decode cmd 3 jsr unit mic start bra decode cmd exit decode cmd 3 : cmp #unit_mιc_stop_c bne decode cmd 4 jsr unit mic stop bra decode cmd exit decode cmd 4 : cmp #unιt_reset_cmd bne decode cmd 5 jsr unit reset bra decode cmd exit 449 decode cmd 5 : cmp #unιt_turn_off_c bne decoαe_cmd_6 jsr unιt_turn_off bra decode_cmd_exιt decode c α 6 : cmp #unιt_general_cmd bne decode_cmd_7 jsr unιt_general bra decode cmd exit .**** ** X0L decode cmd 7 : and #0F0h ; select Hi nibble cmp #unit_compand_cmd bne decode_cmd_8 jsr compander_cmd Ida txrx_rec_buff+1 restore A bra decode cmd exit .**** * * END X0L decode cmd 8 : Ida txrx rec_buff+l restore A cmp #set_scrιpt bne decode cmd_9 jsr set scrιpt_cmd bra decode cmd exit decode cmd 9 : nop decode cmd exit: CLI ; ENABLE ALL IRQS bset ICIE_BIT,TCR_REG ; INPUT CAPTURE IRC ENABLED jsr led_off rts * *** ****** ** ****** * * * ***** ** ****** * **** * ** * ************* unιt_talk : NewToyTalk2 command syntax : <unιt ιd#><unιt_talk_cmdxtalk_tιmexlιsten_tιme><s crιpt> <s crιpt> : χχ>χχ » rχ LL I + Listen Script 2 bit + Talk Script j s r send ack ; ack ok 450 ; Send Scriot Command Ida txrx_rec_buf f+4 ; load s cript Byte ls ra lsra ; Talk Script - 00TTTTTT jsr SendM ; Open Talk Channel jsr TalkOpen Set Compander: Rx-On Spk-On Ida #'50 jsr waιt_acc_ms ; delay oefore unmute spk jsr spkr mute_off Ida txrx_rec_buff+2 ; load TalkTime sta regl ; regl = TalkTime beq unιt_talk_ex unit talk 1: ; Talk Delay Ida #0FFh sr waιt_acc_ms dec regl bne unιt_talk_l unit talk ex: ; Close Talk Channel jsr TalkClose Set Compander: Rx-Mute Spk-Mute jsr spkr_mute ; Stop Script Ida #0FFh jsr SendM ; Listen After mp do lιsten_after ********* * * ******* * * * ********** ******** ** ****** ********* ***********;***** ** ** *** **************************** ** * ** * ** ** * ******* **** * * unit OLDtalk : talk for time command syntax : <unιt ιd#xunιt_talk_cmdxtιme_msbxtιme_lsbxlιsten> talk for tιme_msb*tιme_lsb* 100ms unιt_talk_cmd = 0001 X X I i i I Motor 0 Enable I j j Motor 1 Enable I I Led Enable I Listen After Talk jsr send ack ;ack ok XOL sr TalkOpen Set Compander: Rx-On Spk-On 451 s r MUX RX TO S ? ; Send Script 0 clra j s r SendM Ida # ! 150 s r wait ace ms ; delay before unmute spk jsr spkr_mute_o f f ldx # ! 2 Ida ttxxrrxx_rreecc_bbuuff ff ,, xx ;tιme_msb sta regl unιt_OLDtalk_l : ldx # ! 3 Ida ttxxrrxx__rreecc__bbuuffff,, xx ; tιme Lsb jsr wait_acc_100ms Ida regl beq unit_OLDtalk_exιt dec regl bne unit_OLDtalk_1 unit_OLDtalk_exιt : .****** χ0L j sr TalkClose ; Set Compander: Rx-Mute Spk-Mute jsr spkr_mute ; Stop Script Ida #0FFh jsr SendM unit OLDtalk ex2 : rts .**** ***** * ********* *** ** * * *** ** *** ******** * *** * * * * ** ** ************* unιt_mιc_tιme : ToyLιstenTιme2 command syntax: <unιt ιd#xtoy_lιsten_tιme_cmdxXXXlιsten_tιme><scrιpt> <scrιpt>: xxxxxx LL + Listen Script 2 bit jsr send ack ;ack ok do listen after: ; check if Listen Ida txrx rec buff+3 452 beq lιsten_tιme_ex ; Send Script Command Ida txrx_rec_buff+4 ; load script Byte and #03h ora #40h ;Lιsten Script 010000LL jsr SendM ; Open Listen Channel jsr ListenOpen ; Set Tx-Mute, Rx-On, Spk-On ; Set Alarm timer ; Timer Tick = 131.072 ms bclr TOIE,TCR clra sta Counter_Hι Ida txrx_rec_buff+3 sta Counter_Low .****** X0L sr ListenOpen ; Set Tx-Mute, Rx-On, Spk-On ; Enable All Ints to receive commands cli ; Wait A≤inchroniosly for Counter Stop listen time ex: rts .★★A**************************************************************** set_scrιp _cmd: jsr send_ack ;ack ok. AND MUX txrx TO MCU ; store duty cycle times Ida txrx_rec_buff+2 jsr SendM rts .**** * » * ****** * ** ** ***** ****** ** *** * * *** * ** * *** * * ** * ** * ********* ** ** unιt_mιc_start: ; listen 4 transmit the microphone. jsr send_ack ;ack ok. AND MUX txrx TO MCU bclr TOIE,TCR Ida #0FFh sta Counter_Low clr Counter_Hι jsr ListenOpen ; Set Tx-Mute, Rx-On, Spk-On ; Enable Ail Ints to receive commands 453 cl. rts unιt_mιc_stop : ;stop listenning for the microphone. jsr ListenClose ; Set Compander: Tx-Mute jsr send_ack ;ack ok rts .***************** ** ********************************************** * * unιt_reset : ; reset the unit. mp start_op .*********************** * ******************************************* unιt_turn_off : ;shutt off the power to the circuit, enter power save mode, jsr send_ack ;ack ok jsr shutt_off ;all pιns=0 & inputs & turn off voltage ; stop ;stop osc. irq or reset > exit to RESET . unιt_turn_off_l : mp unιt_turn_off_l .************* * ******************************************* * ********* unιt_general : ;a general command, each unit can have a different data fields & action to that ; command . jsr send acK ;ack ok ldx #'2 Ida txrx rec buff,x ;motor direction cmp #'1 bne unit general 1 ; sr motor_left bra unιt_general_ex unit general 1 : cmp #'2 bne unit general ex ; jsr motor right unιt_general_ex : rts 454 . ******************************************************************* ;start of RF proc *************************************** r . ************ * ********** ***************************************^ ;oz rf general proc »*********************+********************************************* ******** * ** ** * * ***** * ** **** ********* * ***** * ** *** **** * * ** ** * * * ** ** *** TXRX TEST: CLRX TXRX TEST L: LDA MIDI_TEST_STR,X STA TXRX_TRAN_BUFF, X INCX CPX #5 BNE TXRXJTEST_L JSR TX RF STRING RTS ********** *** ********** *** * * ******** * *** * **** * ************ * **** ** ** test_compare: ; compare the received 4 bytes to the test bytes in rom. clrx test compare 1: Ida mιdι_test str,x cmp txrx_rec_bu f, x bne test comp exit incx cpx #5 bne test compare 1 LDA #50 JSR BEEP_2 jsr blιnk_led2 test comp_exιt: rts . *** * * ************** * **** * * TXRX INIT PINS: ; 455 3CLR CLK_BIT,CLK_PORT BSET CLKJ3IT,CLK_DDR ; OUTPUT BCLR DATA_BIT,DATA_PORT BSET DATA_BIT,DATA_DDR BCLR RF_EN_BIT,RF_EN_PORT BSET RF_EN_BIT,RF_EN_DDR BSET TX_B2_BIT,TX_B2_PORT ;TX BUFFER AMP CONTROL INPUT. ACTIVE LOW BSET TX_B2_BIT,TX_B2_DDR BSET TX_B2_BIT,TX_B2_PORT ;TX VCO CONTROL INPUT. ACTIVE LOW. BSET TX_B2_BIT,TX_B2_DDR BCLR TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=0 BSET TX DATA BIT,TX DATA DDR ;OUT BCLR LDT BIT,LDT DDR ;Set LDT pin to Input RTS .*********************+******************************** TRANSMITTER_ON : BCLR TX_B2_BIT,TX_B2_PORT RTS TRANSMITTERJDFF: BSET TX_B2_BIT,TX_B2_PORT RTS .*******************************+********************** TXRX_SET_FREC: ; INIT THE TRANCEIVER FOR A TX & RX FREOUENCY . ; oz LDA # ! 100 JSR WAIT_ACC_MS ;;; Frx = 926.9875 N=75895 LDA #$05 STA REG1 LDA #$28 STA REG2 LDA #$77 456 STA REG3 JSR TXRX_PRG_19 BITS Ftx = 902.9875 N=72239 LDA #$03 STA REGl LDA #$1A STA REG2 LDA #$2F STA REG3 JSR TXRX_PRG_19_BITS LDA #$3D STA REGl LDA #$48 STA REG2 LDA #$00 STA REG 3 JSR TXRX_PRG_14_BITS LDA #$0A ;0A STA REGl LDA #$00 STA REG2 LDA #$00 STA REG3 JSR TXRX PRG 14 BITS RTS . * ** * ********* TXRX_PRG_19_BITS: ; PROGRAM THE PLL WITH 19 BITS ;BITS ARE STORED IN REGl, REG2, REG3 ;REG1=3 MSB BITS ;REG2=8 MIDDLE BITS ;REG3=8 LSB BITS BCLR CLK_BIT,CLK_PORT BCLR DATA_B I T , DATA_ P 0 RT BCLR RF EN BIT,RF EN PORT LDX #8 LDA REG3 ; GET 8 LSB BITS JSR TXRX PLL PRG 457 LDX #8 LDA REG2 ; GET 8 JSR TXRX_PLL_PRG LDX #3 LDA REGl ;GET 3 MSB BITS JSR TXRX PLL PRG BSET RF EN BIT,RF EN PORT ; STROBE PULSE NOP NOP NOP NOP NOP NOP BCLR RF_EN_BIT, RF_EN_PORT BCLR CLK_BIT,CLK_PORT BCLR DATA BIT, DATA PORT RTS , TXRX_PRG_14_BITS : ; PROGRAM THE PLL WITH 14 BITS ; BITS ARE STORED IN REGl , REG2 , REG3 ; REG1=6 MSB BITS ; REG2=8 LSB BITS ; REG3=NC BCLR CLK_BIT , CLK_PORT BCLR DATA_BIT , DATA_PORT BCLR RF_EN_BIT , RF_EN_PORT LDX #8 LDA REG2 ; GET 8 LSB BITS JSR TXRX_PLL_PRG LDX #6 LDA REGl ;GET 6 MSB BITS JSR TXRX PLL PRG BSET RF EN 3IT,RF EN PORT NOP NOP 458 NOP NOP NOP NOP BCLR RF_EN_BIT, RF_EN_PORT BCLR CLK_BIT,CLK_PORT BCLR DATA BIT, DATA PORT RTS .********** ** . ** * **** *** * ** * ***** * ****** ** * ** ******* *** * * * ** * ** * * * * , TXRX_PLL_PRG: ; PROGRAM THE PLL WITH THE BYTE STORED IN ACC AND WITH THE NUMBER ;OF BITS STORED IN WAIT REGl LSRA BCC TXRX_PLL_PRG_1 BSET DATA_BIT, DATA_PORT BRA TXRX PLL PRG 2 TXRX PLL PRG 1: BCLR DATA BIT, DATA PORT TXRX PLL PRG 2: NOP NOP NOP BSET CLK BIT, CLK PORT NOP NOP NOP NOP BCLR CLK BIT, CLK PORT DECX BNE TXRX PLL PRG NOP NOP BCLR DATA BIT, DATA PORT NOP NOP RTS .************ *,^******÷**^. ********************************< TIMER_INIT: ;INIT THE INPUT CAPTURE ;BCLR IEDG_BIT,TCR_REG ;NEGATIVE EDGE BSET IEDG BIT,TCR REG ; Positive edge EDGE 459 ;BCLR TOIE BIT,TCR REG ; TIMER OVERFLOW IRC DISABLED BCLR OCIE_BIT,TCR_REG ;OUTPUT COMPARE IRQ DISABLE BSET ICIE_BIT,TCR_REG ; INPUT CAPTURE IRQ ENABLED BCLR SYNC_DET_FLAG, FLAGS_BYTE ;WILL BE SET WHEN SYNC DETECTED CLR SYNC_COUNTER BSET FIND_SYNC_FLAG, FLAGS_BYTE ; FIND SYNC MODE BCLR FIND BIT FLAG, FLAGS BYTE ;NOT IN FIND RF BIT MODE LDA TSR_REG ;AND CLR THE ICF IRQ BIT LDA ICRL REG BCLR TEST_PIN1_BIT,TEST_PIN1_P0RT ; ' 1 ' =OFF BSET TEST_PIN1_BIT,TEST_PIN1_DDR ; OUTPUT BCLR TEST_PIN2_BIT,TEST_PIN2_PORT ;'l'=OFF BSET TEST PIN2 BIT,TEST PIN2 DDR ;OUTPUT CLI ; ENABLE ALL IRQS RTS / .****** ** * ** ***** * ***** ** **** * * * ********** * ************** *** ****** * * WAIT_NO_CARR: ;WAIT TILL NO CARRIER, THEN OK_FLAG=l ;USES ACC BSET OK_FLAG,FLAGS_BYTE BRSET CAR_DETECT_BIT, CAR_DETECT_PORT, W_NO_CARR_EX LDA #!100 ;100MS W NO CARR LOOP: JSR WAIT_1MS BRSET CAR DETECT BIT, CAR DETECT PORT,W NO CARR EX DECA BNE W NO CARR LOOP BCLR OK FLAG, FLAGS BYTE W NO CARR EX: RTS / WAIT_TO_CARR: ;WAIT TILL CARRIER, THEN OK_FLAG=l ;USES ACC,X BSET OK_FLAG , FLAGS_BYTE BRCLR CAR_DETECT_BIT , CAR_DETECT_PORT , _TO_CARR_EX LDA # ' 200 ; 204 . 8 MS LDX # ' 0 ; 256 * 8 = 2048 CYC = 1 . 024ms 460 W TO CARR LOOP : BRCLR CAR_DETECT_BIT , CAR_DETECT_PORT , W_TO_CARR_EX ; 5 CYC DECX ; 3 CYC BNE WJTO_CARR_LOOP ; 3 CYC DECA BNE W_TO_CARR_LOOP BCLR OK FLAG, FLAGS BYTE W TO CARR EX : RTS ******* * *************** ***************• < rf receiver proc ***** * ********* * ** ** *** * *** * *************** * ******* ** *** **** ******* WAIT_RF_mssg: ;if the RF message was received fine then the SYNC_DET_FLAG="1" ;time out after aprx 600ms JSR TIMER_INIT LDX #!200 LDA #!255 ;256*llus=2.8MS WAIT RF MSSG 1: BRSET SYNC_DET_FLAG,FLAGS_BYTE,WAIT_RF_MSSG_2 ; 5CYC DECA ;3 CYC BNE WAIT_RF_MSSG_1 ;3 CYC DECX BNE WAIT_RF_MSSG_1 ;3 CYC BRA W_RF_MSSG_FAIL bra wait rf mssg_l WAIT RF MSSG 2: JSR REC_HEADER BRSET REC_HEADER_FLAG, FLAGS1_BYTE, WAIT_RF_MSSG_3 BRA W RF MSSG FAIL WAIT RF MSSG 3: JSR DETECT_STR BRCLR BYTE_DTCTED_FLAG, FLAGS1_BYTE, W_RF_MSSG_FAIL NOP jsr test_compare ;BLINK LED IF OK BRA W_RF_MSSG_EXIT W RF MSSG FAIL: BCLR SYNC DET FLAG, FLAGS BYTE 461 W RF MSSG EXIT: RTS REC_HEADER: ; after detecting the sync, need to wait for 1 byte of header. ; first wait for the first bit: BSET FIND_BIT_FLAG,FLAGS_BYTE ;THE TIMER WILL DETECT BITS CLR TXRX_BYTE clr header_bιt_cntr LDX #!10 ;10*5.3ms=53ms to search LDA #!255 ; 5.3mS STA REG2 REC HEADER L: BRSET BIT_DTCTED_FLAG,FLAGS1_BYTE,REC_HEADER_BIT ; 5CYC BRSET BIT_DET_FAIL_FL, FLAGS1_BYTE, REC_HEADER_BAD BRSET CAR DETECT BIT, CAR DETECT PORT, REC HEADER FAIL ;NO CARRIER DEC REG2 ; 3CYC BNE REC HEADER L ;3CYC DECX BNE REC HEADER L ;5+5+5+3-r3=21 BRA REC HEADER FAIL REC_HEADER_BAD : ; failed so clr the txrx_byte CLR TXRX_BYTE clr header Dit_cntr BCLR BIT_DTCTED_FLAG, FLAGS1_BYTE BCLR BIT_DET_FAIL_FL, FLAGS1_BYTE BRA REC_HEADER_L REC_HEADER_BIT : ;bit detected ok, so rotate the txrx_byte until detects the header byte. BCLR BIT_DTCTED_FLAG, FLAGS1_BYTE BCLR BIT_DET_FAIL_FL,FLAGS1_BYTE BRSET BIT DETECTED BIT, FLAGS 1 BYTE, REC HEADER BIT1 462 C C BRA REC HEADER BIT2 REC HEADER BIT1 : SEC REC HEADER BIT2 : ROL TXRX_BYTE inc neader_bιt_cntr Ida neader_bιt_cntr cmp 08h ; if number of received bits < 8 bcs REC HEADER L ; don't check ToyNumber - get next bit ; Check And Close Microphone brclr MIC_OPEN_FLAG, FLAGS1_BYTE, mic_closed jsr ListenClose mic closed: LDA TXRX_BYTE CMP #UNIT_CODE_NUMBER beq ok_Contιnue cmp #BROADCAST Check Broadcast BNE REC HEADER L ok Continue: sta TXRX_REC_BUFF ; Store Received Byte BSET REC_HEADER_FLAG, FLAGS1_BYTE BRA REC HEADER EXIT REC HEADER FAIL: BCLR REC HEADER FLAG, FLAGS1 BYTE REC HEADER EXIT: NOP RTS . * *** * **** ***** ********* * * ******** ^ ******* DETECT_STR: ; detect 4 more bytes after the header. ;BCLR IEDG_BIT,TCR_REG ; NEGATIVE EDGE BSET IEDG BIT,TCR REG ; NEGATIVE EDGE CLRX ;LDA #UNIT_CODE_NUMBER ;STA TXRX REC BUFF,X INCX DETECT STR L: JSR DETECT_BYTE BRCLR 3YTE_DTCTED_FLAG, FLAGS 1_BYTE, DETECT_STR_FAIL 463 LDA TXRX_BYTE STA TXRX_REC_3UFF,X ;BCLR IEDG_BIT,TCR_REG ;NEGATIVE EDGE, prepare for next ovte BSET IEDG BIT,TCR REG ;NEGATIVE EDGE INCX CPX #!5 BNE DETECT_STR_L BRA DETECT STR EXIT DETECT STR FAIL: NOP DETECT STR EXIT: BCLR FIND BIT FLAG, FLAGS BYTE ;THE TIMER WILL STOP DETECT 3ITS RTS .****** * **************** * *** ** ******* * ****************************** DETECT_BYTE: ; detect 8 bits from the receiver. ;save result in TXRX_BYTE BCLR BYTE_DTCTED_FLAG, FLAGS 1_BYTE CLR TXRX_BYTE LDA # ! 8 STA REG3 ; COUNTER LDA #!5 ;4*5.3ms=21ms to search STA REGl LDA #!255 ; 5.3mS STA REG2 DETECT BYTE L: BRSET BIT_DTCTED_FLAG,FLAGS1_BYTE,DETECT_BYTE_BIT ; 5CYC BRSET BIT_DET_FAIL_FL, FLAGS 1_BYTE, DETECT_BYTE_BF BRSET CAR DETECT BIT, CAR DETECT PORT, DETECT BYTE FAIL ;NO CARRIER DEC REG2 ; 3CYC BNE DETECT_BYTE_L ;3CYC DEC REGl BNE DETECT BYTE L ,-5+5+5+3+3=21 464 BRA DETECT_3YTE_FAIL DETECT_BYTΞ_BIT : ; bιt detected o k , s o rotate the txrx_byte until detects 8 bits . BCLR 3IT_DTCTED_FLAG, FLAGS 1_BYTE BCLR BIT_DET_FAIL_FL , FLAGS 1_BYTE BRSET 3IT_DETECTED_BIT , FLAGS 1_BYTE , DETECT_3YTE_BIT1 CLC BRA DETECT_BYTE_BIT2 DETECT_BYTE_BF: ; the first time to check a byte we get fail (because of the space between one ;byte to the other, so if the fail appears at bit #0 we continue to check. BCLR BIT_DET_FAIL_FL,FLAGS1_BYTE ; INIT LDA REG3 CMP # ! 8 BEQ DETECT_BYTE_L BRA DETECT BYTE FAIL ;NOT THE FIRST BIT SO FAIL DETECT BYTE BIT1: SEC DETECT BYTE BIT2 : ROL TXRX_BYTE DEC REG3 BNE DETECT_BYTE_L BSET BYTE_DTCTED_FLAG, FLAGS1_BYTE BRA DETECT BYTE EXIT DETECT BYTE FAIL: NOP DETECT BYTE EXIT: RTS **** * ************* * ************************ * **** * TIMER SYNC: ; Check Int Source brclr TOF, TSR, Capture_Int ; Clear TOF Ida TRL ; Decrement Word Counter Ida Counter_Low sub #01h sta Counter_Low bcc Check_Zero ιf( 'Carry) goto Check_Zero dec Counter Hi else dec Counter Hi Check Zero: ; Check if WordCounter == 0 465 o ra ounter_H ; Counte r_Lo I Coun < bne TOI_Exιt ; not Z ero ; 2ero in Counter . Dis able next Overflow Int bclr TOIE , TCR TOI_Exιt : rti Capture_Int : ; JUMP TO THIS ROUTINE WHEN DETECTS HIGH TO LOW IN INPUT CAPTURE PIN ( PD7 #25 ) ;each timer tick s 2us (4mhz crystal) and the counter counts up (0-ffff). BSET CAPTURE_FLAG, FLAGS_BYTE ;5ET CAPTURE FLAG NEED TO CLR THE ICF FLAG BY READING THE TSR REG AND ICRL REG. BCLR TEST_PIN2_BIT, TEST_PIN2_PORT BCLR TEST_PIN1_BIT, TEST_PINl_PORT LDA TSR_REG LDA ICRL REG ; INPUT CAPTURE REG LOW. BRSET CAR_ DETECT_BIT,CAR_DETECT_PORT,TIMER_SYNC_FAIL ;NO CARRIER CLC SBC TIMER_LSB_BYTE ;LAST RESULT OF INPUT CAPTURE STA TIMER_DIFF_LSB ; DIFFERENT VALUE LDA ICRH_REG ; INPUT CAP HIGH SBC TIMER_MSB_BYTE STA TIMER DIFF MSB ;NOW SAVE CAURRENT CAPTURE VALUE LDA ICRH_REG STA TIMER_MSB_BYTE LDA ICRL_REG STA TIMER_LSB_BYTE BRSET FIND_BIT_FLAG, FLAGS_BYTE, TIMER_SYNC_BIT BRCLR FIND_SYNC_FLAG, FLAGS_BYTE, TIMER_SYNC_EXIT JSR CHECK_TIME ; CHECK IF 400<t<600 us BRCLR IF FLAG, FLAGS ^ BYTE, TIMER_SYNC_FAIL INC SYNC_COUNTER LDA SYNC COUNTER 466 CMP #'10 BNE TIMER_SYNC_EXIT ; 3CS BSET SYNC_DET_FLAG, FLAGS_BYTE BSET FIND_SYNC_FLAG, FLAGS_BYTE CLR SYNC_COUNTER BRA TIMER_SYNC_EXIT TIMER SYNC BIT : JSR BIT_TIMER BRA TIMER_SYNC_EXIT TIMER SYNC FAIL : CLR SYNC_COUNTER CLR SYNC DET FLAG NOP TIMER SYNC EXIT: NOP RTI BITJTIMER: ;EACH RF BIT IS WITHIN THE TIME OF 750us ; "l » = 00us CYCLE ; » 0"=1200UΞ CYCLE BCLR BIT_DTCTED_FLAG, FLAGS1_BYTE ;init BCLR BIT_DET_FAIL_FL, FLAGS1_BYTE ;init BCLR BIT_DETECTED_BIT, FLAGS1_BYTE ; status of the detected bit ;CACULATE THE BIT WHEN THE RX WAS IN "0" OR IN "1" ;SAVE RESULT IN TIMER_ZERO_H, TIMER_ZERO_L OR IN TIMER_ONE_H, TIMER_ONE_L IF 200us<ZEROTIME<250us AND ; the detected period is CYCLE JSR IF_ZERO_TIME BRCLR IF_FLAG, FLAGS_BYTE, BIT_TIMER_1 BSET BIT_DTCTED_FLAG, FLAGS1_BYTE ;inιt BCLR BIT DETECTED BIT, FLAGS1 BYTE ; status of the detected bit BRA BIT TIMER EXIT BIT TIMER 1: JSR IF_ONE_TIME BRCLR IF_FLAG, FLAGS_BYTE, BIT_TIMER_FAIL BSET BIT DTCTED FLAG, FLAGS1 BYTE ;mιt 467 BSET 3IT_DETECTΞD_BIT, FLAGS 1_BYTE ; status of the detected bit BRA BIT_TIMER_EXIT BITJTIMER_FAIL: BSET BIT JDET_FAIL_FL, FLAGS 1_BYTE ;ιnιt BIT_TIMER_EXIT : RTS .*****************+************************************************* CHECKJTIME: ;we will check δOOus (275=113h) (THE ACTUAL TIME IS 525US /2 = 106H) ;and 400us (200=0c8h) BSET IF_FLAG,FLAGS_BYTE LDA TIMER_DIFF_MSB CMP #$02 ;=2 BCC CHECK TIME FAIL ;BIGGER/EQUL 02xxH CMP #$01 ;=1 BNE CHECK TIME _A LDA TIMERJDIFF_ _LSB ;MSB=1, SO CHECK ALSO LSB CMP #$20 ;14 BCC CHECK_TIME_ _FAIL BRA CHECK_TIME_ _EXIT ;OK CHECK TIME A: ;=0 LDA TIMERJDIFF_ _LSB CMP #$0E0 ;C8 BCS CHECK_TIME_ _FAIL BRA CHECK TIME EXIT CHECK TIME FAIL: BCLR IF FLAG, FLAGS BYTE CHECK_TIME_EXIT : RTS .******************************* + ********************************! IF_ONE_TIME: each timer tick is 2us (4mhz crystal) the "1" cycle is 700us and the "0" cycle is 1200us 700/2=350 = 15e (we will check 600/2=300=12c and 800/2=400=190) 1200/2=600=258h (we will check 1100/2=550=226 and 1300/2=650=28a) BSET IF_FLAG,FLAGS_BYTE LDA TIMER DIFF MSB 468 CMP #$ 01 ;=1 BNE IF ONE TIME FAIL LDA TIMER_DIFF_LSB ;MSB=1, SO CHECK ALSO LSB CMP #$2C BCS IF_ONE_TIME_FAIL CMP #$9F BCC IF_ONE_TIME_FAIL ; bset TEST_PIN2_BIT, TEST_PIN2_PORT BRA IF_ONE_TIME_EXIT ;OK IF_ONE_TIME_FAIL : BCLR IF FLAG, FLAGS BYTE IF_ONE_TIME_EXIT : RTS .** * ** ** * *** * *** * * * ***** * * * * ** * * *** * * ************* *** ** ** * *** * * ** ** * IF_ZERO_TIME: each timer tick is 2us (4mhz crystal) the "1" cycle is 700us and the "0" cycle is 1200us 700/2=350 = 15e (we will check 600/2=300=12c and 800/2=400=190) 1200/2=600=258h (we will check 1100/2=550=226 and 1300/2=650=28a) BSET IF_FLAG, FLAGS_BYTE LDA TIMER DIFF MSB CMP #$02 ;=1 BNE ZERO_TIME_FAIL LDA TIMER_DIFF_LSB ; ;MMSSBB==1, SO CHECK ALSO LSB CMP #$26 BCS ZERO_TIME_FAIL CMP #$9A BCC ZERO_TIME_FAIL bset TEST_PIN1_BIT, TEST_PINl_PORT BRA ZERO TIME EXIT ;OK ZERO TIME FAIL: BCLR IF FLAG, FLAGS BYTE ZERO TIME EXIT: RTS rf tx proc , * ****** ** ** * * ****** * ************************** * ** * * ** ** ** ***** * ** *- 469 TX_RF_STRING: TRANSMIT A STRING OF 5 BYTES - TXRX_TRAN_BUFF THE STRING IS STORED IN TXRX_TRAN_BUFF USES ACC,X SEI ; DISABLE IRQ bclr :CIE_BIT,TCR_REG ; INPUT CAPTURE IRQ DISABLED BCLR TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=0 ;JSR MUX_TXRX_TO_MCU JSR TRANSMITTER_ON jsr CompanderOff ;Set Compander to not Active mode ; Wait For PLL Lock Positive Level of LDT Wait_LDT: brclr LDT_BIT,LDT_PORT LDA #!120 JSR WAIT_ACC_MS JSR TX_RF_SYNC LDX #0 TX_RF_STR_LOOP : LDA TXRX_TRAN_BUFF, JSR TX_RF_BYTE INCX CPX #!5 BNE TX RF STR LOOP ;TX LOW TO COMPLETE LAST BIT BCLR TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=0 JSR WAIT_100US JSR WAIT_100US JSR WAIT_100US BSET TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=1 LDA #5 JSR WAIT_ACC_MS JSR TRANSMITTER_OFF jsr CompanderOn ; Set Compander to Active Mode ; TX_RF_STRING_EXIT : CLI ; enable ALL IRQS bset ICIE BIT,TCR REG ; INPUT CAPTURE IRQ ENABLED 470 RTS TX_RF_BYTE : ; TRANSMIT 1 BYTE. MSB FIRST :"1"=CYCLE OF 700US , "0"=CYCLE OF 1200US (SYNC=CYCLΞ OF 500US) send sb first. SAVE THIS BYTE IN ACC BEFORE EXECUTING THIS ROUTINE. USES ACC, REGl STX REGl LDX #0? TX RF BYTE L: LSLA BCC TX RF BYTE 1 ;TX BCLR TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=0 JSR WAIT_100US JSR WAIT_100US JSR WAIT_100US BSET TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=1 JSR WAIT_100US JSR WAIT_100US JSR WAIT_100US JSR WAIT 100US BRA TX RF BYTE 2 TX RF BYTE 1: ;TX "0' BCLR TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=1 JSR WAIT_500US JSR WAIT_100US BSET TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=0 JSR WAIT_500US JSR WAIT_100US TX RF BYTE 2: 471 DECX BNE TX_RF_BYTE_L LDX REGl RTS TX_RF_SYNC: ; TRANSMIT 30 CYCLES OF 500US AS SYNC LDA #!30 TX RF SYNC I: BCLR TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=1 JSR WAIT_100US JSR WAIT_100US JSR WAIT_100US BSET TX_DATA_BIT,TX_DATA_PORT ; DATA PIN=1 JSR WAIT_100US JSR WAIT_100US DECA BNE TX_RF_SYNC_L RTS / .★★★★★♦■a-****-******************************************************** ; end of rf proc .** **** • **************** * * * ** * ********** ** **** * * * ******************** BEEP_1 : LDA #!100 BEEP 2: JSR SPKR_MUTE_OFF ; JSR MUX_MCU_TO_SP BEEP 1 BCLR BEEP_PIN_BIT,BEEP_PIN_PORT JSR WAIT_1MS BSET BEEP_PIN_BIT,BEEP_PIN_PORT JSR WAIT_1MS 472 DECA BNE 3EEP_1_L JSR SPKR_MUTE RTS ** *** ************ . ** » ^ » ***************** * ****** . ** . ^ . ^ . lfc . lt . **^ . ************* BEEP_INIT: BCLR 3EEP_PIN_BIT,BEEP_PIN_PORT BSET 3EEP_PIN_BIT,BEEP_PIN_DDR ; OUTPUT RTS OUTPUT_INIT: ; disable the output driver. BCLR MOTOR_l_BIT,MOTOR_l_PORT BCLR MOTOR_l_BIT,MOTOR_l_DDR RTS * ****** ** ** * ** ********************* * ** * ** * * ** ************* * * ** * * **** SHUTT_ON: ;set the shutt_off pm to "1" to allow power to the rest of the circuit. BSET POWER_LOCK_BIT, POWER_LOCK_PORT BSET POWER_LOCK_BIT, POWER_LOCK_DDR ; OUTPUT RTS ******* * ** ** * **************** * * ********** *** * * ***** ****** ** * ******** SHUTT_OFF: ;set the shutt_off pm to "0" to shutt off power to the rest of the circuit. ;the MCU will continue to receive power and should go to power save mode ;utιll receive an IRQ or RESET. Ida #0 sta porta sta portb sta portc sta portd sta ddra sta ddrb sta ddrc sta ddrd Bclr POWER LOCK BIT, POWER_LOCK_PORT BSET POWER LOCK_BIT,POWER_LOCK_DDR OUTPUT RTS **** **** * ** * ****************** * ******** * ********************** * **** MATRIX_INIT : there are 5 i/o pins that allow the MCU to detect the status of 2 X 3 sensor matrix. 2 of those i/o pins are used as outputs 473 ;and 3 as inputs, the MCU w ll sacn those pins to detect wnich of those ; sensors is in the "0" status. ;place the 2 line ports m "0" BCLR MATRIX_LIME_l_BIT,MATRIX_LINE_l_PORT BSET MATRIX_LINE_1_BIT,MATRIX_LINE_1_DDR BCLR MATRIX_LINE_2_BIT,MATRIX_LINE_2_PORT BSET MATRIX_LINE_2_BIT,MATRIX_LINE_2_DDR RTS ******************************************************************** MUX_INIT : set the i/o pm to OUTPUT, also set the MUX to MCU to SPEEKER MIC to TRANSMITTER MIC to A/D BSET MUX_CNT_BIT,MUX_CNT_PORT BSET MUX_CNT_BIT,MUX_CNT_DDR RTS * * * ****** ***** * *** * ******** * *** * * ** * * * ** ***** ************ * * *** ****** SPKR_INIT: BSET MUTE_BIT,MUTE_DDR ; OUTPUT BSET MUTE_BIT,MUTE_PORT ;AND MUTE THEE SPK RTS * * * ***** * ***** * ** * ******* * ***** * ************************** ** ****** * *** SPKR_MUTE: BSET MUTE_3IT,MUTE_PORT RTS ******************************************************************** SPKR_MUTE_OFF: BCLR MUTE_BIT,MUTE_PORT RTS ******************************************************************** MUX_MCU_TO_SP: allow the MCU to beep the speeKer. the other position of the mux will connect the RF receiver to the speaker. sei BS ET MUX_CNT_B I T , UX_CNT_PORT RTS + ****** + ****** + **** + *********-»■ * ■****** + ***************** + ************. MU R TO_SP: 474 ; connect the RF receiver to the speaker. BCLR MUX_CNT_BIT,MUX_CNT_PORT RTS **** * ******************* * * * ***** * * * *** * *** * ******** *** ******** * **** * ;MUXJTXRXJTO_MCU : ; onnect the MCU to the transmitter to allow the unit to send control ;messages . BCLR MUX_CNT_BIT,MUX_CNT_PORT RTS ** ** ** ** * ** ****** * *************** * * *** * *** ****** * * ***** ** * * * * ** ** * * * MUX_TXRX_TO_MIC : connect the microphone to the transmitter. BSET MUX_CNT_BIT,MUX_CNT_PORT bset mux cnt bit,mux cnt port nop RTS * * * * ************************************************************ * *** ******* * ***************************************************** * **** * * * RF PROC ** ************************************************ * *********** * ***** ** * ******************** * ************ * * * ***** * ***************** ****** * ** * * * * *********** * ** * ************* * * *** *** * ********** * ******* * * * ** * * ** ** ** ** * ******* * ** * * * * * ****** * ****** ** **** * *** * ***** * ******** ***** WAIT_100US: ;WAIT 100 US INCLUDING THE JSR COMMAND ;IF OSC = 4MHZ THEN 1US=2CYC ;NEED TO WAIT 200 CYC ;JSR= 5 CYC STA WAIT REGl ;2 CYC 475 LDA #!30 ;2 CYC > 30*6=180 CYC WAIT_100US_L: DECA ; 3 CYC ) 3 US = 6 CYC BNE WAIT 100US L ; 3 CYC ) CLRA ;3 CYC NOP ;2 CYC LDA WAIT_REG1 ;2 CYC RTS ;6 CYC : 5+2+2 + 180+3+2+2+6=200 CYC ***** ** ****** * **** *** ******** ******* ********* * **** * ***** ** ******** * * WAIT_500US: JSR WAIT_100US JSR WAIT_100US JSR WAIT_100US JSR WAIT_100US JSR WAIT_100US RTS ******************************************************************** WAIT_1MS : ;WAIT 1 MSEC (2000 CYC) WITH THE JSR ;JSR= 5 CYC STA WAIT REGl ;2 CYC LDA #!248 ;2 CYC > 248*8=1984 CYC WAIT IMS L: DECA 3 CYC 8 CYC NOP 2 CYC BNE WAIT_1MS_L 3 CYC NOP 2 CYC LDA WAIT_REG1 2 CYC RTS 6 CYC 5+2+1984+2+2+6=2001 CYC * * ** * * *** * ********** *** ********* •, WAIT_ACC_MS : ;WAIT ACC X IMS ; CLEARS THE ACC VALUE WHEN EXIT JSR WAIT IMS 476 DECA BNE WAIT ACC MS RTS ******* r*********τl k-**************ι tτ***********ι WAIT_ACC_100MS: ;WAIT ACC X 100MS ; CLEARS THE ACC VALUE WHEN EXIT STA WAIT REG2 LDA WAIT_REG2 BEQ W_ACC_100MS_ΞXIT WAIT_ACC_100MS_S : LDA #!100 WAIT_ACC_100MS_L: JSR WAIT IMS DECA BNE WAIT_ACC_100MS_L BRSET CAR DETECT BIT , CAR DETECT P0RT, w acc_100ms_exιt ; NO CARRIER DEC WAIT_REG2 BNE WAIT ACC 100MS S W ACC 100MS EXIT [":: RTS ** * * * * * * * * * ** *** * ** ** * *** * ** * * *** * ***** ****** ** ***** * *** ** **** WAIT_acm_100ms : ; ;WAIT ACC X 100MS ; CLEARS THE ACC VALUE WHEN EXIT STA WAIT REG2 LDA WAIT_REG2 BEQ W_acm_100ms_EXIT WAIT_acm_100ms_S : LDA #!100 WAIT_acm_l0Oms_L: JSR WAIT_1MS DECA BNE WAIT_acm_100ms_L ; sr change_ιo2 ; change ι/o#2 from 0>1 1>0 DEC WAIT_REG2 BNE WAIT ac 100ms S W_acm_100ms_EXIT: RTS ;XOL 477 .****** ?LL programming Library ****** $ιnclude "plllib.asm" . ******* Q Q fault PLL Settings in ROM DEF_SET: db REG1HI db REG1LO db REG2HI db REG2LO db REG3HI db REG3LO db REG4HI db REG4LO db REG5HI db REG5LO db REG6HI db REG6LO db REG7HI db REG7LO Proc RegSetup : Set Compander registers to default Input: No Output: No Spoild Regs: A, X, Tmpl, Tmp2 RegSetup: clrx SetupLoop: ;Out Address txa lsra inca jsr OutPLLAddr ;Out Data stx Tmp2 ; Store X Ida DEF_SET,X ; Load Hi Default Value to A ldx DEF_SET+1,X ; Load Lo Default Value to X sr OutPLLData ; Out Data ; Store to Shadow ldx Tmp2 ; Restore X Ida DEF_SET,X 478 sta PllShadow,X ; Store Hi byte Ida DEF_SET+1,X sta PllShadow+l,X ; Store Lo byte incx incx cmpx #0E bne SetupLoop rts Proc CompanderOff : Set Compander to Inactive Mode Input: No Output: No Spoild Regs: A,X,Tmpl CompanderOf : Ida #04 Data to Register 4 jsr OutPLLAddr Ida P114Lo ora #%00011000 Set Inactiv Mode sta P114LO tax Low Byte to X Ida P114Hi Hi Byte to X jsr OutPLLData Out Data rts Proc CompanαerOn : Set Compander to Active Mode Input: No Output: No Spoild Regs: A,X,Tmpl :rOn: Ida #04 Data to Register 4 jsr OutPLLAddr Ida P114Lo and #%11100111 ; Set Activ Mode sta P114Lo tax ; Low Byte to X Ida P114Hi ; Hi Byte to X jsr OutPLLData ; Out Data rts 479 Proc TalkOpen : Set Rx-On, Spk-On Input: No Output : No Spoild Regs: A,X,Tmpl TalkOpen: Ida #04h jsr OutPLLAddr Ida P114LO and #%11111100 ; Set Rx-On Spk-On sta P114Lo tax ; Load Lo to X Ida P114H1 ; Load Hi to A jsr OutPLLData rts Proc TalkClose : Set Rx-Mute, Spk-Mute Input: No Output : No Spoild Regs: A,X,Tmpl TalkClose: Ida #04h jsr OutPLLAddr Ida P114Lo ora #%00000011 ; Set Rx-Mute Spk-Mute sta P114Lo tax ; Load Lo to X Ida P114H1 ; Load Hi to A jsr OutPLLData rts Proc ListenOpen : Set Tx-On Input: No Output: No Spoild Regs: A,X,Tmpl ListenOpen: Ida #04h jsr OutPLLAddr Ida P114Lo 480 and #%11111011 ; Set Tx-On sta P114Lo tax ; Load Lo to X Ida P114H1 ; Load Hi to A jsr OutPLLData JSR TRANSMITTERJDN bset TOIE,TCR ; Enable Timerl bset MIC_OPEN_FLAG, FLAGS1_BYTE rts Proc L.. .stenClose : Set T - -Mute Input: No Output: No Spoild Regs : A,X, . Tmpl stenClose : Ida #04h sr OutPLLAddr Ida P114LO ora #%00000100 ; Set Tx-Mute sta Pll4Lo tax ; Load Lo to X Ida P114H1 ; Load Hi to A jsr OutPLLData JSR TRANSMITTER_ _OFF bclr TOIE,TCR ; Enable Tιmer( bclr MIC_OPEN_FLAG, FLAGS 1_BYTE rts Proc compander_cmd : Read/Write to Compander Data Register Command = 0 1 0 1 r/w addr I 3 bit address + 0-read 1-wrιte Input: No Output: No Spoild Regs: A, X,Tmpl,Tmp2 compander cmd: Ida txrx rec buff+1 ; A=command 481 bit #08h Check Bit r/w bne wrιte_compano ; Read and Send jsr SEND_ACK_COMPAND bra compand_exιt wrιte_compand: jsr send_ack Ida txrx_rec_buff+1 ; A=command and #07h ; Select Addres from Command sta Tmp2 ; Tmp - Register Adddress jsr OutPLLAddr ; Store new Data To Shadow Memory Ida Tmp2 deca asla tax ;X - Index of hadow MSB Ida txrx_rec_buff+2 ; Load MSB to A from command sta PllShadow, ; Store Hi Byte to snadow Ida txrx rec buff+3 ; Load LSB to A from command incx sta PllShadow, x ; Store Lo Byte to shadow ;Out Data tax ;X=LSB Ida txrx_rec_buff+2 ;A=MSB jsr OutPLLData ; Out Data Ida #70h jsr wait ace ms compand_exιt : rts Proc SendM : Send byte teougnt SPI to Moution Module Input: A - Byte to Send Output: No Spoild Regs : A SendM: sta Tmp3 Ida #66h sta SDR ;Send SYNC 482 ; Wai t xmi t Done WaitS IOP l : orcl r S PI F, S3R, WaitS IOPl Ida SDR ; Clear SPI F Ida Tmp 3 sta SDR ;Send Data ; Wait x it Done WaιtSIOP2: brclr SPIF, SSR, WaιtSIOP2 Ida SDR ; Clear SPIF rts ******* ** *** * ** ******* ** * * **** * * * * **** * ***** **** ** * * * ** ****** * * ***** * INTERRUPT VECTORS * ** * **** * ******** * ******** * ******* ** * ** * **** ******* * * ** * ** ** * * *** *** VECRESET: THIS IS THE POWER ON RESET ROUTINE DISABLE ALL INTERRUPTS: SEI JMP START_OP ; * * *** ***** * * * **** * ****** * ***** * * **** * IRQ_PROC: executed after an ιrq\ signal. jump here 16cyc after the event (high to low) . the mcu also saves ccr, ace, x,pch,pcl registers. RTI *** * * ** * *** ** **** * ************* * ** ** * VECSWI : ;THIS IS THE SWI SOFTWARE INTERRUPT ROUTINE RTI *********** * * ** * *********** * * ******** VECSPI: ;THIS IS THE PERIPHERAL INTERRUPT ROUTINE RTI **** **** * ************************ **** 483 VECSCI : ; THIS I S THE SERIAL INTERRUPT ROUTINE RTI ;ROM VARRIABLES: MIDI_TEST_STR DB $12 , $3 , $56, $78 , $9A PR END: NOP ** * * **** ** ** ****** ** * ******************** **** ** * * ** *** ** ** * ***** ***^ * MASK OPTION REGISTER *****************************»*************************************τi ;ORG $0900 ;705P9 CHIP ;db 00 ORG $1F00 ;705P6 CHIP DB 00 ;irq=negative edge, no wdg, siop msb first ****** ****** **** * * ** ***** ******** * ****** ***** * **** * *** ** * ****** *** ** * START OF VECTOR EPROM * * ****** * ******** ** **** * ****************** * **** ** ******************* ORG $1FF8 INTJ/CTR : / FDB TIMER_SYNC FDB IRQ_PROC ;IRQ\ CAUSE THE MIDI PROCESS. FDB VECSWI FDB START OP END 484 CREAPI.DLL 485 Serial Uniport PC Software API Module creapi.dll 486 // creapi . c #defιne CREAPI DLL #ιnclude "windows. n" #ιnclude "asrapi.h" #ιnclude "asrISOO.h" #ιncluce "ttssok32.h" #ιnclude " .. \crpro\crpro . h" #ιnclude "creapi. h" #ιnclude "mmio.h" #ιnclude "notifyproc. h" #ιnclude "mess.h" #mclude "mtdefs.h" #mclude "sr.h" #mclude "tts.h" #ιnclude "uniprt.h" Sincluαe "resource. h" #ιnclude "queue. h" #defme SR MESSAGE STRING *0555F940-BD0D-lldl-B001-00C0F01D50B7" void Initialize ( ) ; void Uninitialized; void CALLBACK CrApiReadNotifyProc ( PNOTIFY_PARAMS pNotifyParams); void CALLBACK CrApiWriteNotifyProc ( PNOTIFY_PARAMS pNotifyParams) HINSTANCE hInstance=NULL; HANDLE hWaitMessageEvent; BYTE WaιtAckBuffer[MAX_MESSAGE_SIZE] ; CREAPI_NOTIFY_PROC UserReadNotifyProc = NULL; CREAPI_NOTIFY_?ROC UserWriteNotifyProc = NULL; DWORD UserData; HCUEUE hReadNotιfyQueue=NULL; HCUEUE hWrιteNotιfyCueue=NULL; HANDLE hReadNotifyThread; HANDLE hWriteNotifyThread; extern UINT sr.essage; 487 LPSTR Ips zCurrText ; DWORD dwUmtTalkFlags ; HANDLE hUnitTalkThread ; HANDLE hAsync ; HANDLE hUnitTalkDone ; DWORD dwQueueSize ; HANDLE hUmtTalkBreak ; HANDLE hQueueNotFull ; HANDLE hUmtTalkBreakDone ; extern HTTSINSTANCE hTTS Ins t ; //===================================================================== HANDLE hRecordFιle=INVALID_HANDLE_VALUE; DWORD dwUnitRecordFlags; HANDLE hUnitRecordThread; BOOL bUnιtRecord=FALSE; HANDLE hRecordAsync; DWORD dwTime; HANDLE hUnitRecordBreak; BOOL WINAPI DllMam (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) ( switch ( fdwReason) ( case DLL_PROCESS_ATTACH: if (hInstance'=NULL) return FALSE; hInstance=nιnstDLL; Initialize ( ) ; break; case DLL_PROCESS_DETACH: Uninitialize ( ) ; break; ) return TRUE; ) DWORD WINAPI ReadNotifyThread (PVOID param) ( PCRAPI_NOTIFY_PARAMS pNotifyParams; fort;;) ( CueueWaitWhileEmpty (hReadNotifyCueue, INFINITE) ; pNotιfyParams= (PCRAPI_NOTIFY_PARAMS) CueuePop (hReadNotifyCueue) ; 488 switch (pNotif ?arams->dwNotιf yTypej ( case CRPRO_READ_BUFFER_READY: pNotιfyParams->dwNotιfyType=CRAPI_3UFFER_RECEIVED; break; case CRPRO_CNTR_RECEIVED: pNotιfyParams->dwNotιfyType=CRAPI_MESSAGΞ_RECEIVED; break; 1 UserReadNotifyProc (pNotifyParams, UserData) ; GlobalFree (pNotιfyParams->pBuffer) ; GlobalFree (pNotifyParams) ; ( return 0; ) DWORD WINAPI WriteNotif yThread ( PVOID param) { PCRAPI_NOTIFY_PARAMS pNotifyParams; for ( ; ; ) ( QueueWaitWhileEmpty (hWriteNotifyQueue, INFINITE) ; pNotif yParams= ( PCRAPI_NOTIFY_PARAMS ) QueuePop (hWriteNotifyQueue ) ; switch (pNotιfyParams->dwNotιfyType) { case CRPRO_WRITE_BUFFER_BREAK: pNotifyParams ->dwNotιfyType=CRAPI_BREAK; break; case CRPRO_WRITE_BUFFER_DONE: pNotιfyParams->dwNotιfyType=CRAPI_BUFFER_SENT; break; ) UserWriteNotifyProc (pNotifyParams, UserData) ; GlobalFree (pNotifyParams) ; ) return 0; } //_____ ===== ___.. ^==- = ======= = ==== = ===== = = = == = ==== = == ================= CREAPI_STATUS crSystemOpen (DWORD dwDevicelD, CREAPI_NOTIFY_PROC ReadNotifyProc, CREAPI_NOTIFY_PROC WriteNotifyProc, DWORD dwUserData) ( DWORD status; DWORD dwThreadID; 489 status=proSystemOpe ( dwDevicelD , CrApiReadNotifyProc, CrApiWπteNoti fyProc) ; If ( status ' =STATUS_0K) return status ; status=ttsOpen ( ) ; if ( status ' =STATUS JDK) ( proSystemClose ( ) ; return status; ) if ( !srOpen() ) { proSystemClose ( ) ; ttsClosed ; return CREAPI_STATUS_ERR_SROPEN; ) if (ReadNotifyProc !=NULL) { hReadNotιfyQueue=CueueCreate ( ) ; hReadNotιfyThread=CreateThread(NULL, 0, ReadNotifyThread, 0, 0, &dwThreadID) ; UserReadNotιfyProc=ReadNotιfyProc; } if (WriteNotifyProc '=NULL) ( hWrιteNotιfyQueue=QueueCreate ( ) ; hWnteNotιfyThread=CreateThread(NULL, 0, WriteNotif Thread, 0, 0, SdwThreadlD) ; UserWriteNotifyProc=Wr teNotιfyProc; ) UserData=dwUserData ; return STATUS OK; //= CREAPI_STATUS crSystemClose ( ) ( DWORD status ; status=proSystemClose ( ) ; 490 srClose ( ) ; ttsClose ( ) ; if (UserReadNotifyProc '=NULL)( while (QueueWaitWhileEmpty (hReadNotifyQueue, 0 ) ==WAIT_0BJECT_0 ) ; CueueDestroy (hReadNotifyCueue) ; TermmateThread (hReadNotifyThread, 0) ; WaitForSmgleObject (hReadNotifyThread, INFINITE) ; CloseHandle (hReadNotifyThread) ; UserReadNotιfyProc=NULL; if (UserWriteNotifyProc'=NULL) { while (QueueWaitWhileEmpty (hWriteNotifyQueue, 0 ) ==WAIT_OBJECT_0 ) ; CueueDestroy (hWriteNotifyOueue) ; TermmateThread (hWriteNotifyThread, 0) ; WaitForSmgleObject (hWriteNotifyThread, INFINITE) ; CloseHandle (hWriteNotifyThread) ; UserWriteNotifyProc=NULL; ) return status; //= void TestAckProc(PNOTIFY_PARAMS pNotifyParams)! if (WaitForSmgleObject (hWaitMessageEvent, 0) ==WAIT_TIMEOUT) PBYTE pBuffer=(PBYTE)pNotιfyParams->pBuffer; if (WaitAckBuffer[0]==pBuffer[0] ) ( memcpy (WaitAckBuffer, pBuffer, pNotifyParams->dwBufferLength) ; SetEvent (hWaitMessageEvent) ; ) //= 491 CREAPI_STATUS crSendBuffer ( PVOID pBuffer, DWORD dwBufferSize, DWORD dwUserData) ( return proSendBuffer (pBuffer, dwBufferSize, dwUserData, 0); //= CREAPI_STATUS crSendMessage (PVOID pMessage, BYTE byMessageType, BYTE byMessageSize, PVOID pAck, BYTE bypAckSize) ( if (byMessageType&ACK_EXPECTED_MASK) ( CRPRO_STATUS status; DWORD tιme_out=BASE_ACK_TIME_OUT; tιme_out+=byMessageType&SRC_DEST_MASK?UNIT_ACK_TIMEOUT:0; WaitAckBuffe [0] =byMessageType; WaitAckBuffer [0] &=~ ( (BYTE)ACK_EXPECTED_MASK) ; WaitAckBuffe [0] | =DIRECTION_MASK; ResetEvent (hWaitMessageEvent) ; status=proSendMessage (pMessage, byMessageSize, byMessageType) ; if (status '=STATUS_OK) ( SetEvent (hWaitMessageEvent) ; return status; ) if (WaitForSmgleOb ect (hWaitMessageEvent, tιme_out)==WAITJTIMEOUT) ( SetEvent (hWaitMessageEvent) ; return CREAPI_STATUS_ERR_TIMEOUT; ) if (pAck'=NULL) memcpy(pAck, WaitAckBuffer, min (bypAckSize, WaitAckBuffer [ 1 ] +2 ) ) ; return STATUS )K; ) else return proSendMessage (pMessage, byMessageSize, byMessageType) ; //==================================================== CREAPI_STATUS crBaseDetect ( PBASE_DETECT pBaseDetect) ( 492 CRPRO_STATUS s tatus ; DWORD i ; BYTE Ack[MAX_MESSAGE_SIZE] ; for (i=0;KMAX_DEVICE_ID;i++) ( status=proSystemOpen (i, CrApiReadNotifyProc, NULL); if (status==STATUS_OK) ( if (crSendMessage (NULL, CMD_BASE_GET_VERSION, 0, Ack, sizeof (Ack) ) ==STATUS_OK) ( proSystemClose ( ) ; pBaseDetect->dwDevιceID=ι; pBaseDetect->versιon.byMajorVerNum=Ack[2] »4; pBaseDetect->versιon.byMmorVerNum=Ack [2] &0x0F; return STATUS_OK; ) proSystemClose ( ) ; ) ) return CREAPI STATUS ERR BASENOTFOUND; //= void Initialize () ( hWaitMessageEvent=CreateEvent(NULL, TRUE, TRUE, NULL); hUnitTalkDone=CreateEvent(NULL, TRUE, TRUE, NULL); hUnitTalkBreak=CreateEvent(NULL, TRUE, FALSE, NULL) ; hQueueNotFull=CreateEvent(NULL, TRUE, TRUE, NULL) ; hUnitTalkBreakDone=CreateEvent(NULL, TRUE, TRUE, NULL) ; hUnitRecordBreak=CreateEvent(NULL, TRUE, TRUE, NULL) ; srMessage=RegisterWindowMessage (SR_MESSAGE_STRING) ; ) //= void Uninitialize ( ) ( CloseHandle (hUnitTalkDone) ; CloseHandle (hWaitMessageEvent) ; CloseHandle (hQueueNotFull) ; CloseHandle (hUnitTalkBreak) ; CloseHandle (hUnitTalkBreakDone) ; 493 -OseHandle ( hUnitRecorcBreak ) // = CREAPI_STATUS erReset (DWORD dwFlags)! DWORD status; status=proTransferReset (dwFlags ) ; if (UserReadNotifyProc) while (QueueWaitWhileEmpty (hReadNotifyQueue, 0 ) ==WAIT_OBJECT_0 ) ; if (UserWriteNotifyProc) while (QueueWaitWhileEmpty (hWriteNotifyQueue, 0) ==WAIT_OBJECT_0) ; return status; ) //= CREAPI_STATUS crGetBaseVersion ( PVERSION base_versιon) ( DWORD status; BYTE Ack(MAX_MESSAGE_SIZE] ; status=crSendMessage(NULL, CMD_BASE_GET_VERSION, 0, Ack, sizeof (Ack) ) ; if (status==STATUS_OK) ( base_versιon->byMajorVerNum=Ack[2] »4; base_versιon->byMιnorVerNum=Ack[2] SOxOF; ) return status ; ) // = void UnitTalkBufferDone ( PNOTIFY_PARAMS pNotifyParams ) ! GlobalFree (pNotιfyParams->pBuf fer) ; i f (pNotιfyParams->dwUserData==l ) SetEvent ( hUmtTalkDone ) ; else ( dwQueueSize — ; if ( dwQueueSιze<UNIT_TALK_QUEUE_SIZE) SetEven ( hQueueNotFull ) ; 494 //================================================================== DWORD WINAPI UmtTalkThread (PVOID param) ( DWORD ret_value=STATUS_OK; PVOID pBuffer; PVOID pFinishMarker; DWORD waιt_result; HANDLE hWaitEvents [2] ; DWORD PCMDataSize, must_be_read, was_read; int done_status ; DWORD gen_sιze, task_no; BOOL bTTSFirstBuffer; hWaitEvents [ 0] =hUnιtTalkBreak; hWaitEvents [ 1] =hQueueNotFull ; pFιnιsnMarker=GlobalAlloc(GPTR, 1) ; *((PBYTE) (pFinishMarker) )=0x80; dwQueueSize=0; ResetEvent (hUmtTalkDone) ; SetEvent (hQueueNotFull) ; if (dwUnιtTalkFlags==UNITTALK_SRC_PCMFILE) PCMDataSιze=PCMGetDataSιze() ; else bTTSFιrstBuffer=TRUE; for ( ; ; ) { waιt_result=WaιtForMultιpleObjects (2, hWaitEvents, FALSE, INFINITE) ; if (waιt_result==WAIT_OBJECT_0) { proSendBuf fer (pFinishMarker, 1 , 1 , UNIT_TALK_BUFFER) ; SetEvent (hUmtTalkBreakDone ) ; break; ) pBuffer=GlobalAlloc ( GPTR, UNIT_TALK_BUFFER_SIZE) ; if (pBuf fer==NULL) ( ret_value=CREAPI_STATUS_ERR_MALLOC; 495 proSendBuffer (pFimsnMarker, 1, 1, UNIT TALK BUFFER) ; break; if (dwUnιtTalkFlags==UNITTALK SRC PCMFILE) must be read=mιn (PCMDataSize, UNIT TALK BUFFER SIZE) ; if (' PCMReaαFile (pBuffer, must_be_read, &was_read) ) ( GlobalFree (pBuffer) ; ret_value=CREAPI_STATUS_ERR_PCMREAD; proSendBuffer (pFinishMarker, 1, 1, UNIT TALK BUFFER) ; break; proSendBuffer (pBuffer, was_read, 0, UNIT TALK BUFFER) ; PCMDataSιze-=was_read; dwQueueSιze++; if (dwQueueSιze>=UNIT_TALK_QUEUE_SIZE) ResetEvent (hQueueNotFull) ; if (PCMDataSize==0) // Normal Done ret_value=STATUS_OK; proSendBuf fer (pFιnιshMarκer, 1, 1, UNIT TALK BUFFER) ; break; ) else if (dwUnιtTalkFlags==UNITTALK_SRC_TTS) ( if (bTTSFirstBuffer) ( done_status=TtsGenPcmBuf (hTTSInst, IpszCurrText, strlen(lpszCurrText) , M_OUT_8 LINEAR, M_ANSI_TEXT, UNIT_TALK_BUFFER_SIZE, pBuffer, igen_sιze, άtask_no) ; 496 bTTSFιrstBuffer=FALSE; ) eise done Ξtatus=TtsGenNextPcmBuf (hTTSInst, UNIT TALK_BUFFER_SIZE, pBuffer, M_OUT_8LINEAR, &gen_sιze, &task_no) ; if (done_status==M_PCMGENDONE II done_status==E_NOINPUTTEXT) ( GlobalFree (pBuffer) ; // Normal Done ret_value=STATUS_OK; proSendBuffer (pFinishMarker, 1, 1, UNIT_TALK_BUFFER) ; break; dwQueueSιze++; if (dwOueueSιze>=UNIT_TALK_CUEUE_SIZE) ResetEvent (hQueueNotFull) ; proSendBuffer (pBuffer, gen_sιze, 0, UNIT TALK BUFFER) ; } if (dwUnιtTalkFlags==UNITTALK_SRC_PCMFILE ) PCMCloseFile O ; else i f ( dwUnιtTalkFlags==UNITTALK_SRC_TTS ) ( TtsStopSpeech (hTTSInst, 0); GlobalFree (IpszCurrText) ; WaitForSmgleObject (hUnitTalkDone, INFINITE) if (hAsync '= NULL) ( SetEvent (hAsync) ; CloseHandle (hUmtTalkThread) ; hUnιtTalkThread=NULL; ) return ret_value ; ) 497 //= CREAPI_ΞTATUS crUnitTalk (WORD wUnitNumber, DWORD dwFlags, LPCTSTR pszSource, HANDLE hOpAsync) ( DWORD dwThreadID; DWORD status; if (hUnιtTalkThread!=NULL && pszSource == NULL)! ResetEvent (hUmtTalkBreakDone) ; SetEvent (hUnitTalkBreak) ; WaitForSmgleObject (hUmtTalkBreakDone, INFINITE) ; proTransferReset (BASEIO_WRITE_CUEUE) ; WaitForSmgleObject (hUnitTalkThread, INFINITE) ; CloseHandle (hUmtTalkThread) ; hUnitTalkThread=NULL; return STATUS OK; if (dwFlags>OS&dwFlags<=UNITTALK_SRC_MAX_VALUE) dwUnitTalkFlags=dwFlags ; else return CREAPI_ΞTATUS_ERR_FLAG_NOTSUPP ; if (dwFlags==UNITTALK_SRC_PCMFILE) ( if ( ! PCMInitFile (pszSource) ) return CREAPI_STATUS_ERR_PCMINIT; } else if (dwFlags==UNITTALK_SRC_TTS) ( lpszCurrText=(LPSTR)GlobalAlloc (GPTR, strlen (pszSource) +1) ; if ( (IpszCurrText) return CREAPI_STATUS_ERR_MALLOC; strcpy (IpszCurrText, pszSource) ; } status=crSendMessage(NULL, CMD_BASE_START_DA, 0, NULL, 0); if (status !=STATUS_OK) ( if (dwFlags==UNITTALK_SRC_PCMFILE) PCMCloseFile O ; else if (dwFlags==UNITTALK_SRC_TTS ) GlobalFree ( Ips zCurrText ) ; return s tatus ; 498 hAs yn c=r.Op As yn c ; ResetEvent ( hUmtTalkBreak ) ; if ( hOpAsync ! =NULL) ResetEvent (hOpAsync) ; hUnιtTalkThread=CreateThread(NULL, 0, UnitTalkThread, hOpAsync, 0, SdwThreadlD) ; if (hAsync==NULL) ( WaitForSmgleObj ect (hUnitTalkThread, INFINITE! ; CloseHandle (hUnitTalkThread) ; hUnιtTalkThread=NULL; ) return STATUS OK; //= void UmtRecordBufferReady(PNOTIFY_PARAMS pNotifyParams) DWORD written; WriteFile (hRecordFile, pNotifyParams->pBuffer, pNotιfyParams->dwBufferLength, &wrιtten, NULL) ; ) //= DWORD WINAPI U itRecordThread (PVOID param) ( DWORD waιt_result; DWORD data_sιze; DWORD written; bUnitRecord=TRUE; crSendMessage (NULL, CMD_BASE_START_AD, 0, NULL, 0); waιt_result=WaιtForSmgleOb j ect (hUnitRecordBreak, dwTime) ; crSendMessage (NULL, CMD_BASE_BREAK, 0, NULL, 0); erReset (3ASEIO_READ_CUEUE) ; bUnιtRecord=FALSE; if (dwUnιtRecordFlags==UNITRECORD_DEST_PCMFILE) ( data_sιze=SetFιlePoιnter (hRecordFile, 0, NULL, FILE CURRENT) -WAVE HEADER LENGTH; 499 SetFilePo ter (hRecordFile, WAVE_DATA_LEN_POS , NULL, FILE_BEGIN) ; WriteFile (hRecordFile, &data_sιze, sizeof (data_sιze) , &written, NULL) ; ) CloseHandle (hRecordFile) ; hRecordFιle=INVALID_HANDLE_VALUE; if (hRecordAsync'=NULL) ( SetEvent (hRecordAsync) ; CloseHandle (hUnitRecordThread) ; ) return 0; } //= CREAPI_STATUΞ crUnitRecord (WORD wUnitNumber, DWORD dwTιme_ms, DWORD dwFlags, LPCTSTR IpszDest, HANDLE hOpAsync) ( HRSRC hResInfo; HGLOBAL hResGlobal; DWORD written; DWORD dwThreadID; if (dwFlags>0&&dwFlags<=UNITRECORD_MAX_VALUE) dwUnιtRecordFlags=dwFlags ; else return CREAPI_STATUS_ERR_FLAG_NOTSUPP ; if (hRecordFile ' =INVALID_HANDLE_VALUE && lpszDest==NULL) ( SetEvent (hUnitRecordBreak) ; WaitForSmgleObject (hUnitRecordThread, INFINITE) ; return STATUSJDK; ) hRecordFile = CreateFile (IpszDest, GENERICJWRITE, 0, NULL, CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL, NULL); if (hRecordFile == INVALID_HANDLE_VALUE) return CREAPI_STATUS_ERR_FILE_CREATE; if (dwFlags == UNITRECORD DEST PCMFILE)! 500 hResInfo=FmdResource (hlnstance, "IDR_8BIT8KHZ_HEADER", "WAVEHEADER" ) ; hResGlobal=LoadResource (hlnstance, hResInfo) ; WriteFile (hRecordFile, hResGlobal, WAVE_HEADER_LENGTH, Swritten, NULL) ; if (written ' =WAVE_HEADER_LENGTH ) ( CloseHandle (hRecordFile) ; hRecordFιle=INVALID_HANDLE_VALUE; return CREAPI_STATUS_ERR_FILE_WRITE; > ) hRe co rdAs ync=hOpAs yn c ; dwTιme=dwTιme_ms ; ResetEvent (hUnitRecordBreak) ; if (hOpAsync'=NULL) ResetEvent (hOpAsync) ; hUnιtRecordThread=CreateThread(NULL, 0, UnitRecordThread, hOpAsync, , SdwThreadlD) ; if (hOpAsync==NULL) ( WaitForSmgleObject (hUnitRecordThread, INFINITE) ; CloseHandle (hUnitRecordThread) ; ) return STATUS OK; 501 #ifndef INTDEFS_H #define INTDEFS_H #define CRAPI INTERNAL USE #define EVENT_SENSOR #define EVENT SR #define WE_SR_RESULT #define WE SENSOR RESULT #define STRING MAX LENGTH 80 #define MAX MESSAGE SIZE 255 typedef struct SR_BUFFER ( PVOID pBuffer; DWORD dwBufferSize; } SR BUFFER, *PSR BUFFER; ttdefine CMD_WAITFOREVENT #define CMD UNITRECORD #define WAVE_HEADER_LENGTH 44 #define WAVE DATA LEN POS 40 #define MAX DEVICE ID 10 #define UNIT_TALK_BUFFER_SIZE 2048 #define UNIT TALK CUEUE SIZE 10 #define UNIT TALK BUFFER 0x00000100 #endif // INTDEFS H 502 #include <wιndows.h> #include <mmsystem.h> #include "mmio . h" DWORD pcm_data_size; HMMIO hmmio; BOOL PCMInitFile (LPCTSTR pszFileName) ( MMCKINFO mmckinfoParent; MMCKINFO mmckinfoSubchunk; DWORD dwFmtSize; HGLOBAL hFormat; WAVEFORMATEX *pFormat; hmmio = mmioOpen ( (LPSTR) pszFileName, NULL, MMIO_READ |MMIO_ALLOCBUF) ; if ( ! hmmio) return FALSE; mmckinfoParent. fccType = mmioFOURCC( *W* , *A', *V', 'E'); if (mmioDescendthmmio, immckinfoParent, NULL, MMIO_FINDRIFF) ) ( mmioClose (hmmio, 0) ; return FALSE; ) mmckinfoSubchunk. ckid = mmioFOURCC( 'f * , 'm', 't', ' ' ) ; if (mmioDescend (hmmio, SmmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK) ) ( mmioClose (hmmio, 0) ; return FALSE; ) dwFmtSize = mmckinfoSubchunk. cksize; hFormat = GlobalAlloc (LMEM_MOVEABLE, LOWORD (dwFmtSize) ) ; if ( ! hFormat) ( mmioClose (hmmio, 0) ; return FALSE; ) pFormat = (WAVEFORMATEX*) GlobalLock (hFormat) ; if ( ϊpFormat) { GlobalFree (hFormat) ; mmioClose (hmmio, 0) ; return FALSE; ) if (mmioRead (hmmio, (HPSTR) pFormat, dwFmtSize) != (LONG) dwFmtSize) ( GlobalUnlock (hFormat) ; 503 Glooairree 'nFormat) ; mmioClose (hmmio, 0); return FALSE; if (pFormat->wFormatTag ' = WAVE_FORMAT_PCM) { GlobalUnlock (hFormat) ; GlobalFree (hFormat) ; mmioClose (hmmio, 0); return FALSE; ) GlobalUnlock (hFormat) ; GlobalFree (hFormat) ; mmioAscend (hmmio, άmmckinfoSubchunk, 0) ; mmckinfoSubchunk. ckid = mmioFOURCC ( 'd' , 'a', 't', 'a'); if (mmioDescend (hmmio, immckinfoSubchunk, immckinfoParent, MMIO_FINDCHUNK) ) ( mmioClose (hmmio, 0); return FALSE; ) pcm_data_size=mmckιnfoSubchunk.cksize; if (pcm_data_size==0L) ( mmioClose (hmmio, 0) ; return FALSE; return TRUE; ) BOOL PCMReadFile (PVOID pBuffer, DWORD bytes_to_read, PDWORD was_read ) ( LONG actually_read; actually_read=mmιoRead (hmmio, pBuffer, bytes_to_read) ; if (actually_read==-l) return FALSE; *was_read=actually_read; ) DWORD PCMGetDataSizeO ( return pcm_data_sιze; ) 504 BOOL PCMCloseFilei) ( mmioClose (hmmio, 0) return TRUE; 505 #include "asrapi.h" #include "asrl500.h" #include "notifyproc.h" #include ".. \crpro\crpro.h" #include "creapi.h" #include "mess.h" #include "intdefs.h" #include "uniprt.h" #include "queue.h" extern CREAPI_NOTIFY_PROC UserReadNotif Proc; extern CREAPI_NOTIFY_PROC UserWriteNotifyProc; void TestAckProc(PNOTIFY_PARAMS pNotifyParams); extern HQUEUE hReadNotifyQueue; extern HQUEUE hWriteNotifyQueue; void DoReadNotify(PNOTIFY_PARAMS pNotifyParams); void DoWriteNotify(PNOTIFY_PARAMS pNotifyParams); void UnitTalkBufferDone (PNOTIFY_PARAMS pNotifyParams); extern BOOL bUnitRecord; void UnitRecordBufferReady (PNOTIFY_PARAMS pNotifyParams); extern BOOL bWaitForEvent; void WaitForEventBufferReady (PNOTIFY_PARAMS pNotifyParams); extern HANDLE hEventEvent ; //==================== ========================== ========== void CALLBACK CrApiReadNotifyProc ( PNOTIFY_PARAMS pNotifyParams)! BOOL CallUserCallback=TRUE; switch (pNotifyParams->dwNotifyType) ( case CRPRO_CNTR_RECEIVED: TestAckProc (pNotifyParams) ; break; case CRPRO_READ_BUFFER_READY: if (bUnitRecord) { UnitRecordBufferReady (pNotifyParams ) ; CallUserCallback=FALSE; ) 506 i f (WaitForSmgleObj ect ( hEventEvent, 0 ) ==WAIT_TIMEOUT) ( WaitForEventBufferReady (pNoti fyParams ) ; CallUserCallback= FALSE; ) break ; ) if (UserReadNotιfyProc'=NULL && CallUserCallback) DoReadNotify (pNotifyParams) ; //================================================================ void CALLBACK CrApiWriteNotifyProc (PNOTIFY_PARAMS pNotifyParams)! if (pNotιfyParams->dwFlags==UNIT_TALK_BUFFER) ( UnitTalkBufferDone (pNotifyParams) ; return; } switch (pNotifyParams->dwNotιfyType) ( case CRPRO_WRITE_BUFFER_DONE: break; case CRPRO_WRITE_BUFFER_BREAK: break; if (UserWriteNotifyProc ' =NULL) DoWriteNotify (pNotifyParams) ; //= void DoReadNotify (PNOTIFY_PARAMS pNotifyParams) { PNOTIFY_PARAMS pPushParams; pPushParams=(PNOTIFY_PARAMS)GlobalAlloc(GPTR, sizeof (NOTIFY_PARAMS) ) ; memcpy (pPushParams, pNotifyParams, sizeof (NOTIFY_PARAMS) ) ; pPushParams->pBuffer=GlobalAlloc (GPTR, pNotifyParams->dwBufferLength) ; memcpy (pPushParams->pBuffer, pNotιfyParams->pBuffer, pNotifyParams->dwBufferLength) ; QueuePush (hReadNotifyCueue, pPushParams) ; 507 //================================================================== void DoWriteNotify (PNOTIFY_PARAMS pNotifyParams ) ( PNOTIFY_PARAMS pPushParams; pPushParams=(PNOTIFY_PARAMS) GlobalAlloc (GPTR, sizeof (NOTIFY_PARAMS) ) ; memcpy (pPushParams, pNotifyParams, sizeof (NOTIFY_PARAMS) ) ; CueuePush (hWriteNotifyCueue, pPushParams) ; ) //================================================================== 508 #lfndef OTIFYPROC_H #defme NOTIFYPRCC_H #mclude <wιnαows.h> #ιnclude <mmsystem.h> typedef struct LOCAL_NOTIFY_PARAMS ( BOOL last_buffer; HANDLE hAsyncEvent; HANDLE hSyncEvent; HANDLE hThread; PBOOL pbUnitTalkProcess; ) LOCAL_NOTIFY_PARAMS, *PLOCAL_NOTIFY_PARAMS; void SetWaitMessage (PVOID pWaitMessage, BYTE byWaitMessageSize, BYTE byWaitMessageType) ; #endιf // NOTIFYPROC H 509 #def e CREAPI DLL #mclude <wιndows.h> #ιnclude <mmsystem.h> #ιnclude "resource. h" #mclude "asrapi.h" #ιnclude "asrl500.h" #mclude "strsupp.h" #mclude "creapi.h" #mclude "mess.h" #mclude "intdefs.h" #include "uniprt.h" #include "sr.h" #ιnclude ".. \crpro\crpro.h' #defme CTX_CLOSE #defιne CTX_WRITE_MODE 2 #define CTX_READ_MODE 3 extern HINSTANCE hlnstance; HDB hDb; HASR hAsr; HCTX hCtx; WORD wCtxMode=CTX_CLOSE; char active_context [80] ; DWORD userThreadID; HANDLE hWEThread; DWORD dwWEResult; WORD ConfLevelFilter=0; NOTIFY_RESULT_SIMPLE* last_sr_result=NULL; DWORD CALLBACK NotifyProc (HNOTIFY hNotify, NOTIFY_TYPE NotifyType, HASR hAsr, DWORD UserData) ; void CALLBACK ErrorProc (HASR hAsr, WORD BlockID, ASRERROR ErrorlD); void CALLBACK StateChangeProc (HASR hAsr, ASRSTATE AsrState, ASRMODE AsrMode) ; DWORD SetActiveContext (char* context, WORD mode) ; 510 CREAPI STATUS crsrSelectContext (LPSTR context) DWORD SRThreadID; HANDLE hSRThread; HANDLE hEventEvent; UINT srMessage; BOOL srOpen( ) ( ASRERROR status; char database [80] ; if ( ILoadStrmg (hlnstance, IDS_DATABASE, database, sizeof (database) ) ) return FALSE; hDb=asrDbOpen (database) ; if (hDb<ASRERR_MAXERR) return FALSE; hAsr=asrRecOpenEx(hDb, "Win32", NULL, ErrorProc, StateChangeProc, NotifyProc, 0) ; if (hAsr<ASRERR_MAXERR) { asrDbClose (hDb) ; return FALSE; status=asrRecSetMode(hAsr, ASRMODE_CONTINUOUS) ; if (status '=ASRERR_OK) ( asrRecClose (hAsr) ; asrDbClose (hDb) ; return FALSE; 51 hEvent£vent=CreateEven ( NULL, TRUE, TRUE, NULL ) return TRUE; //= DWORD srStart () ( DWORD status; WAVEFORMAT wf=(WAVE_FORMAT_PCM, 1, 8000, 8000, 1); if (wCtxMode==CTX_CLOSE) return CREAPI_STATUS_ERR_CNTX_INACTIVE; status=asrRecAcqOpen (hAsr, £wf) ; if (status !=ASRERR_OK) return status+SR_MIN_ERR_VALUE; status=asrRecStart (hAsr, NULL, NULL); if (status !=ASRERR_OK) ( asrRecAcqClose (hAsr) ; return status+SR_MIN_ERR_VALUE; ) return STATUS OK; //= DWORD srStopO ( DWORD status; status=asrRecBreak (hAsr ) ; if (status !=ASRERR_OK) return status+SR_MIN_ERR_VALUE; status=asrRecAcqClose ( hAs r ) ; if ( Status ! =ASRERR_OK) return status+SR_MIN_ERR_VALUE; return STATUS_OK; ) //= BOOL srClosef) ( SetActiveContext (active_context, CTX_CLOSE) ; asrRecClose (hAsr) ; asrDbClose (hDb) ; 512 i f ( las t_s r_resuit ) GlobalFree ( las t_s r_result ) ; CloseHandle ( hEventEvent ) ; return TRUE; // = CREAPI_STATUS crSrCreateContext (LPSTR context)! ASRERROR asr_status; char user [80] ; char syntax [80] ; char language [ 80] ; char upper_context [80] ; if (*context==0) return CREAPI_STATUS_ERR_CONTEXTNAME; if ( ILoadStrmg (hlnstance, IDS_USER, user, sizeof (user) ) ) return CREAPI_STATUS_ERR_LOADSTRING; if ( ILoadStrmg (hlnstance, IDS_LANGUAGE, language, sizeof (language) ) ) return CREAPI_STATUS_ERR_LOADSTRING; if ( ILoadStrmg (hlnstance, IDS_SYNTAX, syntax, sizeof (syntax) ) ) return CREAPI_STATUS_ERR_LOADSTRING ; strcpy (upper_context, context); str_to_upper (upper_context) ; asr_status=asrCtxCreate(hDb, user, language, syntax, upper_context) ; return asr status==ASRERR OK7STATUΞ OK: asr status+SR MIN ERR VALUE; //= CREAPI_STATUS crSrDeleteContext (LPSTR context)) ASRERROR asr_status; char user [80] ; char upper_context [80] ; strcp (upper_context, context); str_to_upper (upper_context) ; if ( 'LoadStπng (hlnstance, IDS_USER, user, sizeof ( user ) ) return CREAPI_STATUS_ERR_LOADSTRING; 513 as r_s tatus=as rCtxDelete ( nDb , user, upper_context ) ; return asr_status==ASRERRjDK "> STATUS DK : as r_s tatus +SR_MIN_ERRJ/ALUE; ) //================================================================== CREAPI_STATUS crSrGetContexts (LPSTR buffer, PDWORD dwBufferSize) { ASRERROR asr_status; DWORD dwSize; DWORD 1; char user [80] ; if { ILoadStrmg (hlnstance, IDSJJSER, user, sizeof (user) ) ) return CREAPI_STATUS_ERR_LOADSTRING; asr_status=asrUsrGetInfo(hDb, user, ASRUSRINFO_CONTEXTS, NULL, άdwSize) ; if (asr_status '=ASRERR_OK) return asr_status+SR_MIN_ERR_VALUE; if (buffer==NULL) { *dwBufferSιze=dwSιze; return STATUSJDK; ) if (*dwBufferSιze<dwSιze) return CREAPI_STATUS_ERR_BUFFER_TOO_SMALL; asr_status=asrUsrGetInfo(hDb, user, ASRUSRINFO_CONTEXTS, buffer, dwBufferSize) ; if (asr_status '=ASRERR_OK) return asr_status+SR_MIN_ERR_VALUE; for (ι=0;KdwSιze-l;ι++) ( if (buffer[ι]==0) ( if (buffer[i+l]==0) break; buffer[ι]=', *; ) ) return STATUS OK; //================================================================== DWORD SetActiveContext (char* context, WORD mode){ DWORD status=STATUS_OK; 514 char us e r [ 80 ] ; i f ( s t rcmp ( context , actιve_context ) ' =0 | | ode ' =wCtxMode ) ( i f ( wCtxMode ' =CTX_CLOSE ) ( i f (wCtxMode==CTX_READ_MODE ) ( status=asrRecCtxActιvateEx (hAsr, (ASRACTIVATE*)NULL, 0, (HLIB)NULL); if (status '=ASRERR_OK) return status+SR_MIN_ERR_VALUE; ) status=asrCtxClose (hCtx, TRUE); if (status '=ASRERR_OK) return status+SR_MIN_ERR_VALUE; } if (mode ' =CTX_CLOSE) ( if ( 'LoadStrmg (hlnstance, IDS_USER, user, sizeof (user) ) ) return CREAPI_STATUS_ERR_LOADSTRING; if (mode==CTX_READ_MODE) hCtx=asrCtxOpen (hDb, user, context, ASRCTXATTRIB READ) ; else hCtx=asrCtxOpen (hDb, user, context, ASRCTXATTRIB WRITE) ; if (hCtx>ASRERR_MAXERR) ( if (mode==CTX_READ_MODE) ( ASRACTIVATE AsrActivate; AsrActιvate.hCtx=hCtx; *AsrActιvate.szSymboi=' \0 ' ; status=asrRecCtxActιvateEx (hAsr, &AsrActιvate, 1, (HLIB)NULL); if (status 1 =ASRERR_OK) ( asrCtxClose(hCtx, FALSE); return status+SR MIN ERR VALUE; strcpy (actιve_context, context) wCtxMode=mode ; return status; 515 //================================================================== CREAPI_STATUS crsrSelectContext (LPSTR context)! char user [80] ; DWORD dwSize; char* pBuffer; char* pUpperContext; DWORD status; if (context==NULL) return SetActiveContext (active_context, CTX_CLOSE) ; if ( I LoadString (hlnstance, IDS_USER, user, sizeof (user) ) ) return CREAPI_STATUS_ERR_LOADSTRING; status=asrUsrGetInfo (hDb, user, ASRUSRINFO_CONTEXTS, NULL, &dwSize) ; if (status !=ASRERR_OK) return status+SR_MIN_ERR_VALUE; pBuffer=(char*) GlobalAlloc (GPTR, dwSize) ; if ( IpBuffer) return CREAPI_STATUS_ERR_MALLOC; status=asrUsrGetInfo(hDb, user, ASRUSRINFOJDONTEXTS, pBuffer, sdwSize) ; if (status I =ASRERR_OK) ( GlobalFree (pBuffer) ; return status+SR_MIN_ERR_VALUE; ) pUpperContext=GlobalAlloc(GPTR, strlen (context ) +1 ) ; if ( IpUpperContext) ( GlobalFree (pBuffer) ; return CREAPI_STATUS_ERR_MALLOC; ) strcpy (pUpperContext, context); str_to_upper (pUpperContext) ; if ( I szszz (pUpperContext, pBuffer) ) ( GlobalFree (pBuffer) ; GlobalFree (pUpperContext) ; return C REAPI_STATUS_ERR_CNTX_NOT_FOUND; ) GlobalFree (pBuffer) ; status=SetActιveContext (pUpperContext, CTX_READ_MODE) ; 516 GlobalFree ( pUpperContext ) ; return s tatus ; //================================================================== CREAPI_STATUS crSrGetWords (LPSTR buffer, PDWORD pdwBufferSize) ( ASRERROR status; DWORD dwSize, 1; if (wCtxMode==CTX_CLOSE) return CREAPI_STATUS_ERR_CNTX_INACTIVE; status=asrCtxGetWords (hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", NULL, SdwSize) ; if (status '=ASRERR_OK) return status+SR_MIN_ERR_VALUE; if (buffer==NULL) ( *pdwBufferSιze=dwSize; return STATUSJDK; } if (*pdwBufferSιze<dwSize) return CREAPI_STATUS_ERR_BUFFER_TOO_SMALL; status=asrCtxGetWords (hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", buffer, SdwSize) ; if (status '=ASRERR_OK) return status+SR_MIN_ERR_VALUE; for (ι=0;KdwSιze-l;ι++) ( if (buffer(ι]==0) ( if (buffer[i+l]==0) break; buffer[ι]=', '; return STATUS OK; //= CREAPI_STATUS rSrAddWords (LPSTR lιst_of_words ) ( 517 cnar seps [ ] =", \n" ; cnar" token; char* pSource; char* pWord; char* pWordsInDB; ASRERROR status; DWORD dwSize; if (wCtxMode==CTX_CLOSE) return CREAPI_STATUS_ERR_CNTX_INACTIVE ; status=asrCtxGetWord≤ (hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", NULL, idwSize) ; if (status I =ASRERR_OK) return status+SR_MIN_ERR_VALUE; pWordsInDB=GlobalAlloc(GPTR, dwSize) ; if ( IpWordsInDB) return CREAPI_STATUS_ERR_MALLOC; status=asrCtxGetWords(hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", pWordsInDB, SdwSize) ; if (status I =ASRERR_OK) ( GlobalFree (pWordsInDB) ; return status+SR_MIN_ERR_VALUE; ) pSource=GlobalAlloc(GPTR, strlen (lιst_of_words ) +1) ; if ( 'pSource) ( GlobalFree (pWordsInDB) ; return CREAPI_STATUS_ERR_MALLOC; ) strcpy (pSource, lιst_of_words ) ; token=strtok (pSource, seps); while (token I =NULL) ( pWord=GlobalAlloc(GPTR, strlen (token) +1 ) ; if ( IpWord) ( GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; return CREAPI_STATUS_ERR_MALLOC; ) strcp (pWord, token); pWord=str_alltrιm(pWord) ; str_to_upper (pWord) ; if ( 'szszzlpWord, pWordsInDB) ) ( 518 status=SetActiveContext (active_context, CTX WRITE MODE) if (status !=STATUS_OK) ( GlobalFree (pWord) ; GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; SetActiveContext (active context, CTX READ MODE) ; return status; 1 status=asrCtxAddWord(hCtx, (HDICT)NULL, "Word", pWord) ; if (status I =ASRERR_OK) { GlobalFree (pWord) ; GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; SetActiveContext (active context, CTX READ MODE) ; return status+SR MIN ERR VALUE; 1 ) GlobalFree (pWord) ; token=strtok (NULL, seps); ) GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; status=SetActiveContext (active_context, CTX_READ_MODE) ; return status; CREAPI_STATUS crSrRemoveWords (LPSTR list_of_words ) ( char seps []=", \n"; char* token; char* pSource; char* pWord; char* pWordsInDB; ASRERROR status; DWORD dwSize; status=asrCtxGetWords (hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", NULL, SdwSize) ; 519 if (status !=ASRERR_0K) return status+SR_MIN_ERR_VALUE; pWordsInDB=GlobalAlloc(GPTR, dwSize) ; if ( IpWordsInDB) return CREAPI_STATUS_ERR_MALLOC; status=asrCtxGetWords (hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", pWordsInDB, SdwSize) ; if (status !=ASRERR_OK) ( GlobalFree (pWordsInDB) ; return status+SR_MIN_ERR_VALUE; ) pSource=GlobalAlloc(GPTR, strlen (list_of_words ) +1) ; if ( IpSource) ( GlobalFree (pWordsInDB) ; return CREAPI_STATUS_ERR_MALLOC; ) strcpy (pSource, lιst_of_words) ; token=strtok (pSource, seps); while (token I =NULL) ( pWord=GlobalAlloc(GPTR, strlen (token) +1) ; if ( IpWord) ( GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; return CREAPI_STATUS_ERR_MALLOC; ) strcpy (pWord, token); pWord=str_alltπm(pWord) ; str_to_upper (pWord) ; if (szszz (pWord, pWordsInDB))! status=SetActiveContext (active context, CTX WRITE MODE) ; if (status I =STATUS_OK) { GlobalFree (pWord) ; GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; SetActiveContext (actιve_context, CTX READ MODE) ; return status; ) status=asrCtxDeleteWord(hCtx, "Word", pWord) ; if (status >=ASRERR_OK) { GlobalFree (pWord) ; 520 GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; SetActiveContext (active_con ext, CTX READ MODE) ; return status+SR MIN ERR VALUE; ) GlobalFree (pWord) ; token=strtok (NULL, seps); GlobalFree (pSource) ; GlobalFree (pWordsInDB) ; status=SetActiveContext (active_context, CTX_READ_MODE) ; return status; //= DWORD CALLBACK NotifyProc (HNOTIFY hNotify, NOTIFYJTYPE NotifyType, HASR hAsr, DWORD UserData) ( ASRERROR err; NOTIFY_RESULT_N nN; NOTIFY_FORMAT_SIMPLE nFormat; DWORD size=sizeof (NOTIFY_RESULT_N) ; switch (NotifyType.wNotifyType) ( case NOTIFYJTYPEJRESULT: asrNotifyCuery (hNotify, NRESULT_N, NULL, 0, &nN, &size) ; nFormat. wN=0; nFormat. wActions=FORMAT_SIMPLE_ALL; nFormat . bNoRej ect=FALSE; err=asrNotifyCuery (hNotify, NRESULT_SIMPLE, SnFormat, sizeof (NOTIFY_FORMAT_SIMPLE) , NULL, Ssize) ; if (last_sr_result) GlobalFree (last_sr_result ) ; last sr result= (NOTIFY RESULT SIMPLE* ) GlobalAlloc (GPTR, size) ; 521 if ( !last_sr_result) ( asrNotifyRelease (hNotify) ; return ASRERRJDK; ) err=asrNotifyCuery (hNotify, NRESULT_SIMPLE, SnFormat, sizeof (NOTIFY FORMAT SIMPLE), last_sr_result, .size) ; if (last_sr_result->wConfidence>=ConfLevelFilter) dwWEResult=WE_SR_RESULT; SetEvent (hEventEvent) ; ) } asrNotifyRelease (hNotify) ; return ASRERR OK; //= void CALLBACK ErrorProc (HASR hAsr, WORD BlockID, ASRERROR ErrorlD)! ) //= void CALLBACK StateChangeProc (HASR hAsr, ASRSTATE AsrState, ASRMODE AsrMode) { //= CREAPI_STATUS crSrGetResult (LPSTR pBuffer, PDWORD pdwBufferSize) ( if (last_sr_result==NULL) return CREAPI_STATUS_ERR_RESULT_NOT_EXIST; if (pBuffer==NULL) { *pdwBufferSize=strlen (last_sr_result->szResult) +1; return STATUSJDK; ) if ( (*pdwBufferSize) < (strlen (last_sr_result->szResult) +1) ) return CREAPI_STATUS_ERR_BUFFER_TOO_SMALL; 522 s rcpy ; pBuffer, ^ as t_s r_result->s zResul t return STATUS OK; // = CREAPI_STATUS crSrGetConfLevel ( PWORD pwConfLevel ) ( if (last_sr_result==NULL) re t urn CREAPI_ S TATUS_ERR_RESULT_NOT_EXIST; *pwConfLevel=last sr result->wConfιdence; II-- CREAPI_STATUS crSrSetConfLevelFilter (WORD wConfLevelFilter) ! ConfLevelFilter=wConf Level Filter ; return STATUS JDK; ) I/-----, ========================================================== CREAPI_STATUS crSrGetParam(WORD wParamType, PWORD pwValue ) { ASRERROR status; DWORD dwSize; dwSιze=sιzeof (WORD) ; status=asrRecGetParam(hAsr, wParamType, pwValue, SdwSize ) ; if (status ι=ASRERR_OK) return status+SR_MIN_ERR_VALUE; return STATUSJDK; ) //================================================================== CREAPI_STATUS crSrSetParam (WORD wParamType, WORD wNewValue ) ! ASRERROR status; DWORD dwSize; dwSize=sιzeof (WORD) ; status=asrRecSetParam(hAsr, wParamType, iwNewValue, dwSize ) ; if (status ι =ASRERR_OK) return status+SRJIN_ERR_VALUE; return STATUS_OK; ) 523 //================================================================== void WaitForEventBufferReady (PNOTIFY_PARAMS pNotifyParams ) { ASRERROR status; status=asrRecAcqWaveBuffer (hAsr, pNotifyParams->pBuffer, pNotifyParams->dwBufferLength) ; if (status '=0) MessageBox(0, "asrRecAcqWaveBuffer" , "Error", MB_OK) ; } //================================================================== DWORD WINAPI WEThread ( PVOID param) ( UINT tιme__to_waιt= (UINT) param; DWORD ret_value; if (WaitForSmgleObj ect (hEventEvent , tιme_to_waιt ) ==WAIT_TIMEOUT) ret_value=WE_TIMEOUT ; else ret_value=dwWEResult ; PostThreadMessage ( userThreadID, srMessage, ret_value, 0 ) ; return 0 ; ) //= CREAPI_STATUS crWaitForEvent (WORD wUnitNumber, LPSTR pszWordMap, DWORD dwFlags, DWORD time ns, PWORD pwResult) ( char* pMap; ASRERROR status; char* pWordsInDB; DWORD dwSize; char seps [] =", \n"; char* token; char* pszWord; char* pActiveWordsBuffer; char* curr_actbuf_ptr; char* p; char* pszRetVal; DWORD dwWaitRetValue; DWORD crapι_status; MSG Msg; DWORD dwThreadID; if (wCtxMode==CTX_CLOSE) 524 return CREAPI_STATUS_ERR_CNTX_INACTIVE; dwWEResult=0; status=asrCtxGetWords (hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", NULL, SdwSize) ; if (status '=ASRERR_OK) return status+SR_MIN_ERR_VALUE; pWordsInDB=malloc(dwSιze) ; if ( IpWordsInDB) return CREAPI_STATUS_ERR_MALLOC; status=asrCtxGetWords (hCtx, ASRCTXGETWORDS_ALLWORDS, "Word", pWordsInDB, idwSize) ; if (status I =ASRERR_0K) ( free (pWordsInDB) ; return status+SR MIN ERR VALUE; pMap=GlobalAlloc(GPTR, strlen (pszWordMap) +1) if (IpMap) ( free (pWordsInDB) ; return CREAPI_STATUS_ERR_MALLOC; ) strcpy(pMap, pszWordMap); pActiveWordsBuffer=malloc (strlen (pMap) +1) ; if ( IpActiveWordsBuffer) ( GlobalFree (pMap) ; free (pWordsInDB) ; return CREAPI STATUS ERR MALLOC; curr_actbuf_ptr=pActιveWordsBuffer; token=strtok (pMap, seps); while (token I =NULL) ( pszWord=GlobalAlloc (GPTR, strlen (token) +1) ; if ( IpszWord) ( free (pActiveWordsBuffer) ; GlobalFree (pMap) ; free (pWordsInDB) ; return CREAPI_STATUS_ERR_MALLOC; ) 525 strcpy (pszWord, to en) ; pszWord=str_alltrim (pszWord) ; str_to_upper (pszWorα) ; p=strcnr (pszWord, '/'); f ( 'p) ( free (pActiveWordsBuffer) ; GlobalFree (pszWord) ; GlobalFree (pMap) ; free (pWordsInDB) ; return CREAPI_STATUS_ERR_MAP_FORMAT; ) *p=0; pszWord=str_alltrιm(pszWord) ; if (szszz (pszWord, pWordsInDB) ) ( strcpy (curr_actbuf_ptr, pszWord) ; curr_actbuf_ptr+=( strlen (pszWord) +1) ; ) else ( free (pActiveWordsBuffer) ; GlobalFree (pszWord) ; GlobalFree (pMap) ; free (pWordsInDB) ; return CREAPI_STATUS_ERR_WORDNOTEXIST; ) GlobalFree (pszWord) ; token=strtok(NULL, seps); *curr_actbuf_ptr=' \0 ' ; status=asrRecSetActιveWords (hAs r, hCtx, ASRREC_DISACTIVATION, "Word" , pWordsInDB ) ; if ( status I =ASRERR_0K) ( free (pActiveWordsBuffer) ; GlobalFree (pMap) ; free (pWordsInDB) ; return status+SRJMINJERR_VALUE; ) free (pWordsInDB) ; status=asrRecSetActιveWords (hAsr, hCtx, ASRREC_ABSOLUTEACTIVATION, "Word", pActiveWordsBuffer) ; 526 f (status l= ASRERR_OK; ; free (pActiveWordsBuffer ) ; GlobalFree (pMap) ,- free (pWordsInDB) ; return status-"-5R_MIN_ERR_VALUE; ) free (pActiveWordsBuffe ! ; crapι_status=crSendMessage (NULL, CMD_BASE_START_AD, 0, NULL, 0); if (crapι_status!=STATUS_OK) ( GlobalFree (pMap) ; return crapi status; userThreadID=GetCurrentThreadId ( ) ; ResetEvent (hEventEvent) ; status=srStart ( ) ; if (status I =ASRERR_OK) ( GlobalFree (pMap) ; return status; ) hWEThread=CreateThread(NULL, 0, WEThread, (PVOID) time ns, 0, SdwThreadlD) ; if (hWEThread==NULL) ( GlobalFree (pMap ) ; return CREAPI_STATUS_ERR_MALLOC; ) while (TRUE) ( GetMessage(&Msg, NULL, 0, 0); if (Msg.message==srMessage) ( break; else( TranslateMessage ( SMsg) ; DispatchMessage ( &Msg) ; ) 527 SetEvent (hEventEvent) ; status=srStop ( ) , if (status '=ASRERR_OK) ( GlobalFree (pMap) ; return status; ) WaitForSmgleOb ect (hWEThread, INFINITE) ; dwWaιtRetValue=Msg . wParam; CloseHandle (hWEThread) ; if (dwWaιtRetValue==WE_TIMEOUT) ( GlobalFree (pMap) ; *pwResult=WE_TIMEOUT; return STATUS_OK; ) strcpy (pMap, pszWordMap); token=strtok (pMap, seps); while ( token • =NULL) ( pszWord=GlobalAlloc(GPTR, strlen (token) +1) ; if ( 'pszWord) ( GlobalFree (pMap) ; return CREAPI_STATUS_ERR_MALLOC; ) strcpy (pszWord, token); pszWord=str_alltrιm(pszWord) ; str_to_upper (pszWord) ; p=strchr (pszWord, '/'); *p=0; pszRetVal=p+l; pszWord=str_alltrιm(pszWord) ; if ( strcmp (last_sr_result->szResult, pszWord) ==0) ( pszRetVal=str_alltrιm(pszRetVal) ; *pwResult=atoι (pszRetVal) ; GlobalFree (pMap) ; GlobalFree (pszWord) ; return STATUSJDK; ) GlobalFree (pszWord) ; token=strtok (NULL, seps); 528 -pwResult=WE_NOTFOUND; GlobalFree (pMap) ; return STATUS OK; //= 529 #mclude <stπng.h> #include <stdlib.h> #include "strsupp.h" char* szszzfchar* pSz, char* pSzzl f while (*pSzz) ( if (strcmp (pSz, pSzz)==0) return pSzz; pSzz+=(strlen (pSzz) +1) ; ) return NULL; ) void str_to_upper (char* str) ( while (*str) ( *str=toupper (*str) ; str++; ) ) char* str_alltrim(char* str) ( char* new_start_pos=str; char* reverse_ptr; while (*new_start_pos==' ' I I *new_start_pos==' \t ' ) new_start_pos++; reverse_ptr=str+strlen(str) -1; while (*reverse_ptr==' ' | I *reverse_ptr==' \t ' ) reverse_ptr— ; * (reverse_ptr+l) = '\0' ; strcpy(str, new_start_pos ) ; return str; ) 530 #defιne CREAPI LI #ιnclude <wιncows.n> #mclude <mmsystem.h> #include "tt≤sdk32.h" #include "resource. h" #include "creapi.h" #include "uniprt.h" #include "tts.h" extern HINSTANCE hlnstance; HTTSINSTANCE hTTSInst; TTSSYSTEMINFO TTSSystemlnfo; DWORD ttsOpen ( ) ( int status, i, nEnginelD; char language [80] ; status=TtsInitialize(&hTTSInst, NULL, &TTSSystemInfo) ; if (status I =R_SUCCESSFUL) return status+TTS_MIN_ERR_VALUE; if ( I LoadString (hlnstance, IDS_TTS_LANGUAGE, language, sizeof (language) ) ) return GetLastError ( ) ; for (i=0;ι<TTSSystemInfo.nMaxEngines;i++) ( if (strcmp (language, TTSSystemlnfo.mTtsEg[i] . szLanguage) ==0) ( nEngineID=TTSSystemInfo.mTtsEg[i] . nEngineld; break; status=TtsSelectEngme (hTTSInst, nEnginelD, TRUE) if (status !=R_SUCCESSFUL) ( status=TtsUninitialιze (hTTSInst) ; return status+TTS_MIN_ERR_VALUE; 1 status=TtsSetFreq (hTTSInst, M_FRE0_8KHZ) ; if (status !=R_SUCCESSFUL) ( status=TtsUnιnitιalιze (hTTSInst) ; return status+TTS_MIN_ERR_VALUE; ) return STATUS OK; 531 DWORD ttsClos e ( ) ( int s tatus ; status=TtsUnιnιtιalιze ( hTTSIns t ) ; if (status ! =R_SUCCESSFUL) return status+TTS_MIN_ERR_VALUE; ) CREAPI_STATUS crTsGetSpeechMode (PTTΞ_SPEECH_MODE pSpeechMode) ( int status; status=TtsGetSpeechMode (hTTSInst, &pSpeechMode->Volume, &pSpeechMode->Speaker, &pSpeechMode->SpeechRate, SpSpeechMode->Pιtch, &pSpeechMode->PauseDur, &pSpeechMode->ReadMode) ; if (status !=R_SUCCESSFUL) return status+TTS_MIN_ERR_VALUE; return STATUS OK; CREAPI_STATUS crTsSetSpeechMode (PTTS_SPEECH__MODE pSpeechMode)! int status; status=TtsSetSpeechMode (hTTSInst, FALSE, pSpeechMode->Volume, pSpeechMode->Speaker, pSpeechMode->SpeechRate, pSpeechMode->Pιtch, pSpeechMode->PauseDur, pSpeechMode->ReadMode) ; if (status '=R_SUCCESSFUD return status+TTS_MIN_ERR_VALUE; return STATUSJDK; ) 532 #ifndef MESS_H #define MESS_H #define SRC_DEST_TCU 1 #define SRC_DEST_BASE 0 #define ACK_EXPECTED_MASK 0x20 #define SRC_DEST_MASK 0x40 #define DIRECTION_MASK 0x80 #define CMD_BASE_RESET 0x21 #define CMD_BASE_START_DA 0x00 #define CMD_BASE_START_AD 0x02 #define CMD_BASE_STOP_DA 0x01 #define CMD_BASE_GET_VERSION 0x20 #define CMD_BASE_BREAK 0x22 #define ACK_BASE_BREAK 0x82 #define ACK_BASE_FINISHED_DA 0x90 #define ACK_BASE_GET_VERSION 0x80 #define ACK_BASE_RESET 0x81 #define BASE_ACK_TIME_OUT 1000 #define UNIT_ACK_TIMEOUT 1000 #define MAX_MESSAGE_SIZE 255 #endif // MESS H 533 #ιfndef MMIO_H #defιne MMIO_H BOOL PCMInitFile (LPCTSTR pszFileName); BOOL PCMReadFile (PVOID pBuffer, DWORD bytes_to_read, PDWORD was_read ) ; DWORD PCMGetDataSizeO ; BOOL PCMCloseFile ( ) ; #endιf 534 #ιfnαef SR_H_ #defme SR_H_ BOOL srOpen ( ) ; BOOL srClose ( ) ; #endιf // SR H 535 #ifndef STRSUPP_H ttdefme STRSU?P_H char* szszzfchar* pSz, char* pSzz) ; void str_to_upper (char* str) ; char* str_alltrιm( char* str); #endif // STRSUPP H 536 ifndef TTS_H #defιne TTS_H DWORD ttsOpen ( ) ; DWORD ttsCloseO ; #endιf // TTS H 537 #defιne BASEIO_READ_QUE'JΞ #de fme BASEIO_WRITE_QUEUE #defιne STATUS OK #defιne BASEIO_ERR_COM_READ 1 jtdefme BASEIO_ERR_MEM_ALLOC 2 #defιne BASEIO_ERR_COM_WRITE 3 #defme BASEIO_ERR_BREAK 4 #def e BASEIO_ERR_MEDIA_CONNECT 5 #defme BASEIO_ERR_MEDIA_SETUP 6 #defme BASEIO_ERR_ALREADY_CONNECTED 7 ((define BASEIO_ERR_NOT_CONNECTED #defme BASEIO ERR RESET NOT COMPLETE #defιne CRPRO_ERR_MALLOC 101 #defιne CRPRO_CONTROL TOO LONG 102 ((define CREAPI_STATUS_ERR_WRONGSTATE 201 ((define CREAPI_STATUS_ERR_PCMINIT 202 ((define CREAPI_STATUS_ERR_MALLOC 203 ((define CREAPI_STATUS_ERR_PCMREAD 204 #defιne CREAPI_STATUS_ERR_BASENOTFOUND 205 ((define CREAPI_STATUS_ERR_TIMEOUT 206 #defιne CREAPI_STATUS_ERR_SROPEN 207 ((define CREAPI_STATUS ERR SRINTERNAL 208 ((define CREAPI_STATUS_ERR_BUFFERTOOSMALL 209 #defιne CREAPI_STATUS ERR WORDNOTEXIST 210 #defιne CREAPI_STATUS ERR CNTXNOTACTIVE 211 #defιne CREAPI_STATUS_ERR_LOADSTRING 212 #defme CREAPI_STATUS ERR_BUFFER_TOO_SMALL 212 defme CREAPI_STATUS ERR CNTX_NOT_FOUND 213 ((define CREAPI_STATUΞ_ERR_CNTX_INACTIVE 214 ((define CREAPI_STATUS_ERR_MAP_FORMAT 215 #defιne CREAPI_STATUS ERR SYS_ERROR 216 #defιne CREAPI_STATUS_ERR_RESULT_NOT_EXIST 217 #defιne CREAPI_STATUS_ERR_FLAG_NOTSUPP 218 #defme CREAPI_STATUS_ERR_FI LE_CREATE 219 idefme CREAPI_STATUS ERR FILE_WRITE 220 #defιne CREAP I_STATUS_ERR CONTEXTNAME 221 idefme SR_MIN_ERR_VALUE 300 #defιne TTS MI ERR VALUE 400 538 CRPRO.DLL 539 Serial Uniport PC Software Protocol Implemetation Module Crpro.dll 540 / / crpro . c #def e CRPRO_DLL #ιnclude " crpro . h" #ιnclude " .. \baseιo\basειo . h" #ιnclude " .. \capι\unιprt. h" #def e ID_BYTE 0x05 ((define MAX_MESSAGE_SIZE 255 #defme CRPRO_INTERNAL_USE 1 BYTE MARKER! ]={0xFF, ID_BYTE) ; BYTE ControlBuffer[MAX_MESSAGE_ΞIZE+2] ; DWORD BytesInControlBuffer=0; DWORD MarkerWasRead=0; DWORD dwReadUserData = 0; BYTE CountCheckSumm(PBYTE pBuffer, DWORD dwBufferSize); void PrepareBuffer (PVOID pBuffer, DWORD dwBufferSize); void ProcessInputBuffer (PBUFFER_HEADER pBufferHeader) ; PVOID ControlSequenceSearch(PBYTE pBuffer, DWORD dwBufferSize); void CALLBACK ReadNotifyCallback (DWORD dwNotifType, PBUFFER_HEADER pBufferHeader) ; void CALLBACK WriteNotifyCallback (DWORD dwNotifType, PBUFFER_HEADER pBufferHeader) ; NOTIFY_PROC UserReadCallback; NOTIFY PROC UserWriteCallback; CRPRO_STATUS proTransferReset (DWORD dwFlags)! return bioTransferRese (dwFlags) ; } CRPRO_STATUS proSendMessage (PVOID pMessage, BYTE byMessageSize, BYTE byMessageType) ( PCONTROL_HEADER pControlHeader; 541 DWORD actuai_sι=e ; BYTE check_summ; DWORD s tatus ; if (byMessageSιze>MAX_MESSAGE_SIZE) return CRPRO_ERR_CONTROL_TOO_LONG; actual_sιze=sιzeof ( CONTROL_HEADER) +byMessageSι ze ; pControlHeader= ( PCONTROL_HEADER) GlobalAlloc ( GPTR, actual_sιze ) ; i f { I pControlHeader) return CRPRO_ERR_MALLOC ; memcpy (pControlHeader->Marker, MARKER, MARKER_SIZE) ; pControlHeader->MessageType=byMessageType ; pControlHeader->MessageSιze=byMessageSιze; memcpy ( & (pControlHeader->MessageFιrstByte ) , pMessage, byMessageSize ) ; check_summ=CountCheckSumm ( & (pControlHeader->MessageType ) , actual_sιze-MARKER_SIZE-l ) ; * ( ( ( PBYTE) (pControlHeader ) ) +actual_sιze-l ) =check_summ; status=DioAddOutBuf fer (pControlHeader, actual_sιze , 0 , CRPRO_INTERNAL_USE) ; if ( status ' =STATUS_OK) GlobalFree (pControlHeader) ; return status; CRPRO_STATUS proSendBuffer ( PVOID pBuffer, DWORD dwBufferSize, DWORD dwUserData, DWORD dwFlags) ( PrepareBuffer (pBuffer, dwBufferSize); // OxFF -> OxFE dwFlags &=~CRPRO_INTERNAL_USE; return bioAddOutBuffer (pBuffer, dwBufferSize, dwUserData, dwFlags ) ; ) //= CRPRO_STATUS proSystemOpen (UINT DevicelD, NOTIFY_PROC ReadCallback, NOTIFY_PROC WriteCallback) ( UserReadCallback=ReadCallback; UserWrιteCallback=WrιteCallback; return bioMediaConnect (DevicelD, ReadNotifyCallbac , WriteNotifyCallback) ; 542 ) CRPRO_STATUS p roSys temClose ( ) { return bioMediaDis connec ( ) ; //= void CALLBACK ReadNotifyCallback (DWORD dwNotifType, PBUFFER_HEADER pBufferHeader) { switch (dwNotifType) ( case BASEIO_READ_BUFFER_READY: ProcessInputBuffer (pBufferHeader) ; return; case BASEIO_ASYNC_ERROR: break; } ) //= void CALLBACK WriteNotifyCallback (DWORD dwNotifType, PBUFFER_HEADER pBufferHeader) { NOTIFY_P.ARAMS notify_params; if (UserWπteCallback!=NULL) ( switch (dwNotifType) ( case BASEIO_WRITE_BUFFER_DONE: notify_params .pBuffer= (PBYTE) pBufferHeader->pBuffer; notιfy_params.dwBufferLength=pBufferHeader->dwBufferSize; if (pBufferHeader->dwFlags & CRPRO_INTERNAL_USE) ( (PBYTE) notify params . pBuffer+=2; notify_params . dwBufferLength-=3 ; ) notify_params . dwUserData=pBufferHeader->dwUser; notify_params . dwFlags=pBufferHeader->dwFlags ; if (pBufferHeader->dwFlags & CRPRO_INTERNAL_USE) notify_params . dwNotifyType=CRPRO_WRITE_MESSAGE_DONE; else notify_params . dwNotifyType=CRPRO_WRITE_BUFFER_DONE; break; 543 case BASEIO_WRITE_3REAK. notιfy_params oBuffer= ( PBYTE) pBufferHeader->pBuffer; notify_params . αwBufferLength=pBufferHeader->dwBufferSize; if (pBufferHeaoer->dwFlags & CRPRO_INTERNAL_USE) ( ( PBYTE) notify_params . pBuffer+=2 ; notify_params . dwBufferLength-=3 ; ) notιfy_params . wUserData=pBufferHeader->dwUser; notify_params . dwFlags=pBufferHeader->dwFlags ; if (pBufferHeader->dwFlags & CRPRO_INTERNAL_USE) notιfy_params . dwNotιfyType=CRPRO_WRITE_MESSAGE_BREAK; else notif y_params . dwNotιfyType=CRPRO_WRITE_BUFFER_BREAK; break; case BASEIO_ASYNC_ERROR : notιfy_params . pBuf fer=p Buff erHeader->pBuf fer , • notif y_params . dwBufferLength=pBufferHeader->dwBufferSιze ; notify params . dwUserData=pBuf ferHeader->dwUser ; notif y_params . dwFlags=pBuf f erHeader->dwFlags ; notif y_params . dwNotif yType=CRPRO_ASYNC_ERROR; break; ) UserWriteCallback ( Snotif y_params ) ; i f (pBufferHeader->dwFlags & CRPRO_INTERNAL_USE) ( GlobalFree (pBuf f erHeader->pBuf f er) ; return ; //= void PrepareBuffer (PVOID pBuffer, DWORD dwBufferSize) ( DWORD sιze_to_search=dwBufferSize; PBYTE pBuffer_to_search= ( PBYTE) pBuffer; PBYTE ptr; while ( (ptr=memchr(pBuffer_to_search, OxFF, sιze_to_search) ) ) *ptr=0xFE; sιze_to_search-= (ptr-pBuffer_to_search+l) ; pBuffer_to_search=ptr+l; ) 544 void Process InputBuffer ( PBUFFER_HEADER pBuf ferHeader ) ! NOTIFY_PARAMS notif y_params ; PBYTE pBuffer=pBufferHeader->pBuffer; DWORD dwBufferSιze=pBufferHeader->dwBufferSιze ; DWORD mιn_buff_length ; PBYTE pControlSequence ; while (dwBuf ferSιze>0 ) ( if (MarkerWasRead>0 ) ( if (MarkerWasRead ' =MARKER_SIZE) ( mιn_buf f_length=mιn (dwBuf erSize, MARKER_SIZE-MarkerWasRead) ; if (memcmp (pBuffer, MARKER+MarkerWasRead, min_buff_length ) ==0 ) ( MarkerWasRead+=mm_buff_length; pBuffer+=mm_buf f_length; dwBufferSιze-=mm_buff_length ; ) else MarkerWasRead=0 ; ) if (MarkerWasRead==MARKER_SIZE) ( if (BytesInControlBuffer<2) ( mιn_buff_length=mιn (dwBufferSize, 2-BytesInControlBuffer) ; memcpy (ControlBuffer+BytesInControlBuffer, pBuffer, mιn_buff_length) ; pBuffer+=mm_buff_length; dwBufferSιze-=mιn_buff_lengtn ; BytesInControlBuffer+=mιn_buff_length; ) if (BytesInControlBuffer>l) ( mm buff length=mιn ( (BYTE) dwBufferSize, ControlBuffer [1] +1) ; memcpy (ControlBuffer+BytesInControlBuffer, pBuffer, mιn_buff length) pBuffer+=mm_buff_length; dwBufferSιze-=mιn_buff_length; BytesInControlBuffer+=mm_buff_length; 545 if ( Bytes InControlBuf fer>l&&ControlBuf fer [ 1 ] ==Bytes InControlBuf fer- 3 &&U serReadCallbacκ ' =NULL ) ( BYTE check_sum; check_sum=CountCheckSumm ( ControlBuf fer, Bytes InControlBuf fer-1 ) ; if ( check_sum==ControlBuf fer [ Bytes InControlBuf fer- _ ] ) { notιfy_params . pBuf f er=ControlBuf fer; notif y_params . dwBuf f erLength=BytesInControlBuf fer-1 ; notif y_params . dwUserData=dwReadUserData , • notlfy_params . dwNotif yType=CRPROJ_NTR_RECEIVED; notif y_params . dwFlags=pBuf f erHeader->dwFlags ; UserReadCallback ( Snoti f y params ) ; ) MarkerWasRead=0; BytesInControlBuffer=0 ; if (dwBufferSize>0) ( if (UserReadCallback* =NULL) { pControlSequence=ControlSequenceSearch (pBuffer, dwBufferSize) ; notify_params.pBuffer=pBuffer; if (pControlSequence==NULL) ( if (pBuffer [dwBufferSize-l]==MARKER[0] ) ( dwBufferSize—; MarkerWasRead=l; ) notify_params . dwBufferLength=dwBufferSize; ) else( notify_params . dwBufferLength=pControlSequence-pBuffer; MarkerWasRead=MARKER_SIZE; dwBufferSιze-=MARKER_SIZE; pBuffer+=MARKER_SIZE; ) if (notify j params . dwBufferLength>0) ( notify j params .dwUserData=dwReadUserData; notify_params . dwNotifyType=CRPRO_READ_BUFFER_READY; notify_params . dwFlags=pBufferHeader->dwFlags ; UserReadCallback ( Snotify_params ) ; pBuffer+=notιfy_params . dwBufferLength; dwBufferSιze-=notιfy_params . dwBufferLength; 546 //= PVOID ControlSequenceSearchl PBYTE pBuffer, DWORD dwBufferSize) ( DWORD sιze_to_search=dwBufferSιze; PBYTE pBuffer_to_search= (PBYTE) pBuffer; PBYTE ptr; PBYTE pLastByte=pBuffer+dwBufferSιze-l; while ( (ptr=memchr(pBuffer_to_search, MARKERfO], sιze_to_search) ) ) { if (ptr '=pLastByte&&ptr!l]==ID_BYTE) ( return ptr; ) sιze_to_search-=(ptr-pBuffer_to_search+l) ; pBuffer_to_search=ptr+l ; ) return NULL; ) BYTE CountCheckSumm( PBYTE pBuffer, DWORD dwBufferSize) { BYTE check_summ=0; unsigned int 1; for (ι=0;κdwBufferSιze;ι++) check_summ+=pBuffer [1] ; return check summ; //================================================================== CRPRO_STATUS p roSetReadUserData ( DWORD dwUserData ) ( dwReadUs erData=dwUserData ; return STATUS OK; // = 547 #ifndef CRPRC_H #defme CRPPO_H #ifdef plusplus extern "C " ( #endif // cplusplus #include <wmαows.h> #ifdef CRPRO_DLL #define CRPRO_STATUS _decispec (dllexport ) DWORD #else #define CRPRO_STATUS DWORD #endif #define CRPROJWRITE_3UFFER_DONE 1 #define CRPRO_READ_BUFFER_READY 2 #define CRPRO_CMTR_RECEIVED 3 #define CRPRO_WRITE_BUFFER_BREAK 4 #define CRPRO_ASYNC_ERROR 5 #define CRPRO_WRITE_MESSAGE_DONE 6 #define CRPRO RITE_MESSAGE_BREAK 7 #define MARKER_SIZE 2 #pragma pack(l) typedef struct CONTROL_HEADER( BYTE Marker [MARKER_SIZE] ; BYTE MessageType; BYTE MessageSize; BYTE MessageFirstByte; ) CONTROL_HEADER, *PCONTROL_HEADER; typedef struct NOTIFY_PARAMS( DWORD dwNotifyType; PVOID pBuffer; DWORD dwBufferLength; DWORD dwUserData; DWORD dwFlags ; DWORD dwStatus; ) NOTIFY_PARAMS, *PNOTIFY_PARAMS; typedef void (CALLBACK *NOTIFY_PROC) ( PNOTIFY_PARAMS pNotifyParams); 548 CRPROJ3TATUS proSystemOpen (UINT DevicelD, NOTIFY_PROC ReadCallbacK, NOTIFY_PROC WriteCallback) ; CRPRO_STATUS proSystemClose () ; CRPRO_STATUS proSendMessage ( PVOID pMessage, BYTE byMessageSize, BYTE byMessageType) ; CRPRO_STATUΞ proSendBuffer ( PVOID pBuffer, DWORD dwBufferSize, DWORD dwUserData, DWORD dwFlags); CRPRO_STATUS proTransferReset (DWORD dwFlags); CRPRO STATUS proSetReadUserData ( DWORD dwUserData); #ifdef cplusplus ) #endif // cplusplus #endif // CRPRO H 549 BASEIO.DLL 550 PC Software Media i/o Module baseio.dll 551 // baseic . c #defιne 3ASEIO_DLL #ιnclude <wιndows . h> iinclude <stdιo.h> #ιnclude "queue. h" #ιnclude "baseio.h" #ιnclude " .. \capι\unιprt.h" #defιne CHECK_TIME_SLEEP 15 #defιne READ BUFFER SIZE 1024 #def e DRIVER_READ_BUFFER_SIZE 16384 idefme DRIVER WRITE BUFFER SIZE 16384 BOOL CommSettmgsInit (HANDLE hCom) BASEIO_CALLBACK UserReadCallback; BASEIO_CALLBACK UserWπteCallback; HQUEUE hWriteQueue; HANDLE hWriteThread; HANDLE hReadThread; HANDLE hCom=INVALID HANDLE VALUE; //= DWORD WINAPI ReadThread ( PVOID param) ( PBUFFER_HEADER pHeader; COMSTAT comstat; DWORD nb, was_read, dwError, mask; for ( ; ; ) ( ClearComraError (hCom, idwError, &comstat) ; while (comstat. cbInQue==0) ( WaitCommEvent (hCom, &mask, NULL); ClearCommError (hCom, &dwError, .comstat); ) nb=comstat. cblnQue; Sleep (CHECK_TIME_SLEEP) ; ClearCommError (hCom, idwError, scomstat) ; if (nb==comstat.cbInQue| I comstat . cbInQue>=READ_BUFFER_SIZE) ( pHeader= ( PBUFFER_HEADER) GlobalAlloc (GPTR, sizeof (BUFFER HEADER)); 552 pHeaoer->pBuffer=( PVOID) GlooalAlloc (GPTR, comstat . cblnQue) ; ReadFile (hCom, pHeader->pBuffer, comstat . cblnQue, &was_read, NULL) ; pHeader->dwBufferSιze=comstat . coInQue; UserReadCallback (BASEIO_READ_BUFFER_READY, pHeader) ; GlobalFree (pHeader->pBuffer) ; GlobalFree (pHeader) ; ) ) return 0; ) //= DWORD WINAPI WnteThread ( PVOID param) ( PBUFFER_HEADER pHeader; DWORD written; DWORD dwNotifyType; for(;;) ( QueueWaitWhileEmpty (hWriteQueue, INFINITE) ; pHeader= ( PBUFFER_HEADER) QueuePop (hWriteQueue) ; f (pHeader->dwBufferSize!=0) ( GetOverlappedResult (hCom, &pHeader->overlapped, Swritten, TRUE) ; dwNotιfyType= (written == 0 ? BASEIO_WRITE_BREAK: BASEI0_WRITE_BUFFER_DONE) ; ) else dwNotιfyType=BASEIO_WRITE_BUFFER_DONE; UserWriteCallback (dwNotifyType, pHeader) ; CloseHandle (pHeader->overlapped.hEvent) ; GlobalFree (pHeader) ; return 0; //= BASIO_STATUS bioMediaConnect (DWORD dwDevicelD, BASEIO_CALLBACK ReadCallback, BASEIO_CALLBACK WriteCallback) ( DWORD dwThreadID; char szPort [16] ; 553 sprintf (szPort, ""*ssd", "COM", αwDevicelD) ; hCom=CreateFιle (szPort, GΞNERIC_READ I GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_MORMAL I FILE_FLAG_OVERLAPPED, NULL) ; if (hCom==INVALID_HANDLEJVALUE) return BASEIO_ERR_MEDIA_CONNECT ; UserReadCallback=ReadCallbacκ; UserWrιteCallback=WrιteCallback; if ( ' CommSettmgsIn t (hCom) ) ( CloseHandle (hCom) ; hCom=INVALID_HANDLE_VALUE; return BASEIO ERR MEDIA SETUP; hWrιteQueue=QueueCreate ( ) ; hReadThread=CreateThread(NULL, 0, ReadThread, 0, 0, SdwThreadlD) ; SetThreadPrιoπty(hReadThread, THREAD_PRIORITY_HIGHEST) ; hWrιteThread=CreateThread(NULL, 0, WriteThread, 0, 0, &dwThreadID) ; SetThreadPrιonty(hWπteThread, THREAD_PRIORITY_HIGHEST) ; return STATUS OK; //= BASIO_STATUS bioMediaDisconnect ( > ( lf (hCom==INVALID_HANDLE_VALUE) return BASEIO_ERR_NOT_CONNECTED; bioTrans ferReset (BASEIO_READ_QUEUE I BASEIO_WRITE_QUEUE) ; TermmateThread (hReadThread, 0); CloseHandle (hReadThread) ; TermmateThread (hWπteThread, 0); CloseHandle (hWriteThread) ; QueueDestroy (hWriteQueue) ; CloseHandle (hCom) ; 554 hCom = INVALID HANDLE VALUE; return STATUS OK; BASIO_STATUS oioAddOutBuffer (PVOID pBuffer, DWORD dwBufferSize, DWORD dwUser, DWORD dwFlags) ( PBUFFER_HEADER pHeader; DWORD written; if (hCom==INVALID_HANDLE_VALUE) return BASEIO ERR NOT CONNECTED; pHeader='PBUFFER_HEADER) GlobalAlloc (GPTR, sizeof (BUFFER_HEADER) ) ; pHeader->pBuffer=pBuffer; pHeader->dwUser=dwUser; pHeader->dwBufferSιze=dwBufferSize; pHeader->dwFlags=dwFlags ; if (dwBufferSize !=0) ( pHeader->overlapped.hEvent=CreateEvent (NULL, FALSE, FALSE, NULL) ; WriteFile (hCom, pHeader->pBuffer, pHeader->dwBufferSize, Swritten, SpHeader->overlapped) ; ) QueuePusn (hWriteQueue, pHeader) ; return STATUS_OK; ) //= BASIO_STATUS bioTransferReset (DWORD dwFlags) { DWORD num_elem; if (hCom==INVALID_HANDLE_VALUE) return BASEIO_ERR_NOT_CONNECTED; if (dwFlags&BASEIOJ^RITE_QUEUE) ( num elem=hWrιteQueue->sιze; 555 PurgeComm ( hCom, PURGE_TXABORT ) ; while ( QueueWaitWhileEmpty ( hWriteQueue , 0 ) ==WAIT_OBJECT_0 ) ; PurgeComm ( hCom, PURGEJTXCLEAR) ; ) if (dwFlags&BASEl0_READ_QUEUE) PurgeComm(hCom, PURGE_RXABORT I PURGE_RXCLEAR) ; return STATUS OK; //= BOOL CommSett gsInit (HANDLE hCom) ( DCB deb; dcb.DCBlength=sιzeof (DCB) ; GetCommState (hCom, Sdcb) ; dcb.BaudRate=CBR_115200; deb . fBmary=TRUE; deb . fParιty=TRUE; deb . fOutxCtsFlow=TRUE; deb. fOutxDsrFlow=FALSE; deb . fDtrControl=DTR_CONTROL_DISABLE; deb . fDsrSensιtιvιty=FALSE; dcb.fOutX=FALSE; dcb.fInX=FALSE; dcb.fNull=FALSE; deb . fRtsControl=RTS_CONTROL_HANDSHAKE; dcb.ByteSιze=8; deb . Parιty=NOPARITY; deb . StopBιts=ONESTOPBIT; dcb.XonChar=0; deb.XoffChar=0; dcb.XonLim = 0; dcb.XoffLim = 0; dcb.EvtChar=0; if ( 'SetCommState (hCom, &dcb) ) return FALSE; SetCommMasklhCom, EV RXCHAR) ; 556 PurgeComm(hCom, PURGE_TXABORT I PURGE_RXABORT I PURGE_TXCLEAR I PURGE_RXCLEAR ) ; if ( !SetupComm(hCom, DRIVER_READ_BUFFER_SIZE, DRIVER_WRITE_BUFFER_SIZE) ) return FALSE; return TRUE; //= 557 // Queue. c #ιnciude "queue. h" // Queue implementation //= HQUEUE QueueCreate ( ) ( HQUEUE hQueue ; hQueue= ( HQUEUE ) GlobalAlloc (GPTR, sizeof (QUEUE) ) ; if (hQueue==NULL) return NULL; hQueue->sιze=0 ; hQueue->fιrst=NULL ; hQueue->hNotEmpty=CreateEvent (NULL, TRUE, FALSE, NULL) InitializeCπticalSection ( ShQueue->crιt_sectιon ) ; return hQueue ; //= BOOL QueuePush (HQUEUE hQueue, PVOID data)! PQUEUE_NODE pNew_node; EnterCriticalSection ( hQueue->crιt_sectιon) ; pNew_node=(PQUEUE_NODE) GlobalAlloc (GPTR, sizeof (QUEUE_NODE) ) ; if (pNew_node==NULL) return FALSE; pNew_node->data=data ; pNew_node->next=NULL; if (hQueue->fιrst==NULL) hQueue->f1rst=pNew_node ; else hQueue->last->next=pNew_node; hQueue->last=pNew_node; hQueue->sιze++; SetEvent (hQueue->hNotEmpty) ; LeaveCπticalSection ( &hQueue->crιt_sectιon) ; 558 return TRUE; // = PVOID QueuePop (HQUEUE hQueue ) ( PQUEUE_NODE next ; PVOID data ; if (hQueue->fιrst==NULL) return NULL; EnterCriticalSection ( ShQueue->crιt_sectιon ) ; data=hQueue->fιrst->data ; next=hQueue->fιrst->next; GlobalFree (hQueue->fιrst ) ; hQueue->fιrst=next ; hQueue->sιze — ; if (hQueue->size==0) ResetEvent (hQueue->hNotEmpty) ; LeaveCriticalSection ( hQueue->cπt_sectιon) ; return data; ) //= void QueueReset (HQUEUE hQueue) { while (WaitForSingleOb ect (hQueue->hNotEmpty, 0) ==WAIT_OBJECTjO) QueuePop (hQueue) ; 1 //= void QueueDestroy ( HQUEUE hQueue ) ( QueueReset (hQueue ) ; CloseHandle ( hQueue->hNotEmpty) ; DeleteCriticalSection ( &hQueue->cπt_sectιon) ; GlobalFree ( hQueue ) ; // = DWORD QueueWaitWhileEmpty (HQUEUE hQueue, DWORD timejns ) 559 return WaitForSmgleObject (hQueue->hNotEmpty, time ns) //= 560 #ιfnαef EASEIO_H #defιne BASEIO_H #ιfdef cplusplus extern "C"( #endιf idefme BASEIO_WRITE_BUFFER_DONE 1 ((define BASEIO_READ_BUFFER_READY 2 #defme BASEIO_WRITE_BREAK 3 idefine BASEIO_ASYNC_ERROR 4 #lfdef BASEIO_DLL ftdefme BASIO_STATUS _declspec (dllexport ) DWORD #else #def e BASIO_ΞTATUS _oeclspec (dllimport ) DWORD #endιf typedef struct _BUFFER_HEADER( OVERLAPPED overlapped; PVOID pBuffer; DWORD dwBufferSize; DWORD dwUser; DWORD dwFlags; BYTE bySystem[3] ; } BUFFER_HEADER, *P3UFFER_HEADER; typedef void (CALLBACK *BASEIO_CALLBACK) (DWORD dwNotifType, PBUFFER_HEADER pBufferHeader) ; BASIO_STATUS bioMediaConnect (DWORD dwDevicelD, BASEIO_CALLBACK ReadCallback, BASEIO_CALLBACK WriteCallback) ; BASIO_STATUS bioMediaDisconnect ( ) ; BASIO_STATUS bioAddOutBuffer ( PVOID pBuffer, DWORD dwBufferSize, DWORD dwUser, DWORD dwFlags); BASIO STATUS bioTransferReset (DWORD dwFlags); #ifdef cplusplus #endιf #endιf // CRPKTDRV_H 561 #ifndef QUEUE_H ttdefine QUEUE_H #include <windows . h> typedef struct QUEUE_NODE_TAG( PVOID data; struct QUEUE_NODE_TAG* next; }QUEUE_NODE, *PQUEUE_NODE; typedef struct QUEUEJTAGf HANDLE hNotEmpty; DWORD size; PQUEUE_NODE first; PQUEUE_NODE last; CRITICAL_SECTION crit_section; )QUEUE, *PQUEUE; typedef PQUEUE HQUEUE; HQUEUE QueueCreate ( ) ; BOOL QueuePush (HQUEUE hQueue, PVOID data); PVOID QueuePop (HQUEUE hQueue); void QueueReset (HQUEUE hQueue); void QueueDestroy (HQUEUE hQueue); DWORD QueueWaitWhileEmpty(HQUEUE hQueue, DWORD time ns); #endif // QUEUE H 562 ActiveX Source Code for Speech Recognition 563 / / AcqPropPage . cpp • implementation file / / #ιncluoe " s tdafx . h" ftinclude "NewSR . h" #ιnclude "AcqPropPage . h" #ιncluce " SRCtl . h" #ιnclude <mmsvs tem. h> #lfdef _DEBUG #def e new DEBUG_NEW #undef THIS_FILE static char THIS_FILE [ ] = FILE ; #endιf #defιne WORK_MODE 0 #defme INIT_MODE 1 ll/ll/ll ////I/////////II//I/IIII/I//I///I/I///I//I/II//IIIII//I/I/I///I////I I II CAcqPropPage dialog IMPLEMENT DYNCREATE (CAcqPropPage, COlePropertyPage) ///III II lllll/lllll/lllll II I I II Message map BEGIN_MESSAGE_MAP (CAcqPropPage, COlePropertyPage) //( (AFX_MSG_MAP (CAcqPropPage) ON_BN_CLICKED(IDC_WAVEFORMAT, OnWaveformat ) ON_BN_CLICKED(IDC_DEVICEID, OnDeviceid) ON_CBN_SELCHANGE (IDC_WAVELIST, OnSelchangeWavelist) ON_BN_CLICKED(IDC_REALTIME, OnRealtime) ON_BN_CLICKED(IDC_NONREALTIME, OnNonrealtime) //) }AFX_MSG_MAP END MESSAGE MAP ( ) III I II Initialize ciass factory and guid 564 // (D446B881-7537-11D0-A6CE-0040332D01C5) IMPLEMENT_OLECREATE_ΞX (CAcqPropPage, " ewSR. CAcqPropPage" , 0xd446b881, 0x7537, OxlldO, 0xa6, Oxce, 0x0, 0x40, 0x33, 0x2d, 0x1, 0xc5) I/II//I I III/ /III III ll/lll l/ll lll/l/ll/l/ll/ll III l/ll/ll I II CAcqPropPage: : CAcqPropPageFactory : : UpdateRegistry - // Adds or removes system registry entries for CAcqPropPage BOOL CAcqPropPage: : CAcqPropPageFactory: : UpdateRegistry (BOOL bRegister) ! // TODO: Define string resource for page type; replace '0' below with ID. if (bRegister) return AfxOleRegisterPropertyPageClass (AfxGetlnstanceHandle ( ) , m_clsid, IDS_SR_PPG) ; else return AfxOleUnregisterClass (π j clsid, NULL) ; ) 11 ll/ll III III II II III /III llll/l/l/lll/lll I llll I II CAcqPropPage: : CAcqPropPage - Constructor // TODO: Define string resource for page caption; replace '0' below with ID. CAcqPropPage: : CAcqPropPage ( ) : COlePropertyPage (IDD, IDS_ACQ) ( // { (AFX_DATA_INIT (CAcqPropPage) //) )AFX_DATA_INIT Cur rWave Forma t=NULL; 1 CAcqPropPage : : -CAcqPropPage ( ) ( if ( ICurrWaveFormat) f ree (CurrWaveFormat) ; ) 565 ! I II III 11111111 II III 11 II II 111 II I II II II ,7 lllll I II CAcqPropPage: : DcDataExchange - Moves data between page and properties void CAcqPropPage: : DoDataExcnange (CDataExchange* pDX) // NOTE: ClassWizard w ll add DDP, DDX, and DDV calls here // DO NOT EDIT what you see in these blocks of generated code I // { {AFX_DATA_MAP (CAcqPropPage) DDX_Control (pDX, IDC_DESCRIPTION, m_EditDescrιptιon) ; DDP_CBIndex(pDX, IDC_WAVELIST, m_WaveIndex, "XWavelndex" ) ; DDX_CBIndex(pDX, IDC_WAVELIST, m_WaveIndex) ; DDPJText (pDX, IDC_ACQ, m_DataBase, "DataBase"); DDP_CBIndex(pDX, IDC_ACQ, m_XSRTransfer , "XSRTransfer" ) ; DDP_CBIndex(pDX, IDC_WAVEFORMAT, m_XAcqMode, "XAcqMode"); DDP_CBIndex(pDX, IDC_DEVICEID, irjXAcqMode, "XAcqMode"); DDP_CBIndex(pDX, IDC_REALTIME, m_XAcqMode, "XAcqMode"); DDP_CBIndex(pDX, IDC_NONREALTIME, m_XAcqMode, "XAcqMode"); DDX_Control(pDX, IDC_WAVELIST, mJWaveList); DDX_Control(pDX, IDC_WAVEFORMAT, m_WaveFormat ) ; DDX_Control (pDX, IDC_REALTIME, ir RealTime) ; //) )AFX_DATA_MAP DDP_PostProcessmg (pDX) ; i // III7 • III 'i 'i '//iiii/iiiiiiiiiiiii I II CAcqPropPage message handlers EOOL CAcqPropPage : : OnlnitDialog ( ) ( PVOID wf; DWORD size; COlePropertyPage: : OnlnitDialog ( ) ; CButton* CurrButton; HDB hDb; LPSTR Buffer; 566 HCURSOR SaveCursor; SaveCursor=SetCurso (AfxGetApp ( ι ->LoaαStanαardCursor (IDC_WAIT) ) ; COlePropertyPage : : OnlnitDialog ( ) ; asrDbList (NULL, Ssize); Buffer= (LPSTR) malloc (size) ; asrDbList (Buffer, Ssize); hDb=asrDbOpen (Buffer) ; if (Buffer) free (Buffer) ; asrDbGetlnfo (hDb, ASRDBINFO_NBRWAVEFORMATS, NULL, Ssize); wf= ( DWORD*) malloc (size) ; asrDbGetlnfo (hDb, ASRDBINFO_NBRWAVEFORMATS , wf, Ssize); nFormats=~ ( (LPDWORD) wf) ; free (wf) ; asrDbGetlnfo (hDb, ASRDBINFO_WAVEFORMATS , NULL, Ssize); CurrWaveFormat=(PWAVEFORMAT) malloc (size) ; asrDbGetlnfo (hDb, ASRDBINFO_WAVEFORMATS, CurrWaveFormat, Ssize); switch (m_XAcqMode) ( case DISP_DEVICEID: CurrButton=(CButton*)GetDlgItem(IDC_DEVICEID) ; CurrButton->SetCheck (1) ; CurrButton=(CButton*)GetDlgItem(IDC_NONREALTIME) ; m_RealTιme . SetCheck ( 1 ) ; FιllID(INIT_MODE) ; break; case DIS?_REALTIME: CurrButton= ( CButton* ) GetDlgltem ( IDC_WAVEFORMAT) ; CurrButton->SetCheck(l) ; CurrButton= (CButton*) GetDlgltemf IDC_REALTIME) ; CurrButton->SetCheck(l) ; FιllWF(INIT_MODE) ; break; case DIS?_NONREALTIME: CurrButton= (CButton* ) GetDlgItem( IDC_WAVEFORMAT) ; CurrButton->SetCheck(l) ; CurrButton=(CButton*) GetDlgltem ( IDC_NONREALTIME) ; CurrButton->SetCheck ( 1 ) ; FιilWF(INIT_MODE) ; break; case DIS?_WAVEFORMAT: MessageBox ( "Not implemented") ; 567 if (hDb>ASRERR_MAXERR) asrDbClose (hDb) ; SetCursor (SaveCursor) ; return FALSE; void CAcqPropPage: : CheckAcqGrouo (BOOL Enable=TRUE) ( CStatic* m_Statιc; CButton* m_Button; m_Button=( CButton*) GetDlgltem(IDC_NONREALTIME) ; m_Statιc= (CStatic* )GetDlgItem(IDC_ACQ) ; m_RealTιme . EnableW dow ( Enable) ; m_Statιc->EnableWmdow (Enable) ; m_Button->EnableWmdow(Enable) ; ) void CAcqPropPage: : FillDescπption (FillType ftype, WORD wWhat) ! WAVEINCAPS wavecaps ; CStπng mJDescription; if (ftype==FILL_BYDEVICEID) ( wavelnGetDevCaps (wWhat, Swavecaps, sizeof (wavecaps )) ; m_Descrιptιon. Format ("Manufacturer identifier: %d\r\n\ Product identifier: %d\r\nProduct name: %s\r\n%s\r\nFormats that are supported : ", wavecaps .wMid, wavecaps .wPid, wavecaps . szPname, wavecaps.wChannels==l' , "Mono" : "Stereo") ; if (wavecaps . owFormats WAVE_FORMAT_lM08 ) m_Descπptιon+="\r\nll.025 kHz, mono, 8-bit"; if (wavecaps. dwFormatsSWAVE_FORMAT_lM16) m_Descπptιon+="\r\nll.025 kHz, mono, 16-bit"; if (wavecaps. dwFormatsSWAVE_FORMAT_lS08) m_Descrιptιon+="\r\nll.025 kHz, stereo, 8-bit"; if (wavecaps .dwFormatsSWAVE_FORMAT_lS16) m_Descπptιon+="\r\nll.025 kHz, stereo, 16-bit"; if (wavecaps .dwFormatsSWAVE_FORMAT_2M08) m_Descπptιon+="\r\n22.05 kHz, mono, 8-bit"; if (wavecaps .dwFormatsSWAVE_FORMAT_2M16) m_Descrιptιon+="\r\n22.05 kHz, mono, 16-bit"; if (wavecaps .dwFormatsSWAVE_FORMAT_2S08) m_Descrιptιon+="\r\n22.05 kHz, stereo, 8-bit"; 568 if (wavecaps . dwFormatsSWAVE_FORMAT_2S16) m_Descπptιon+="\r\n22.05 kHz, stereo, 16-bit"; if (wavecaps. dwFormatsSWAVE_FORMAT_4M08) m_Descπptιon J -="\r\n44.1 kHz, mono, 8-bit"; if (wavecaps.dwFormatsSWAVE_FORMAT_4M16) m_Descrιptιon+="\r\n44.1 kHz, mono, 16-bit"; if (wavecaps. dwFormatsSWAVE_FORMAT_4S08) m_Descπptιon+="\r\n44.1 kHz, stereo, 8-bit"; if (wavecaps . dwFormatsSWAVE_FORMAT_4S16) m_Descπptιon+="\r\n44.1 kHz, stereo, 16-bit"; m_EdιtDescπptιon. SetWmdowText (m_Descrιptιon) ; ) else ! m_Descrιptιon. Format ("Format type %d\r\nNumber of channels %d\r\n\ Sample rate *d\r\nData transfer rate %d\r\nBlock alignment %d", CurrWaveFormat [wWhat] . wFormatTag, CurrWaveFormat [wWhat] .nChannels, CurrWaveFormat [wWhat] .nSamplesPerSec, CurrWaveFormat [wWhat] .nAvgBytesPerSec, CurrWaveFormat [wWhat] .nBlockAlign) ; m_EdιtDescπptιon. SetWmdowText (m_Descrιptιon) ; ) void CAcqPropPage : : OnSelchangeWavelist ( ) ! FιllDescrιptιcn(m_WaveFormat.GetCheck(PFILL_BYNBRWAVEFORMAT:FILL_BYDE VICEID, rrjWaveList.GetCurSel () ) ; I void CAcqPropPage: :OnRealtιme ( ) ( SaveAcqMode ( ) ; ) void CAcqPropPage : : OnNonrealtime ( ) ( SaveAcqMode ( ) ; ) void CAcqPropPage : : OnDeviceid ( ) 569 ( SaveAcqMode ( ) ; FιllID(WORK_MODE) ; ) void CAcqPropPage: : OnWaveformat ( ) ! SaveAcqMode ( ) ; FιllWF(WORK_MODE) ; ) void CAcqPropPage : : SaveAcqMode ( ) ! CButton* CurrentButton; CurrentButton= (CButton*) GetDlgItem(IDC_DEVICEID) ; if (CurrentButton->GetCheck ( ) ) ( m_XAcqMode=DISP_DEVICEID; return; ) if (m_RealTιme . GetCheck ( ) ) { m_XAcqMode=DISP_REALTIME; return; ) m XAcqMode=DISP NONREALTIME; void CAcqPropPage: : FillWFdnt mode)! CString tmp; CheckAcqGroup (TRUE) ; m_WaveLιst.ResetContent ( ) ; for(DW0RD =0;ι<nFormats;ι++) ( tmp. Format ("%s%d", "Wave format #", i) ; m_WaveLιst. InsertString (-1, tmp) ; ) if (mode==WORK_MODE) m_WaveLιst.SetCurSel (0) ; else rr j WaveLis t . SetCurSel (m_WaveIndex) ; FιllDes cπptιon ( FILL_BYNBRWAVEFORMAT, m_WaveLιst . GetCurSel ( ) ) ; ) void CAcqPropPage : : FillID ( int mode ) ( 570 UINT NumDevs; CStπng InsertStπng; CheckAcqGroup (FALSE) ; NumDevs=waveInGetNumDevs ( ) ; m_WaveLιst . ResetContent ( ) ; for (UINT ι=0;KNumDevs;ι++) ( InsertStπng. Format (" s id" , "Device ID: ", i); m_WaveLιst . InsertStπng (-1, InsertStrmg) ; ) if (mode==WORK_MODE) m_WaveLιst. SetCurSel (0) ; else m_WaveLιst. SetCurSel (m_WaveIndex) ; FillDescπptιon(FILL_BYDEVICEID, m_WaveLιst . GetCurSel ( ) ) ; 571 // NewSR. cpp : Implementation o f CNewSRApp and DLL registration . #include " s tdafx . h" #include "NewSR. h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE [ ] = FILE ; #endif CNewSRApp NEAR theApp; const GUID CDECL BASED_CODE _tlid = ( 0x528c0220, 0x72ec, OxlldO, ( 0xa6, Oxce, 0, 0x40, 0x33, 0x2d, 0x1, 0xc5 ) ); const WORD _wVerMajor = 1; const WORD wVerMinor = 0; ll/ll II CNewSRApp: : Initlnstance - DLL initialization BOOL CNewSRApp : : Initlnstance ( ) ! BOOL blnit = COleControlModule : : Initlnstance ( ) ; if (blnit ) ! SRIcon=LoadIcon(IDI_SRICON) ; ) return blnit; ) III III III I I CNewSRApp: : Exitlnstance - DLL termination int CNewSRApp: : Exitlnstance ( ) ( // TODO: Add your own module termination code here. 572 return COleControiModule : : Exitlns tance ( ) ; ii 1111 mill ii i ii i mi ii 111 ii n i mill i / III 11 ii 1111 ii in i mi ii niiiiii i mi I I I DllRegisterServer - Adds entries to the system registry STDAPI DllRegisterServer (void) ( AFX_MANAGE_STATE (_afxModuleAddrThis ) ; if ( 'AfxOleRegisterTvpeLib (AfxGetlnstanceHandle ( ) , _tlιd) ) return ResultFromScode (SELFREG_E_TYPELIB) ; if ( 'COleObiectFactoryΞ.x: : UpdateRegistryAll (TRUE) ) return ResultFromScode (SELFREG_E_CLASS) ; return NOERROR; ll ll l ll ll llll / ll I I I II I ll llll l I I I DllUnregisterServer - Removes entries from the system registry STDAPI DllUnregisterServer (vo d) ( AFX_MANAGE_STATE (_afxModuleAddrThis ) ; if ( IAfxOleUnregisterTypeLib (Jtlid) ) return ResultFromScode (SELFREG_E_TYPELIB) ; if ( ICOleObηectFactoryEx: : UpdateRegistryAll (FALSE) ) return ResultFromScode (SELFREG_E_CLASS) ; return NOERROR; 573 ; NewSR.def : Declares the module parameters. LIBRARY "NEWSR.OCX" EXPORTS DllCanUnioadNow 01 PRIVATE DllGetCIassObject @2 PRIVATE DllRegisterServer @3 PRIVATE DllUnregisterServer @4 PRIVATE 574 // NewSR.odl : type library source for OLE Controx project. // This file will be processed by the Make Type Library >mktyplιb) tool to // produce the type liorary iNewSR.tlb) that will become a resource in // NewSR.ocx. #ιnclude <olectl.h> [ uuιd(528C0220-72EC-HD0-A6CE-0040332D01C5) , version ( 1.0 , , helpstrmg ( "NewSR OLE Control module"), control ] library NEWSRLib ( importlib (STDOLEJTLB) ; importlib (STDTYPEJTLB) ; // Primary dispatcn interface for CSRCtrl [ uuιd(528C0221-72EC-HDO-A6CE-0040332D01C5) , helpstrmg ( "Dispatch interface for SR Control"), hidden ] dispmterface _DSR ( properties : // NOTE - ClassWizard will maintain property information here. // Use extreme caution when editing this section. //{ (AFX_ODL_PR0P (CSRCtrl) [ιd(D ] BSTR DataBase; [ιd(2) ] BSTR User; [id (3) ] BSTR Context; [id (4)] short Mode; [ιd(5)] short OpenAttr; [ιd(8)] boolean SaveCtx; //) )AFX_ODL_PROP methods : // NOTE - ClassWizard will maintain method information here. // Use extreme caution when editing this section. //( (AFX_ODL_METHOD (CSRCtrl) [id (10)] void ShowProperties ( ) ; [ιd(ll)] long RecAcqWaveBuffer (BSTR lpBuffer, long dwLength) ; [ id ( 12 ) ] long RecGetState ( ) ; 575 [ιd(13)l BSTR GetWords (short Type, BSTR Class); [ιd(14)] long ActivateWorαs (short Type, BSTR Class, BSTR Words ) [ιd(15)] BSTR GetActiveWords ( ) ; [ιd(16) ] long Init ( ) ; [ιd(17) ] long Start () ; [id(18) ] long Stop ( ) ; [id (19) ] long Close ( ) ; [ιd(20)] long GetParamdong ParamType) ; [ιd(2D] long SetPara dong ParamType, long NewValue) ; [ιd(22)] long AddUserWord( BSTR Class, BSTR Word) ; [id(23)] long CtxActivate (boolean Activate); [ιd(24)] long DictClose (boolean SaveChanges ) ; [ιd(25)] long DictCopy (BSTR Language, BSTR DictSrc, BSTR DictDest ) [id(26)] long DictCreate (BSTR Language, BSTR Dictionary); [id(27)] long DictDelete (BSTR Language, BSTR Dictionary); [id(28)] long DictDeleteException (BSTR Word) ; [id(29>] VARIANT DictGetlnfo (short Type); [id(30)] BSTR DιctGetTranscπptιon(BSTR Word); [id(31)] long DictOpen (BSTR Language, BSTR Dictionary, short Attrib ) [id(32)] long DictRename (BSTR Language, BSTR DictSrc, BSTR DictDest) ; [id(33)] long DbCloseO ; [id(34)] long DbCreate (BSTR DbName, BSTR Path); [id (35)] long DbDelete (BSTR DbName); [ιd(36)] long DbExport (short Type, BSTR LangOrUser, BSTR Name, BSTR Path) ; [id(37>] VARIANT DbGetCaps (BSTR Environment, long Type); [ιd(38)] VARIANT DbGetlnfo (short Type); [id(39)] long DbGetParamlnfo ( ) ; [id (40)] long Dblnstall (BSTR SetupFile, long hWnd) ; [id(41) ] BSTR DbListf) ; [id (42)] long DbOpen(BSTR DbName); [id(43>] long DbUnlnstall (short Type, BSTR ObjectName) ; [id (44)] long RecAcqClose ( ) ; [id (45)] short RecAcqGetSignalLevel ( ) ; [id(46)] long RecAcqOpenEx (short WaveFormlndex, short Type) [ιd(47)] long RecBreakO; [ιd(48)] long RecCloseO; [ιd(49)] long RecSetMode (short NewMode); 576 [ιd(50)] long UsrCopy(BSTR UserSrc, BSTR UserDest); [ιd(5D] long UsrEnable (BSTR UserName, BSTR Language, short Type) ; [ιd(52)] long UsrCreate (BSTR UserName); [ιd(531] long UsrDelete (BSTR UserName); [ιd(541] VARIANT UsrGetlnfo (BSTR UserName, short Type); [ιd(55)] long Usrlndependent (BSTR UserName, BSTR Language) ; [ιd(56>] long UsrRegister (BSTR User, short Type, BSTR Name) ; [ιd(57)] long UsrRename (BSTR OldName, BSTR NewName) ; [ιd(58)] long UsrUnregister (BSTR User, short Type, BSTR Name) ; [ιd(591] long CtxClose (boolean Save); [ιd(60)] long CtxCopy(BSTR SrcUser, BSTR SreContext, BSTR DestUser, BSTR DestContext) ; [ιd(6D] long CtxCreate (BSTR User, BSTR Language, BSTR Syntax, BSTR Context) ; [ιd(621] long CtxDelete (BSTR User, BSTR Context); [ιd(63)] long CtxDeleteWord (BSTR Class, BSTR Word); [ιd(64)] long CtxExport (BSTR User, BSTR Format, BSTR Context) ; [ιd(651] long CtxOpen(BSTR User, BSTR Context, short Attrrib) ; [ιd(661] long CtxRename (BSTR User, BSTR OldCtx, BSTR NewCtx) ; [ιd(67)] long WaitForEvent (BSTR Map, short tιme_100ms, long dwFlags ) ; [ιd(68)] short GetNbrPhrases () ; [ιd(69)] BSTR GetPhrase (short PhraseNbr) ; [ιd(70)] short GetPhraseConfLevel (short PhraseNbr); //} }AFX ODL METHOD [ιd(DISPID ABOUTBOX) ] void AboutBox ( ) ; ); // Event dispatch interface for CSRCtrl [ uuιd(528C0222-72EC-HD0-A6CE-0040332D01C5) , helpstrmg ("Event interface for SR Control") ] disp terface _DSREvents ( properties : 577 / / Event interface has no properties methods : // NOTE - ClassWizard will maintain event information here . // Use extreme caution when editing this section. //( (AFX_ODL_EVENT (CSRCtrl) [id(D] void Result(BSTR BestUtterance, short BestConfidence, short nbrUtterances) ; [id(2)] void RecErrordong id, BSTR ErrorStrmg); [id (3)] void ChangeState (short NewState); //) )AFX_ODL_EVENT 1; // Class information for CSRCtrl [ uuid(528C0223-72EC-HD0-A6CE-0040332D01C5) , helpstrmg ("Speech recognition OLE Control"), control ] coclass SR ! [default] dispinterface _DSR; [default, source] dispinterface _DSREvents; }; //{ (AFX APPEND ODL) ) 578 / /Microsoft Developer Studio generated resource s cript . / / #include "resource. h" #define APSTUDIO_READONLY_SYMBOLS inn /in / III m III ii i minimum 11 mi in III 11 mi/linn im minim I II II Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" /III /III I Hill lllll I III I #undef APSTUDIC_READONLY_SYMBOLS iiiiii/ii/m inii/i/mimmimiii i in i mil mmii/i/mi mm/mm I II English (U.S.) resources #if I defined (AFX_RESOURCE_DLL) II defined (AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US ipragma code_page (1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED II II I III I III l/ i I I lllll 11 in i mum I II II TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource. \0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include " "af xres . h""\r\n" "\0" END 579 3 TEXTINCLUDE DI SCARDABLE BEGIN " 1 TYPELIB " "NewSR . tib " " \ r\n " " \ 0 " END #endlf // APSTUDIO INVOKED #ifndef _MAC //////////////////////////////////////////////////////////////////////////// / // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS OxlL #else FILEFLAGS OxOL #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE OxOL BEGIN BLOCK "StnngFilelnfo" BEGIN BLOCK "040904B0" BEGIN VALUE "CompanyName", "\0" VALUE "FileDescription", "NewSR OLE Control Module\0" VALUE "FileVersion", "1, 0, 0, 1\0" VALUE "InternalName", "NEWSR\0" VALUE "LegalCopyπght", "Copyright © 1997\0" VALUE "LegalTrademarks", "\0" VALUE "OrigmalFilename", "NEWSR. OCX\0" VALUE "ProductName", "NewSR OLE Control Module\0" 580 VALUE "ProouctVersion", "1, 0, 0, 1\0" END END BLOCK "VarFilelnfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endιf // ' MAC I II I III IIII/I//I/I/II/I//I III Hll III III/ ///III Ill/Ill I II III I III III I II I II II Icon // // Icon with lowest ID value piaced first to ensure application icon // remains consistent on all systems. IDI_ABOUTDLL ICON DISCARDABLE "SpRecico" IDI_SRICON ICON DISCARDABLE "iconl.ico" /////// Ill/Ill II lllll II III III/ 1 III llll III II I II II Bitmap // IDB_SR BITMAP DISCARDABLE "SpRecCtl.bmp" //////////////////////////////////////////////////////////////////////////// / // // Dialog // IDD_ABOUTBOX_SR DIALOG DISCARDABLE 34, 22, 260, 55 STYLE DS_MODALFRAME I WS_POPUP I WS_CAPTION I WS_SYSMENU CAPTION "About SpRec Control" FONT 8, "MS Sans Serif" BEGIN ICON IDI_ABOUTDLL,IDC_STATIC, 10, 10, 18,20 581 LTEXT " Speech Recognition OLE Control , Version 1 . 0 " , IDC_STATIC , 40 , 10 , 170 , 8 LTEXT "Copyright © 1997, Creator, Israel", IDC STATIC, 40, 25, 170, DEFPUSHBUTTON "OK", IDOK, 221, 7, 32, 14 , WS GROUP END IDD_PARAMINFO DIALOG DISCARDABLE 0, 0, 250, 110 STYLE WSJ-HILD FONT 8, "MS Sans Serif" BEGIN LISTBOX IDC LIST1,13,8,120,63,LBS NOINTEGRALHEIGHT WS VSCROLL WSJTABSTOP LTEXT "", IDC_DESCRIPTION, 12, 96,237, 10 LTEXT "**,IDC_MIN,15,73,20,8 LTEXT "",IDC_MAX,101,73,19,8 LTEXT "",IDC_CURRENT,79,73,20,8 CONTROL "Slιderl",IDC_SLIDERl, "msctls_trackbar32", TBSJ30TH TBS_NOTICKS I WSJTABSTOP, 12, 83, 102, 9 PUSHBUTTON "",IDC_DEFAULTVALUE,115,82,21,13 LTEXT "Current value", IDC TRANSFER, 37, 73, 39, 8 END IDD_PROPPAGE_SR DIALOG DISCARDABLE 0, 0, 250, 110 STYLE WS_CHILD FONT 8, "MS Sans Serif" BEGIN COMBOBOX IDC_DATABASE,7, 18,77, 85, CBS_DROPDOWNLIST | WS_VSCROLL I WSJTABSTOP LTEXT "Data base" , IDCJTRANSFER2, 26, 7, 35, 9 COMBOBOX IDCJJSER, 86, 18, 77, 85, CBS_DROPDOWNLIST I WSJ/SCROLL I WSJTABSTOP LTEXT "User" , IDCJTRANSFER2,113,7,18,9 COMBOBOX IDC_CONTEXT, 165, 18, 77,85, CBS_DROPDOWNLIST I WSJ/SCROLL | WSJTABSTOP LTEXT "Context", IDCJTRANSFER2, 188, 7,25, 9 COMBOBOX IDC_MODES,7,48,80, 85, CBS_DROPDOWNLIST I WS_VSCROLL I WSJTABSTOP LTEXT "Recognition open mode", IDCJTRANSFER2 , 7, 36, 78, 9 582 COMBOBOX IDC_ATTRIB, 89 , 48 , 74 , 85 , CBS_DROPDOWNLIST I WS_VSCROLL WS_TABSTOP LTEXT "Context access attribute" , IDC TRANSFΞR2, 89, 36, 82, 9 END IDD_ACQPROPPAGE DIALOG DI SCARDABLE 0 , 0 , 250 , 110 STYLE WS_CHILD FONT 8 , "MS Sans Serif " BEGIN GROUPBOX " Acquisition channel open mode " , IDC_WAVEDEV, 7 , 7, 124 , 96 CONTROL "WAVE format", IDC WAVEFORMAT, "Button" , BS AUTORADIOBUTTON WS_GROUP, 12, 17, 51, 11 CONTROL "Device ID" , IDC_DEVICEID, "Button" , BS_AUTORADIOBUTTON, 68 , 17,41,11 COMBOBOX IDC WAVELIST, 11, 30, 117, 73, CBS DROPDOWNLIST | WS VSCROLL WS_GROUP GROUPBOX " Type of acquisition ", IDC_ACQ, 133, 7, 110, 22, WS_DISABLED CONTROL "Real time", IDC_REALTIME, "Button", BS_AUTORADIOBUTTON | WS_DISABLED I WSJSROUP, 136, 17 , 40, 11 CONTROL "Not real time", IDC_NONREALTIME, "Button", BS_AUTORADIOBUTTON | WS_DISABLED, 191, 17 , 48 , 11 EDITTEXT IDC_DESCRIPTION, 11, 47, 117, 53, ES_MULTILINE I ES_AUTOVSCROLL | ES_AUTOHSCROLL I ES_READONLY I WS VSCROLL END in i ii i i/m 11 ii i ii 11 ii i m iimnniiiuiii i m im in imimmii I II I I DESIGNINFO / / #lfdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_ABOUTBOX_SR, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 253 TOPMARGIN, 7 583 BOTTOMMARGIN , 48 END IDD_PARAMINFO, DIALOG BEGIN RI GHTMARGIN , 249 TOPMARGIN , 1 BOTTOMMARGIN, 108 END IDD_PROPPAGE_SR, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 243 TOPMARGIN, 7 BOTTOMMARGIN, 103 END IDD_ACQPROPPAGE, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 243 TOPMARGIN, 7 BOTTOMMARGIN, 103 END END #endif // APSTUDIO INVOKED immii/mimmimmiimi/iiiii/imimiiiiiiiiiiiiiiii/iiiiiiiiiii I II II String Table // STRINGTABLE DISCARDABLE BEGIN IDS_SR "SR Control" IDS_SR_PPG "SR Property Page" END STRINGTABLE DISCARDABLE BEGIN 584 I DS_SR_PPG_CAPTION "General" I DS_PARAM_CAPTION "Parameters" IDS ACQ "Acquisition cnannel' END #endιf // Englisn (U.S.) resources 11 III II I III II II/III///I//IIII I #ι fndef APSTUDIO_INVOKED i iiii/iiiiiii/iimmimimimiiiiiimiiiim iiiii/miiiimiiii/iiiii l II 11 Generated from the TEXTINCLUDE 3 resource. // 1 TYPELIB "NewSR.tlb" //////////////////////////////////////////////////////////////////////////// / #endιf // not APSTUDIO INVOKED 585 / / PrmPrpPg . cpp : implementation f le / / #ιncluoe "stdafx . h " #mclude "NewSR. h " #mclude " PrmPrpPg . h" #ιnclude "SRCtl . h" #ιfdef _DEBUG #defme new DEBUG_NEW #undef THIS_FILE static char THIΞ_FILE [ ] = FILE ; #endif iiiimiiiim/m mi iimmimiim/iiii iiii/im imiiiiii/iiiii/ii/m I II CPrmPrpPg dialog IMPLEMENT_DYNCREATE (CPrmPrpPg, COlePropertyPage) ini/i inm // 1! ιι i ii i iii/imi i mini 11 ii/nmiiii/ii miiiiiii III I II Message map BEGIN_MESSAGE_MAP (CPrmPrpPg, COlePropertyPage) //( {AFX_MSG_MAP (CPrmPrpPg) 0N_LBN_SELCHANGE(IDC_LIST1, OnSelchangeListl ) 0N_WM_HSCROLL ( ) ON_BN_CLICKED (IDC_DEFAULTVALUE, OnDefaultvalue) //) }AFX_MSG_MAP END MESSAGE MAP ( ) I III 11 I mum 11 III II I II Initialize class factory and guid // (528C0229-72EC-11D0-A6CE-0040332D01C5) IMPLEMENT_OLECREATE_EX (CPrmPrpPg, "NewSR. CPrmPrpPg" , 0x528c0229, 0x72ec, OxlldO, 0xa6, Oxce, 0x0, 0x40, 0x33, 0x2d, 0x1, 0xc5) 586 / / 1 / 11 m 11 / / / / / / nm im m / 1 m m / 111 / / // / // / / / 1 / / 1 / / 1 m // m // III ///// I 1/ CPrmPrpPg: : CPrmPrpPgFactory: : UpdateRegistry - // Adds or removes system registry entries for CPrmPrpPg BOOL CPrmPrpPg: : CPrmPrpPgFactory :: UpdateRegistry (BOOL bRegister) ( // TODO: Define string resource for page type; replace '0' below with ID. if (bRegister) return AfxOleRegisterPropertyPageClass (AfxGetlnstanceHandle ( ) , m_clsid, IDS_SR_PPG) ; else return AfxOleUnregisterClass (m clsid, NULL) ; III! I II I III III III lllll III III I III I II III III! I I II CPrmPrpPg: : CPrmPrpPg - Constructor // TODO: Define string resource for page caption; replace '0' below with ID. CPrmPrpPg : : CPrmPrpPg ( ) : COlePropertyPage (IDD, IDS_PARAM_CAPTION) f //( (AFX_DATA_INIT (CPrmPrpPg) //) )AFX_DATA_INIT ParamInfc=NULL; ) CPrmPrpPg : : -CPrmPrpPg ( ) ( i f ( Paramlnfo ) f ree ( Paramlnfo ) ; ( nm i / miiimm/imm miii/iim/iiim iiiiiiimmmiiiii/ I I I CPrmPrpPg: : DoDataExchange - Moves data between page and properties 587 void CPrmPrpPg: : DoDataExcnange (CDataExchange* pDX) ( // NOTE: ClassWizard will add DDP, DDX, and DDV calls here // DO NOT EDIT what you see in these clocks of generated code ' // ( (AFX_DATA_MAP (CPrmPrpPg) DDX_Control (pDX, IDC_DEFAULTVALUE, πjSetDef) ; DDX_Control (pDX, IDC_SLIDER1, m_Slιder) ; DDX_Control (pDX, IDC_CURRENT, m_CurrentValue) ; DDX_Control(pDX, IDC_MIN, m_Mm) ; DDX_Control(pDX, IDC_MAX, m_Max) ; DDX_Control(pDX, IDC_DESCRIPTION, m_Descπptιon) ; DDX_Control (pDX, IDC_LIST1, m_Params); DDP_CBIndex(pDX, IDC_TRANSFER, m_Control, "Control"); // } )AFX_DATA_MAP DDP_PostProcessιng(pDX) ; BOOL CPrmPrpPg: : OnlnitDialog () { DWORD size; LPSTR Buffer; HCURSOR SaveCursor; SaveCursor=SetCursor (AfxGetApp ( ) ->LoadStandardCursor (IDC_WAIT) COlePropertyPage: : OnlnitDialog ( ) ; HDB hDb; HASR hAsr; asrDbList (NULL, size); Buffer= (LPSTR) malloc ( size) ; asrDbList (Buffer, Ssize); hDb=asrDbOpen(Buffer) ; if (Buffer) free (Buffer) ; hAsr=asrRecOpen(hDb, "Win32", NULL, NULL, NULL); ASRERROR err=asrRecGetParamInfo (hAsr, NULL, Ssize); ParamInfo=(PPARAMINFOLIST) malloc (size) ; err=asrRecGetParamInfo (hAsr, Paramlnfo, Ssize); fordnt ι=0 ;KParamInfo->nbrOf Params ;ι++) ( m_Params.InsertStπng(-l, (Paramlnf o->ιnfo) [i] .szName) ; ) m_Params . SetCurSel ( 0 ) ; OnSelchangeListl ( ) ; if (hAsr>ASRERR_MAXERR) 588 riii /iL y s / u asrRecClose (hAsr , , if (hDb>ASRERR_MAXERR) asrDbClose (hDb) ; SetCursor ( SaveCursor) ; return FALSE; void CPrmPrpPg: : OnSelchangeListl ( ) ( char buffer[50] ; CSRCtrl* Control=(CSRCtrl* )m_Control; DWORD value, sιze=sιzeof (DWORD) ; π j Descnption. SetWmdowText ( ( Paraminfo->ιnfo) [m_Params .GetCurSel ( ) ] .sz Description) ; sprintf (buffer, "%d", (ParamInfo->ιnfo) (m_Params .GetCurSel () ] . Range. Default) ; m_SetDef .SetWmdowText (buffer) ; sprintf (buffer, "%d", ( Paraminfo->ιnfo) [m_Params .GetCurSel ( ) ] . Range.Maximum) ; m_Max. SetWmdowText (buffer) ; sprintf (buffer, "%d", (ParamInfo->ιnfo) [m_Params .GetCurSel ( ) ] . Range.Minimum) ; m_Mm. SetWmdowText (buffer) ; value=Control->PersιstProp->Parameters [m_Params . GetCurSel ( ) ] ; sprintf (buffer, "%d", value); m_CurrentValue. SetWmdowText (buffer) ; m_Slιder. SetRangeMm ( (Paraminfo->ιnfo) [m_Params .GetCurSel ( ) ] .Range.Mm lmum) ; m_Slιder.SetRangeMax( (Paraminfo->mfo) [m_Params . GetCurSel ( ) ] .Range.Max lmum) ; m_Slιder . SetPos (value) ; m_Slιder . SetTicFreq ( 1) ; m_Slιder. SetPageSize (1) ; void CPrmPrpPg: :OnHScroll (UINT nSBCode, UINT nPos, CScrollBar * pScrollBar) ( CSRCtrl* Control= (CSRCtrl* )m_Control; DWORD sιze=sιzeof (DWORD) ; char buffer [10] ; DWORD nAsrPos; Control->SetModιfledFlag ( ) ; nAsrPos=Control->PersιstProD->Parameters [m Params . GetCurSel ( ) ] ; 589 switch (nSBCode ( case SB_PAGELEFT: nPos=nAsrPos ; nPos-=m_Slιder.GetPageSιze ( ) ; break; case SB_PAGERIGHT: nPos=nA≤rPos; nPos+=m_Slιder.GetPageSιze ( ) ; break; case SBJTHUMBTRACK: break; default: return; } Control->PersιstProp->Parameters [π j Params . GetCurSel ( ) ] =nPos ; sprintf (buffer, "%d", nPos); m_CurrentValue. SetWmdowText (buffer) ; COlePropertyPage: :OnHScroll (nSBCode, nPos, pScrollBar); void CPrmPrpPg: :OnDefaultvalue() ! CSRCtrl* Control=(CSRCtrl* )m_Control; char buffer [10] ; Control->SetModιfledFlag ( ) ; sprintf (buffer, "%d", (Paraminfo->ιnfo) [m_Params .GetCurSel () ] . Range. Default) ; m_CurrentValue. SetWmdowText (buffer) ; m_Slιder. SetPos ( ( Paraminfo->ιnfo) [m_Params . GetCurSel ( ) ] . Range. Default) Control->PersιstProp->Parameters [m_Params . GetCurSel ( ) ] =m_Slιder . GetPos (); 590 #ιncluoe "stαafx.n" #mclude "NewSR.h" tfincluαe "ΞRCtl.h" #include "SRPpg.h" #mclude "PrmPrpPg.h" #ιnclude "AcqPropPage. h" # clude "asrapi.h" # clude "asrlOOO.h" #ifdef _DEBUG jtdefme new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = FILE ; #endif IMPLEMENT DYNCREATE (CSRCtrl, COleControl) I I III I I 1/ Message map BEGIN_MESSAGE_MAP (CSRCtrl, COleControl) //{ (AFX_MSG_MAP (CSRCtrl) ON_WM_CREATE ( ) ON_MESSAGE (ASRM_CONFIRM, OnConf irm) ON_MESSAGE(ASRM_ERROR, OnError) ON_MESSAGE(ASRM_GAINREQUEST, OnGamRequest) ON_MEΞSAGE(ASRM_PROGRESS, OnProgress) ON_MESΞAGE(ASRM_PROMPT, OnPrompt) ON_MESSAGE(ASRM_STATE, OnState) ON_MESSAGE (ASRM_TRAINEND, OnTramed) ON_MESSAGE(ASRM_UPDATE, OnUpdate) ON_MESSAGE (ASRM_NOTIFY, OnSRNotlf y) //) }AFX_MSG_MAP ON_OLEVERB ( AFX_IDS_VERB_PROPERTIES , OnProperties ) END_MESSAGE_MAP ( ) iiiiiiiiimn mii/ii/miiiiiiiiiimii i imiiiiiiiiiiiiiii im in in ii in I II Dispatch map 591 3EGIN_DI S PATCH_MAP ( CΞRCtr_ , COleControl ) / / ( { AFX_DI S ?ATCH_MAP ( CS RCt rl ) DIS P_PROPERTY_NOTI FY ( CSRCtrl , " DataBas e " , ir DataBase , OnDataBaseChanged , VT_BSTR ) DIS P_PROPERTY_NOTI FY ( CS RCtrl , "Us er " , mJJser , OnUs erChanged, VT_BSTR) DISP_PROPERTY_NOTIFY (CSRCtrl, "Context", πjContext, OnContextChanged, VT_BSTR) DISP_PROPERTY_NOTIFY (CSRCtrl, "Mode", m_Mode, OnModeChanged, VT_I2) DISP_PROPERTY_NOTIFY(CSRCtrl, "OpenAttr", m_OpenAttr, OnOpenAttrChanged, VT_I2) DISP_PROPERTY_NOTIFY(CSRCtrl, "XAcqMode", πjXAcqMode, OnXAcqModeChanged, VT_I4) DISP_PROPERTY_NOTIFY( CSRCtrl, "XWavelndex", m_XWaveIndex, OnXWavelndexChanged, VT_I4) DISP_PROPERTY_NOTIFY (CSRCtrl, "SaveCtx", m_SaveCtx, OnSaveCtxChanged, VT_BOOL) DISP_PROPERTY_NOTIFY (CSRCtrl, "Control", m_control, OnControlChanged, VT_I4) DISP_FUNCTION (CSRCtrl, "ShowProperties ", ShowProperties, VT_EMPTY, VTS_NONE) DISP_FUNCTION (CSRCtrl, "RecAcqWaveBuffer", RecAcqWaveBuffer, VT_I4, VTS_BSTR VTS_I4) DISP_FUNCTIO (CSRCtrl, "RecGetState", RecGetState, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "GetWords", GetWords, VT_BSTR, VTS_I2 VTS_BSTR) DISP_FUNCTION (CSRCtrl, "ActivateWords ", ActivateWords , VT_I4, VTS_I2 VTS_BSTR VTS_BSTR) DISP_FUNCTIO (CSRCtrl, "GetActiveWords " , GetActiveWords , VT_BSTR, VTS_NONE) DISP_FUNCTION (CSRCtrl, "Init", Init, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "Start", Start, VT_I4, VTSJNONE) DISP_FUNCTION (CSRCtrl, "Stop", Stop, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "Close", Close, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "GetParam", GetPara , VT_I4, VTS_I4) DISP_FUNCTION (CSRCtrl, "SetParam", SetParam, VT_I4, VTS_I4 VTS_I4) DISP_FUNCTION (CSRCtrl, "AddUserWord" , AddUserWord, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "CtxActivate", CtxActivate, VT_I4, VTS_BOOL ) DISP_FUNCTION (CSRCtrl, "DictClose", DictClose, VT_I4, VTS_BOOL) DISP_FUNCTION (CSRCtrl, "DictCopy", DictCopy, VT_I4, VTS_BSTR VTS BSTR VTS BSTR) 592 DISP_FUNCTION (CSRCtrl, "DictCreate" , DictCreate, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DictDelete", DictDelete, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DictDeleteException", DictDeleteException, VT_I4, VTS_BSTR) DISP_FUNCTIO (CSRCtrl, "DictGetlnfo" , DictGetlnfo, VT_VARIANT, VTS_I2) DISP_FUNCTIO (CSRCtrl, "DictGetTranscription" , DictGetTranscπption, VT_BSTR, VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DictOpen", DictOpen, VT_I4, VTS_BSTR VTS_BSTR VTS_I2) DISP_FUNCTIO (CSRCtrl, "DictRename", DictRename, VT_I4, VTS_BSTR VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DbClose", DbClose, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "DbCreate", DbCreate, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DbDelete", DbDelete, VT_I4, VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DbExport", DbExport, VT_I4, VTS_I2 VTS_BSTR VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DbGetCaps", DbGetCaps, VT_VARIANT, VTS_BSTR VTS_I4) DISP_FUNCTION (CSRCtrl, "DbGetlnfo", DbGetlnfo, VT_VARIANT, VTS_I2) DISP_FUNCTION (CSRCtrl, "DbGetParamlnfo", DbGetParamlnfo, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "Dblnstall", Dblnstall, VT_I4, VTS_BSTR VTS_I ) DISP_FUNCTION (CSRCtrl, "DbLlst", DbLlst, VT_BSTR, VTS_NONE) DISP_FUNCTION (CSRCtrl, "DbOpen", DbOpen, VT_I4, VTS_BSTR) DISP_FUNCTION (CSRCtrl, "DbUnlnstall" , DbUnlnstall, VT_I4, VTS_I2 VTS_BSTR) DISP_FUNCTION (CSRCtrl, "RecAcqClose" , RecAcqClose, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "RecAcqGetSignalLevel", RecAcqGetSignalLevel, VT_I2, VTS_NONE) DISP_FUNCTION (CSRCtrl, "RecAcqOpenEx" , RecAcqOpenEx, VT_I4, VTS_I2 VTS_I2) DISP_FUNCTIO (CSRCtrl, "RecBreak", RecBreak, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "RecClose", RecClose, VT_I4, VTS_NONE) DISP_FUNCTION (CSRCtrl, "RecSetMode" , RecSetMode, VT_I4, VTS_I2) DISP_FUNCTION (CSRCtrl, "UsrCopy", UsrCopy, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "UsrEnable", UsrEnable, VT_I4, VTS_BΞTR VTS_BSTR VTS_I2) DISP_FUNCTION (CSRCtrl, "UsrCreate", UsrCreate, VT_I4, VTS_BSTR) 593 DISP_FUNCTIO (CSRCtrl, "UsrDelete", UsrDelete, VT_I4, VTS_BSTR) DISP_FUNCTICN (CSRCtrl, "UsrGetlnfo", UsrGetlnfo, VT_VARIANT, VTS_BSTR VTS_I2) DISP_FUNCTIO (CSRCtrl, "Usrlndependent" , Usrlndependent, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "UsrRegister", UsrRegister, VT_I4, VTS_BSTR VTS_I2 VTS_BΞTR) DISP_FUNCTION (CSRCtrl, "UsrRename", UsrRename, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "UsrUnregister", UsrUnregister, VT_I4, VTS_BSTR VTS_I2 VTS_BSTR) DISP_FUNCTION (CSRCtrl, "CtxClose", CtxClose, VT_I4, VTS_BOOL) DISPJTUNCTION (CSRCtrl, "CtxCopy", CtxCopy, VT_I4, VTS_BSTR VTS_BSTR VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "CtxCreate", CtxCreate, VT_I4, VTS_BSTR VTS_BSTR VTS_3STR VTS_BSTR) DISP_FUNCTION( CSRCtrl, "CtxDelete", CtxDelete, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "CtxDeleteWord", CtxDeleteWord, VT_I4, VTS_BSTR VTS_BSTR) DISP_FUNCTION (CSRCtrl, "CtxExport", CtxExport, VT_I4, VTS_BSTR VTS_BSTR VTS_BSTR) DISP_FUNCTIO (CSRCtrl, "CtxOpen", CtxOpen, VT_I4, VTS_BSTR VTS_BSTR VTS_I2) DISP_FUNCTION (CSRCtrl, "CtxRename", CtxRename, VT_I4, VTS_BSTR VTS_BSTR VTS_BSTR) DISP_FUNCTIO (CSRCtrl, "WaitForEvent", WaitForEvent, VT_I4, VTS_BSTR VTS_I2 VTS_I4) DISP_FUNCTIO (CSRCtrl, "GetNbrPhrases" , GetNbrPhrases , VT_I2, VTS_NONE) DISP_FUNCTION (CSRCtrl, "GetPhrase", GetPhrase, VT_BSTR, VTS_I2) DISP_FUNCTION (CSRCtrl, "GetPhraseConfLevel", GetPhraseConfLevel, VT_I2, VTS_I2) //) )AFX_DISPATCH_MAP DISP_FJNCTION_ID (CSRCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP ( ) iiiiiiiiimii I II Event map 3EGIN_EVENT_MAP ( CSRCtrl , COleControl ) 594 //( {AFX_EVENT_MAP (CSRCtrl! EVENT_C * 3T0M( "Result", FireResuit, VTS_BSTR VTS_I2 VTS_I2) EVENT_C STOM("RecError", FireRecError, VTS_I4 VTS_BSTR) EVENT_C * JSTCM("ChangeState", FireChangeState, VTS_I2) // ) )AFX_EVENT_MAP END EVENT MAP ( ) //////////////////////////////////////////////////////////////////////////// / // Property pages // TODO: Add more property pages as needed. Remember to increase the count I BEGIN_PROPPAGEIDS (CSRCtrl, 3 ) PROPPAGEID(CSRPropPage: :guid) PROPPAGEID(CPrmPrpPg: :guιd) PROPPAGEID ( CAcqPropPage : : guid) END PROPPAGEIDS (CSRCtrl) ////////////////////// I 11 I II Initialize class factory and guid IMPLEMENT_OLECREATE_EX (CSRCtrl, "NEWSR. SRCtrl .1", 0x528c0223, 0x72ec, OxlldO, 0xa6, Oxce, 0, 0x40, 0x33, 0x2d, 0x1, 0xc5) 1 II 11 I I I I Type library ID and version IMPLEMENT OLETYPELIB ( CSRCtrl , tlid, _wVerMaτ or, _wVerMmor ) iiiiiiimi m mmmiimmmmmmi/iiiiii mi iiiinii/iiiiiiiiiii i I I / Interface IDs const IID BASED_CODE IID_DSR = ( 0x528c0221, 0x72ec, OxlldO, ! 0xa6, Oxce, 0, 0x40, 0x33, 0x2d, 0x1, 0xc5 ) ); 595 const I D BASED_CODE IID_DSREvents = ( 0x528c0222, 0x72ec, OxlldO, { 0xa6, Oxce, 0, 0x40, 0x33, 0x2d, 0x1, 0xc5 ) ); m/i/i/im m/i/imii/mmiim mιmιιιι//m/ιι/ιιιιι/ι/ι/ιιιι//ιι/ι I II Control type information static const DWORD BASED_CODE _dwSR01eMιsc = // OLEMISC_INVISIBLEATRUNTIME I OLEMISC_SETCLIENTSITEFIRST I OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE I OLEMISC_RECOMPOSEONRESIZE; IMPLEMENT OLECTLTYPE (CSRCtrl, IDS SR, dwSROleMlsc) ///// in inn iimmimiimm i iimmimiiiimiiiiiiiiiii/iii I II CSRCtrl: : CSRCtrlFactory: : UpdateRegistry - // Adds or removes system registry entries for CSRCtrl BOOL CSRCtrl: : CSRCtrlFactory: : UpdateRegistry (BOOL bRegister) { if (bRegister) return AfxOleRegisterControlClass ( AfxGetlnstanceHandle ( ) , m_clsιd, m_lpszProgID, IDS_SR, IDB_SR, FALSE, // Not sertable _dwSR01eMιsc, _tlιd, _wVerMa^or, _wVerMmor) ; else return AfxOleUnregisterClass (m_clsιd, m_lpszProgID) ; 596 IIIII mi/i i // // mil m IIIII i m nm i ii m i / 1 ii / 1 ii / mm/ i/miiim/iii / II CSRCtrl: : CSRCtrl - Constructor CSRCtrl: : CSRCtrl () ( InitializellDs (SIID_DSR, SIID_DSREvents ) ; SetInιtιalSize(32, 32); PWaveFormats=NULL; SR.hDb=0; SR.hAsr=0; SR.hCtx=0; SR.hDιct=0; LastResult=NULL; SuppProp=NULL; SuppPropDef=NULL; m_Mode=0 ; m_OpenAttr=0; m_SaveCtx=FALSE; m_XAcqMode=DISP_DEVICEID; m_XWaveIndex=0; m_control= (long) this ; ) iiiiimiim i /mmmiiiiiiim/i mi III i mi nm ii miiiiimi/ I II CSRCtrl: : -CSRCtrl - Destructor CSRCtrl : : -CSRCtrl ( ) ! if (PWaveFormats) free (PWaveFormats) ; if (SuppProp) GlobalFree (SuppProp) ; if (SuppPropDef) GlobalFree (SuppPropDef) ; ) 597 /// 1 II I II 117711 III II I III 11111111111 II 111 II II Ill/Ill I I III Ill/Ill 111 I II CSRCtrl: :OnDraw - Drawing function void CSRCtrl: :OnDraw( CDC* pdc, const CRectS rcBounos, const CRectS rclnvalid) ( pdc->DrawIcon (rcBounds .left, rcBounds . top, ( (CNewSRApp*) AfxGetApp () )->SRIcon) ; ) //////////////////////////////////////////////////////////////////////////// / // CSRCtrl: : DoPropExehange - Persistence support void CSRCtrl: : DoPropExehange (CPropExchange* pPX) ! ExchangeVersιon(pPX, MAKELONG (_wVerMmor, _wVerMaιor) ) ; COleControl: : DoPropExehange (pPX) ; PrePropExchange(pPX) ; PX_Stnng(pPX, "DataBase", m_DataBase, πjDataBase) ; PX_Strmg(pPX, "User", m_User, m_User) ; PX_Stπng(pPX, "Context", m_Context, m_Context); PX_Short (pPX, "Mode", rt j Mode, m_Mode); PX_Short (pPX, "OpenAttr", m_OpenAttr, m_OpenAttr); PX_Bool(pPX, "SaveCtx", π j SaveCtx, m_SaveCtx) ; PX_Long(pPX, "XWavelndex", m_XWaveIndex, πjXWavelndex) ; PX_Long(pPX, "XAcqMode", m_XAcqMode, m_XAcqMode); PX_Blob(pPX, "", SuppProp, SuppPropDef); PostPropExchange (pPX) ; I I II CSRCtrl: :OnResetState - Reset control to default state void CSRCtrl: : CnResetState ( ) ! InitDefaults ( ) ; 598 COleControl : : OnResetState ( ) ; / / Resets defaults found in DoPropExehange minimi ii i //ιιιιι/ιιιιιι/ιιmι/ιιι/ιιιι/////ι/ιιιι mm i/iim/mii 11 I 1/ CSRCtrl: :AboutBox - Display an "About" box to the user void CSRCtrl: :AboutBox ( ) ! CDialog dlgAbout (IDD_ABOUTBOX_SR) ; dlgAbout . DoModal ( ) ; ) iii/i/m mi in iimmmi/i/miiiimii/m/iimiiiiiiiiiii ii I II CSRCtrl message handlers void CSRCtrl: :OnDataBaseChanged( ) { SetModifiedFlag ( ) ; } void CSRCtrl: : OnUserChanged ( ) ( SetModifiedFlag ( ) ; void CSRCtrl : : OnContextChanged ( ) ( SetMoαif ledFlag ( ) ; ) void CSRCtrl : : OnModeChanged ( ) ( SetModifiedFlag ( ) ; ) void CSRCtrl: : OnOpenAttrChanged ( ) ( SetModi fiedFlag ( ) ; 599 void CSRCtrl: : OnXAcqModeChangeo ( ) ( SetModifiedFlag ( ) ; ) void CSRCtrl: :OnXWaveIndexChanged ( ) ! SetModifiedFlag () ; 1 void CSRCtrl: : OnSaveCtxChanged ( ) { SetModifiedFlag ( ) ; // Messages processing LRESULT CSRCtrl: :OnConfιrm(WPARAM wParam, LPARAM IParam)! MessageBox("OnConfιrm") ; return 0L; ) LRESULT CSRCtrl: :OnError (WPARAM wParam, LPARAM IParam)! char errbuff [ASR_MAX_ERROR_LENGTH] ; DWORD size=sιzeof (errbuff) ; WORD BlockID LOWORD (IParam) ; WORD ErrCode HIWORD (IParam) ; asrRecGetErrorStrmgfSR.hAsr, BlockID, ErrCode, errbuff, Ssize) FireRecError (ErrCode, errbuff); return 0L; ) LRESULT CSRCtrl: : OnGamRequest (WPARAM wParam, LPARAM IParam) ( MessageBox ("OnGamRequest") ; return 0L; ) LRESULT CSRCtrl: :OnProgress (WPARAM wParam, LPARAM IParam)! MessageBox ( "OnProgress " ) ; return 0L; } LRESULT CSRCtrl: :OnPrompt (WPARAM wParam, LPARAM IParam)! MessageBo ( "OnPrompt") ; return 0L; 600 ) LRESULT CSRCtrl: :OnState (WPARAM wParam, LPARAM IParam) FireChangeState(LOWORD (IParam) ) ; return 0L; LRESULT CSRCtrl: :OnTrained (WPARAM wParam, LPARAM IParam)! MessageBox ( "OnTrained" ) ; return 0L; } LRESULT CSRCtrl: :OnUpdate (WPARAM wParam, LPARAM IParam)! MessageBox ("OnUpdate") ; return 0L; ) LRESULT CSRCtrl: :OnSRNotif (WPARAM wParam, LPARAM IParam)! LastResult=(LPASRRESULT) IParam; FireResult(LastResult->szzUtterances, * (LastResult->lpwConfidences) , LastResult->wN) ; m_WasResult=TRUE; return 0L; ) void CALLBACK ErrorCallback (HASR hAsr, WORD BlockID, ASRERROR ErrorlD)! //- void CSRCtrl: : SRCtrllnit ( ) ( HCURSOR SaveCursor; DWORD size; PPARAMINFOLIST Paramlnfo; SaveCursor=SetCursor (AfxGetApp ( ) ->LoadStandardCursor ( IDC_WAIT) CheckError (SR.hDb=asrDbOpen (m_DataBase) ) ; CheckErro (SR.hAsr=asrRecOpenEx(SR.hDb, "Win32", m_hWnd, ErrorCallback, NULL, NULL, 0) ) ; CheckError (asrRecSetMode (SR. hAsr, m_Mode) ) ; CheckError (SR.hCtx=asrCtxOpen(SR.hDb, mJJser, m_Context, m_OpenAttr) ) ; 601 i f ( S R . hDb>AS RERR_MAXERR ) { DWORD s i ze ; CheckError (asrDbGetlnfo (SR. hDb, ASRDBINFO_WAVEFORMATS, NULL, Ssize) ) ; PWaveFormats=(PWAVEFORMAT) malloc (size) ; CheckError (asrDbGetlnfo (SR. hDb, ASRDBINFO_WAVEFORMATS, PWaveFor ats, Ssize) ) ; asrRecGetParamlnfo (SR.hAsr, NULL, Ssize); ParamInfo=(PPARAMINFOLIST) malloc (size) ; asrRecGetParamlnfo (SR.hAsr, Paramlnfo, Ssize); for (int i=0;ι<ParamInfo->nbrOfParams ;i++) asrRecSetParam(SR.hAsr, ( Paraminfo->ιnfo) [1] .ParamType, S (PersιstProp->Parameters [l] ) , sizeof (DWORD) ) ; if (Paramlnfo) free (Paramlnfo) ; ASRACTIVATE AsrActιvate=( SR.hCtx, ""); CheckError (asrRecCtxActivate (SR.hAsr, SAsrActivate, 1) ) ; SetCursor (SaveCursor) ; return; void CSRCtrl : : ShowProperties ( ) ( OnProperties (NULL, NULL, NULL) ; ) long CSRCtrl: : RecStart ( ) ! LPWAVEFORMAT wf; WORD type; ASRERROR err; wf=PWaveFormats+m_XWaveIndex; switch (m_XAcqMode) ( case DISP_DEVICEID: wf= (LPWAVEFORMAT) m_XWaveInde ; type=WAVEDEVICE; break; case DISP_REALTIME: type=REALTIME; break; case DISP_NONREALTIME: type=NONREALTIME; 602 break ; ) CheckError (err=asrRecAcqOpenEx (SR.hAsr, wf, type)); CheckError (err=asrRecStart (SR.hAsr, m_hWnd, NULL)); return 0; long CSRCtrl: : RecStop ( ) ! ASRERROR err; CheckError ( err=asrRecBreak ( SR . hAsr) ) ; if ( err ! =ASRERR_OK) ( return err; } CheckError ( err=asrRecAcqClose (SR.hAsr) ) if (err'=ASRERR_OK) ( return err; ) return 0; long CSRCtrl: : RecGetState!) { ASRSTATE state; CheckError (asrRecGetState (SR.hAsr, Sstate) ) ; return state; ) ASRERROR CSRCtrl :: CheckError (long code) ! char errbuff [ASR_MAX_ERROR_LENGTH] ; DWORD sιze=sιzeof (errbuff) ; if (code<ASRERR_MAXERRSScode>0) { asrRecGetErrorStrmg (SR.hAsr, 0, code, errbuff, Ssize) FireRecError (code, errbuff); ) return code; int CSRCtrl: : PrePrcpExchange (CPropExchange* pPX) ( return 0; 603 int CSRCtrl : : ostPropExchange ( CPropExchange * pPX ) ( if (pPX->IsLoadιng ( ) ) ( PersιstProp=(PERSIST_PRROP*) (* ( (DWORD* ) SuppProp) ) ; ) return 0; void CSRCtrl: : InitDefaults () ( HDB hDb; HASR hAsr; PPARAMINFOLIST Paramlnfo; LPSTR Buffer; DWORD size; HCURSOR SaveCursor; SaveCursor=SetCursor (AfxGetApp ( ) ->LoadStandardCursor (IDC_WAIT) ) ; SuppPropDef=GlobalAlloc(GMEM_MOVEABLE, sizeof (PERSIST_PRROP) ) ; PersιstProp=(PERSIST_PRROP*) (*( (DWORD*) SuppPropDef) ) ; PersιstProp->dwMySelfSιze=sιzeof (PERSIST_PRROP) ; asrDbList (NULL, Ssize); Buffer= (LPSTR) malloc (size) , • asrDbList (Buffer, Ssize); hDb=asrDbOpen (Buffer) ; if (Buffer) free (Buffer) ; hAsr=asrRecOpen(hDb, "Win32", NULL, NULL, NULL) ; ASRERROR err=asrRecGetParamInfo (hAsr, NULL, Ssize); ParamInfo=( PPARAMINFOLIST) malloc (size) ; err=asrRecGetParamInfo (hAsr, Paramlnfo, Ssize); for (int i=0 ; KParamlnfo->nbrOfParams ; i++) PersistProp->Parameters [i] = ( Paraminfo->mfo) [1] . Range. Default ; if (Paramlnfo) free (Paramlnfo) ; if (hAsr>ASRERR_MAXERR) asrRecClose (hAsr) ; if (hDb>ASRERR_MAXERR) 604 as rDbClose ( hDb ) ; SetCursor ( SaveCursor j ; return ; BSTR CSRCtrl : : GetWords ( short Type, LPCTSTR Class ) ! CString strResuit; DWORD dwLength; LPSTR Buffer; CheckError (asrCtxGetWords (SR.hCtx, Type, Class, NULL, SdwLength)); Buffer=new char [dwLength] ; CheckError (asrCtxGetWords (SR.hCtx, Type, Class, Buffer, SdwLength)); MemChange (Buffer, '\0', '|', OxFFFFFFFF) ; strResult= (LPSTR) Buffer; delete Buffer; return strResuit .AllocSysString ( ) ; } int CSRCtrl: :MemChange (void* Buffer, char cO, char cl, DWORD dwLength)! LPSTR ptr; if (dwLength==OxFFFFFFFF) ( ptr= (LPSTR) Buffer; dwLength=0 ; while ( I (ptr[0]=='\0'SSptr[l]=='\0') ) ( ptr++; dwLength++; ) ) while (ptr=(LPSTR)memchr (Buffer, cO, dwLength)) *ptr=cl; return 0; 1 long CSRCtrl: :Init() ( SRCtrllnitO ; return 0; ) BOOL CSRCtrl: :OnSetExtent( LPSIZEL IpSizeL ){ return FALSE; 605 void CSRCtrl: : OnControiChangeα ι ) ( SetModifiedFlag () ; ) long CSRCtrl: : Start ( ) ! RecStart ( ) ; return 0; ) long CSRCtrl: : Stop ( ) ! RecStop ( ) ; return 0; ) long CSRCtrl: : Close () ( if (SR. hAsr>ASRERR_MAXERR) CheckError (asrRecBreak (SR.hAsr) ) ; if (SR. hAsr>ASRERR_MAXERR) CheckError (asrRecCtxActivate (SR.hAsr, NULL, 0) ) ; if (SR.hCtx>ASRERR_MAXERR) ( CheckError (asrCtxClose (SR.hCtx, m_SaveCtx) ) ; SR.hCtx=0; ) if (SR.hAsr>ASRERR_MAXERR) CheckError (asrRecAcqClose (SR.hAsr) ) ; if (SR.hAsr>ASRERR_MAXERR) { CheckError (asrRecClose (SR.hAsr) ) ; SR.hAsr=0; ) if (SR.hDb>ASRERR_MAXERR) ( CheckError (asrDbClose (SR. hDb) ) ; SR.hDb=0; ) return 0; 606 long CS RCtrl : : Ge tParam i long ParamType ) ( DWORD Value ; DWORD sιze=sιzeof (DWORD) ; CheckError ιasrRecGetParam(SR. hAsr, ParamType, SValue, size) ) ; return Value; long CSRCtrl: : SetParamdong ParamType, long NewValue) ! ASRERROR err=CheckError (asrRecSetParam(SR. hAsr, ParamType, SNewValue, sizeof (long) )) ; return err; 1 long CSRCtrl: :AddUserWord (LPCTSTR Class, LPCTSTR Word) { return CheckError (asrCtxAddUserWord (SR. hAsr, SR.hCtx, Class, Word, NULL, NULL) ) ; // Dictionary long CSRCtrl: : DictClose (BOOL SaveChanges) { return asrDictClose (SR.hDict, SaveChanges); ) long CSRCtrl: : DictCopy (LPCTSTR Language, LPCTSTR DictSrc, LPCTSTR DictDest) ( return asrDictCopy (SR.hDb, Language, DictSrc, DictDest); ) long CSRCtrl: : DictCreate (LPCTSTR Language, LPCTSTR Dictionary) ( return asrDictCreate (SR.hDb, Language, Dictionary); ) long CSRCtrl: : DictDelete (LPCTSTR Language, LPCTSTR Dictionary) ( return asrDictDelete (SR.hDb, Language, Dictionary); 607 long CSRCtrl: : DictDeleteExcεction (LPCTSTR Word) ! return asrDictDeleteException (SR. hDict, Word); ) VARIANT CSRCtrl: :DιctGetInfo (short Type) ( LPVOID Buffer; DWORD size; VARIANT vaResult; Variantlnit (SvaResult) ; asrDictGetlnfo (SR.hDict, Type, NULL, Ssize); Buffer=malloc (size) ; asrDictGetlnfo (SR.hDict, Type, Buffer, Ssize); if (Buffer) free (Buffer) ; return vaResult; } BSTR CSRCtrl: : DictGetTranscription (LPCTSTR Word) { LPVOID Buffer; DWORD size; CString strResuit; asrDιctGetTranscπptιon(SR.hDιct, Word, NULL, Ssize); Buffer=malloc(sιze) ; asrDιctGetTranscrιptιon(SR.hDιct, Word, Buffer, Ssize); strResult= (LPCSTR) Buffer; if (Buffer) free (Buffer) ; return strResuit.AllocSysStringf ) ; ) long CSRCtrl: : DictOpen (LPCTSTR Language, LPCTSTR Dictionary, short Attrib ) ( SR.hDιct=asrDιctOpen(SR.hDb, Language, Dictionary, Attrib ) ; return SR.hDict; long CSRCtrl: : DictRename (LPCTSTR Language, LPCTSTR DictSrc, LPCTSTR DictDest) ( return asrDictRename (SR. hDb, Language, DictSrc, DictDest ) ; 608 // DataBase long CSRCtrl: : DbClose () ! return asrDbClose (SR.hDb) ; ) long CSRCtrl: : DbCreate (LPCTSTR DbName, LPCTSTR Path) ! return asrDbCreate (DbName, Path); ) long CSRCtrl: : DbDelete (LPCTSTR DbName) ! return asrDbDelete (DbName) ; ) long CSRCtrl: : DbExport (short Type, LPCTSTR LangOrUser, LPCTSTR Name, LPCTSTR Path) { return asrDbExport (SR.hDb, Type, LangOrUser, Name, Path); 1 VARIANT CSRCtrl: : DbGetCaps (LPCTSTR Environment, long Type) ! VARIANT vaResult; Vaπantlnit (SvaResult) ; PENGINECAPS EngmeCaps ; DWORD size; asrDbGetCaps ( SR. hDb, (LPSTR) Environment , NULL, Ssize ) ; EngmeCaps= ( PENGINECAPS ( malloc ( size ) ; switch (Type ) ( case EC_SZENGINENAME: vaResult . vt=VT_BSTR; vaResult. bstrVal=CString (EngmeCaps->szEngmeName) .AllocSysString ( ) ; break; case EC_DWENVIRONMENTS: vaResult . vt=VT_I4 ; vaResult . lVal=EngιneCaps ->dwEnvιronments ; break; case EC_DWSEQUENCING : 609 vaResul . t=VT_I4 ; vaResul . !Val=EngιneCaps->dwSequencιng; break; case EC_DWLANGUAGECAPS : vaResult. vt=VT_I4 ; vaResult . !Val=EngineCaps->dwLanguageCaps ; break; case EC_DWUSERCAPS : vaResult . vt=VT_I4 ; vaResult. lVal=EngineCaps->dwUserCaps ; break; case EC_DWGRAMMARINSTCAPS : vaResult . vt=VT_I4 ; vaResult . lVal=EngineCaps->dwGrammarInstCaps ; break; case EC_DWMAXVOCAB : vaResul . vt=VT_I4 ; vaResult. !Val=EngineCaps->dwMaxVocab; break; case ECJDWMAXPERPLEXITY: vaResult . vt=VT_I4 ; vaResult . lVal=EngineCaps->dwMaxPerplexity; break; case EC_DWENGINEFEATURES : vaResult . vt=VT_I4 ; vaResult . lVal=EngineCaps->dwEngineFeatures ; break; case EC_SZZGRAMMARNAMES: vaResult. vt=VT_BSTR; MemChange (EngmeCaps->szzGrammarNames, *\0', '|', OxFFFFFFFF) ; vaResult.bstrVal=CString(EngineCaps->szzGrammarNames) .AllocSysString ( ) ; break; ) if (EngineCaps) free (EngineCaps ) ; return vaResult; VARIANT CSRCtrl: : DbGetlnfo (short Type) ( VARIANT vaResult; 610 Variantlmt ( vaResult ) ; LPVOID Buf fer ; DWORD size ; asrDbGetlnfo ( SR. hDb , Type, NULL, Ssize ) ; Buf fer=malloc ( size ) ; as rDbGetlnfo ( SR . hDb , Type, Buffer , Ssize ) ; switch (Type ) ( case ASRDBINFO_LANGUAGES: vaResult . vt=VT_BSTR; MemChange (Buffer, *\0', ' I', size); vaResult.bstrVal=CString( (LPCSTR) Buffer) .AllocSysString ( ) ; break; case ASRDBINFO_NBRLANGUAGES: vaResult. vt=VT_I4; vaResult. lVal=* ( (DWORD*) Buffer) ; break; case ASRDBINFOJJSERS : vaResult . vt=VT_BSTR; MemChange (Buffer, *\0', 'I', size); vaResult. bstrVal=CString( (LPCSTR) Buffer) .AllocSysString ( ) ; break; case ASRDBINFO_NBRUSERS : vaResult . vt=VT_I4 ; vaResult. lVal=* ( (DWORD* ) Buffer) ; break; case ASRDBINFO_ENVIRONMENTS: vaResult . vt=VT_BSTR; MemChange (Buffer, '\0', 'I', size) ; vaResult. bstrVal=CStπng( (LPCSTR) Buffer) .AllocSysString ( ) ; break; case ASRDBINFO_NBRENVIRONMENTS: vaResult . vt=VT_I4 ; vaResult. lVal=* ( ( DWORD* ) Buffer ) ; break; case ASRDBINFO_CONTEXTS: vaResult . vt=VT_BSTR; MemChange (Buffer, '\0', 'I', size); 611 vaResult. bstrVal=CString ( (LPCSTR) Buffer) .AllocSysString ( ) break; case ASRDBINFO_NBRCONTEXTS: vaResult. vt=VT_I 4 ; vaResult. lVal=* ( (DWORD* ) Buffer) ; break; case ASRDBINFO_WAVEFORMATS: vaResult . vt=VT_I 4 ; vaResult . lVal=- 1 ; break; case ASRDBINFO_NBRWAVEFORMATS : vaResult. vt=VT_I4; vaResult. lVal=* ( (DWORD*) Buffer) ; break; case ASRDBINFO_GRAMMARFORMATS : vaResult . vt=VT_I 4 ; vaResult . lVal=-l ; break; case ASRDBINFO_NBRGRAMMARFORMATS: vaResult . vt=VT_I4 ; vaResult. lVal=* ( (DWORD*) Buffer) ; break; case ASRDBINFO_EXPORTFORMATS : vaResult . vt=VT_I4 ; vaResult. lVal=-l; break; case ASRDBINFO_NBREXPORTFORMATS : vaResult . vt=VT_I4 ; vaResult. lVal=* ( (DWORD*) Buffer) ; break; case ASRDBINFO_IMPORTBUFFORMATS : vaResult . vt=VT_I 4 ; vaResult . lVal=- 1 ; break; case ASRDBINFO_NBRIMPORTBUFFORMATS : vaResult . vt=VT_I 4 ; vaResult. lVal=* ( ( DWORD* ) Buffer ) ; break; case ASRDBINFO_EXPORTBUFFORMATS: vaResult . vt=VT_I 4 ; vaResult. lVal=-l ; break; 612 case ASRDBINFC_NBREXPORTBUFFORMATS : vaResult . vt=VT_I4 ; vaResult. lVal=* ( (DWORD*) Buffer) ; break; ) if (Buffer) free (Buffer) ; return vaResult; long CSRCtrl: : DbGetParamlnf o ( ) ( return -1; ) long CSRCtrl: : Dblnstall (LPCTSTR SetupFile, long hWnd) ! return asrDblnstall (SR.hDb, SetupFile, (HWND) hWnd) ; BSTR CSRCtrl : : DbList ( ) ! CString strResuit; LPSTR Buffer; DWORD size; asrDbList (NULL, Ssize); Buffer=(LPSTR)malloc(size) ; asrDbList (Buffer, Ssize); MemChange (Buffer, '\0', 'I', size); strResult=Buffer; if (Buffer) free (Buffer) ; return strResuit .AllocSysString ( ) ; long CSRCtrl: : DbOpen (LPCTSTR DbName) ! SR.hDb=asrDbOpen (DbName) ; return SR.hDb; 613 long CSRCtrl: : bUnlnstall (short Type, LPCTSTR ObjectName) ( return asrDbUninstall (SR.hDb, Type, Ob]ectName) ; ) // Recognition engine long CSRCtrl: : RecAcqClose 0 ! return asrRecAcqClose (SR.hAsr) ; ) short CSRCtrl : : RecAcqGetSignalLevel ( ) ( short Level; asrRecAcqGetSignalLevel (SR.hAsr, sLevel) ; return Level; ) long CSRCtrl: : RecAcqOpenE (short WaveFormlndex, short Type) ! ASRERROR err; if (Type==WAVEDEVICE) err=as rRecAcqOpenEx ( SR. hAs r, ( LPWAVEFORMAT ) WaveFormlndex, Type) ; else err=asrRecAcqOpenEx (SR.hAsr, PWaveFormats+WaveFormlndex, Type) ; return err; ) long CSRCtrl: : RecAcqWaveBuffer (LPCTSTR IpBuffer, long dwLength) ( return CheckError (asrRecAcqWaveBuffer (SR. hAsr, (LPVOID) IpBuffer, dwLength) ) ; } long CSRCtrl: : RecBreak () ( return asrRecBreak (SR.hAsr) ; ) 614 long CSRCtrl : : ecClos e ( ) ! return as rRecClose ( SR. hAs r ) ; ) long CSRCtrl : : CtxActivate ( BOOL Activate ) 1 if (Activate ) { ASRACTIVATE AsrActlvate=( SR. hCtx, ""); asrRecCtxActivate (SR.hAsr, SAsrActivate, I); ) else asrRecCtxActivatelSR.hAsr, NULL, 0); return 0 ; BSTR CSRCtrl : : GetActiveWords ( ) ( CString strResuit; LPSTR ActiveWords; DWORD size; CheckError (asrRecGetActiveWords (SR.hAsr, SR.hCtx, NULL, NULL, Ssize) ) ; ActiveWords=new charfsize] ; CheckError (asrRecGetActiveWords (SR.hAsr, SR.hCtx, NULL, ActiveWords, Ssize) ) ; MemChange (ActiveWords, "\0", ' ,' ' , OxFFFFFFFF) ; strResult=ActιveWords ; delete ActiveWords; return strResuit .AllocSysString ( ) ; ) long CSRCtrl: : ActivateWords (short Type, LPCTSTR Class, LPCTSTR Words) ( LPSTR Buffer; ASRERROR err; DWORD size; sιze=strlen (Words ) +2; Buffer=new char[sιze]; strcpy (Buffer, Words); Buffer[size-1]='\0' ; MemChange (Buffer, 'I', '\0\ size); 615 CheckError (err=asrRecSetActιveWords (SR.hAsr, SR.hCtx, Type, Class, Buffer) ) ; delete Buffer; return err; long CSRCtrl: : RecSetMode (short NewMode) ! return asrRecSetMode (SR.hAsr, NewMode); II- -User- long CSRCtrl: : UsrCopy (LPCTSTR UserSrc, LPCTSTR UserDest) ! return asrUsrCopy (SR.hDb, UserSrc, UserDest); ) long CSRCtrl: : UsrEnable (LPCTSTR UserName, LPCTSTR Language, short Type) { return asrUsrEnable (SR.hDb, UserName, Language, Type); long CSRCtrl: : UsrCreate (LPCTSTR UserName) ! return asrUsrCreate (SR.hDb, UserName); } long CSRCtrl: :UsrDelete (LPCTSTR UserName) ( return asrUsrDelete (SR.hDb, UserName); ) VARIANT CSRCtrl: :UsrGetInfo (LPCTSTR UserName, short Type) ( LPVOID Buffer; DWORD size; VARIANT vaResult; Variantlnit (SvaResult) ; asrUsrGetlnfo (SR.hDb, UserName, Type, NULL, Ssize); Buffer=malloc (size) ; 616 asrUsrGetlnfo (SR.hDb, UserName, Type, Buffer, Ssize); switch (Type) { case ASRUSRINFO_CONTEXTS: vaResult . vt=VT_BSTR; MemChange (Buffer, '\0', 'I ', size); vaResult. bstrVal=CStnng ( (LPCSTR) Buffer) .AllocSysString ( ) ; break; case ASRUSRINFO_LANGUAGES : vaResult . vt=VT_BSTR; MemChange (Buffer, '\0', 'I', size); vaResult. bstrVal=CStrmg( (LPCSTR) Buffer ) .AllocSysString ( ) ; break; case ASRUSRINFO_NBRCONTEXTS: vaResult. vt=VT_I4; vaResult. lVal=* ( (DWORD* ) Buffer) ; break; case ASRUSRINFO_NBRLANGUAGES: vaResult . vt=VT_I4 ; vaResult. lVal=* ( (DWORD*) Buffer) ; break; case ASRUSRINFO_MODELS: break; } if (Buffer) free (Buffer) ; return vaResult; ) long CSRCtrl: : Usrlndependent (LPCTSTR UserName, LPCTSTR Language) ! return asrUsrlndependent (SR.hDb, UserName, Language); long CSRCtrl: : UsrRegister (LPCTSTR User, short Type, LPCTSTR Name) ! return asrUsrRegister (SR. hDb, User, Type, Name); long CSRCtrl: : UsrRename (LPCTSTR OldName, LPCTSTR NewName) ( return asrUsrRename (SR. hDb, OldName, NewName); 617 long CSRCtrl : : Us rUnregis te ( LPCTSTR User , short Type , LPCTSTR Name ) ( return as rUs rUnregis ter ( SR. hDb , User, Type , Name ) ; / / Context long CSRCtrl: : CtxClose (BOOL Save) ( return asrCtxClose (SR.hCtx, Save); ) long CSRCtrl: : CtxCopy (LPCTSTR SrcUser, LPCTSTR SreContext, LPCTSTR DestUser, LPCTSTR DestContext) ( return asrCtxCopy (SR.hDb, SrcUser, SreContext, DestUser, DestContext) ; long CSRCtrl: : CtxCreate (LPCTSTR User, LPCTSTR Language, LPCTSTR Syntax, LPCTSTR Context) ( return asrCtxCreate (SR.hDb, User, Language, Syntax, Context); long CSRCtrl: : CtxDelete (LPCTSTR User, LPCTSTR Context) ( return asrCtxDelete (SR. hDb, User, Context); ) long CSRCtrl: : CtxDeleteWord (LPCTSTR Class, LPCTSTR Word) ( return asrCtxDeleteWord (SR.hCtx, Class, Word); ) long CSRCtrl: : CtxExport (LPCTSTR User, LPCTSTR Format, LPCTSTR Context) ( return asrCtxExport (SR.hDb, User, Format, Context); long CSRCtrl: : CtxOpen (LPCTSTR User, LPCTSTR Context, short Attrib) 618 ( return asrCtxOpen (SR.hDb, User, Context, Attrib); ) long CSRCtrl: : CtxRename (LPCTSTR User, LPCTSTR OldCtx, LPCTSTR NewCtx) ( return asrCtxRename (SR.hDb, User, OldCtx, NewCtx); ) idefme NUM_MIDI_EVENTS 5 #defme SR_ENABLE 1 #defme MIDI_ENABLE 2 #defme SRCTRL_ERROR_TIMEOUT - 1 idefme SRCTRL_ERROR_NOTFOUND -2 #defme SRCTRL_ERROR_MAP FORMAT -3 idefme SRCTRL_ERROR_MEMALLOC -4 #defιne MAP_MAX_LEN 80 ((define ACTIVATE BUFFER LENGTH 256 long CSRCtrl: : WaitForEvent (LPCTSTR Map, short tιme_100ms, long dwFlags ) ! enum (MIDI_EVENT, SR_EVENT, TIME_OUT); long retvalue; short break_event=TIME_OUT; int l ; HANDLE hMιdιEvent≤(NUM_MIDI_EVENTS] ; DWORD dwStartTime, dwEndTime; CStrmg EventName; MSG msg; if (dwFlags SMIDI_ENABLE! ( for(ι=0;ι<NUM_MIDI_EVENTS;ι++) ( EventName. Format ("%s%d", "BIT", i) ; hMidiEvents [ι]=CreateEvent (NULL, TRUE, FALSE, EventName) ; ResetEvent (hMidiEvents [l] ) ; 619 i f ( dwFlags SSR_ENABLE ) ( DWORD BufferLength; LPSTR worαsjauffer ; as rRecGetActiveWords ( SR. hAs r, SR. hCtx , NULL, NULL, SBufferLength ) ; words Jsuf f er= ' LPSTR) malloc ( BufferLength ) ; i f (words_buffer==NULL ) ( retvalue=SRCTRL_ERROR_MEMALLOC ; goto exit ; asrRecGetActiveWords (SR.hAsr, SR.hCtx, NULL, words_buffer, SBufferLength) ; asrRecSetActiveWords (SR.hAsr, SR.hCtx, ASRREC_DISACTIVATION, NULL, words_buffer) ; free (words_buffer) ; char actιvate_buffer[ACTIVATE_BUFFER_LENGTH] ; char* token, *word, *ptr, *curr_pos; char buffer [MAP_MAX_LEN] ; strcpy (buffer, Map); token=strtok (buffer, ","); curr_pos=actιvate_buffer; while ( token 1 =NULL) ( if ( (ptr=strchr (token, '/' ) )==NULL) ( retvalue=SRCTRL_ERROR_MAPFORMAT ; goto exit; ) *ptr='\0' ; word=AllTrιm( token) ; strcpy (curr_pos, word) ; curr_pos+=strlen (word) +1; token = strtokf NULL, ","); ) * (curr j pos) ='\0 ' ; asrRecSetActiveWords (SR.hAsr, SR.hCtx, ASRREC_ABSOLUTEACTIVATION, NULL, activatejbuffer) ; RecStart ( ) ; ) 620 dwStartTιme=tιmeGetTιme ι ) ; dwEndTιme=dwStartTιme- t - ( tιme_100ms*100) ; m_WasResult=FALSE; while ( timeGetTime ( j <dwEndTιme ) ( if (dwFlags s SR_ENABLE) { if (PeekMessage(Smsg, m_hWnd, ASRM_NOTIFY, ASRM_NOTIFY, PM_NOREMOVE) ) ( LastResult= ( LPASRREΞULT) msg . IParam; break_event=SR_EVENT; break; ) if (m_WasResult) { break_event=SR_EVENT; break; ) ) if ((dwFlags S MIDI_ENABLE) && (WaitForSmgleObject (hMidiEvents [NUM_MIDI_EVENTS 1], 0)) '= WAITJTIMEOUT )( break_event=MIDI_EVENT; break; if (dwFlagsSSR_ENABLE) RecStop () ; switch (break_event) ( case MIDI_EVENT: retvalue=0; for (ι=0;KNUM_MIDI_EVENTS-l;ι++) { if (WaitForSmgleObject (hMidiEvents [i] , ) ==WAIT_OBJECT_0 ) retvaluel = (K<ι) ; ) break; case SR_EVENT: char result [MAP_MAX_LEN] ; char buffer [MAP_MAX_LEN] ; 621 strcpy (buffer, Mac); cnar* toκen, *worα, *map_value, *ptr; strcpy (result, LastResult->szzUtterances ) ; Uppercase (result! ; token=strtok (buffer, ","); while ( token '=NULD { Uppercase (token) ; if ( (ptr=strchr (token, ' / ' ) ) ==NULL) ( retvalue=SRCTRL_ERROR_MAPFORMAT; goto exit; ) *ptr='\0'; word=token; map_value=ptr+l; word=AllTrιm(word) ; map_value=AllTπm (map_value ) ; if ( strcmp ( result, word) ==0 ) ( retvalue=atoι (map_value) ; goto exit; ) token = strtokf NULL, ","); retvalue=SRCTRL_ERROR_NOTFOUND; break; case TIME_0UT: retvalue=SRCTRL_ERROR_TIMEOUT; break; exit: i f (dwFlags SMIDI_ENABLE) { for ( 1=0 ; KNUM_MIDI_EVENTS ; 1++ ) CloseHandle ( hMidiEvents ) ; return retvalue ; ) 622 void CSRCtrl: : Uppercase i LPCTSTR str) ( char* ptr= (char* ) str; while ( *ptr) ( *ptr=toupper ( *ptr) ; ptr++; ) char* CSRCtrl: :AllTπm( char* str) ( char *ptr; while (*str=='\t' || *str==' ') str++; ptr=str+strlen (str) -1; whιle( (*ptr=='\f || *ptr==' ') SS str'=ptr) ptr—; *(ptr+l)='\0' ; return str; short CSRCtrl : : GetNbrPhrases ( ) { if (LastResult==NULL) return 0; else return LastResult->wN; 1 BSTR CSRCtrl: : GetPhrase (short PhraseNbr)! CString strResuit; if (LastResult==NULL) strResult=""; else if (PhraseNbr>LastResult->wN II PhraseNbr<l) strResult=""; elsef char* ptr= ( char* ) LastResult->szzUtterances ; fordnt ι=0;ι<PhraseNbr-l;ι++) ( while (*ptr) ptr++; 623 itr÷ 4 -; strResult=ptr; return strResuit.AllocSysString i short CSRCtrl :: GetPhraseConfLevel (short PhraseNbr) { if (LastResult==NULL) return -1; if (PhraseNbr>LastResult->wN | | PhraseNbr<l) return -1; return * (LastResult->lpwConfιdences + PhraseNbr - 1) ; } Long CSRCtrl: : SetMinConfidenceLevel (short M ConfidenceLevel)! M_MιnConfιdenceLevel=MmConfιdenceLevel; Return 0; ) ) Long CSRCtrl: : CtxCreateFromList (LPCTSTR WordList)! Char buffer [512]; CStr g word; strcpy (buffer, wordlist; char seps[]=",\t\n"; char *token; DWORD status; token=strtok (buffer, seps); while ( token '=NULD ( word=token; word. TrimLeft () ; word.TπmRight ( ) ; status-asrCtxAddWordfSR.hCtx, NULL, "Word", word) ; token=strtok (NULL, seps); ) Return 0; ) 624 ϊincmde "S tdafx . h " (tincluαe "work . n " #ιnclude "SrCti . h " ((include " PrmPrpPg . h " #ιnclude "SRPpg . h " #ιfdef _DEBUG #defme new DEBUG_NEW #undef THIS_FILE static char THIS_FILE [ ] = FILE ; #endιf IMPLEMENT_DYNCREATE (CSRPropPage, COlePropertyPage) BEGIN_MESSAGE_MAP (CSRPropPage, COlePropertyPage) // { (AFX_MΞG_MAP (CSRPropPage) ON_CBN_SELCHANGE(IDC_CONTEXT, OnSelchangeContext) ON_CBN_SELCHANGE(IDC_DATABASE, OnSelchangeDatabase) ON_CBN_SELCHANGE(IDC_USER, OnSelchangeUser) //} )AFX_MSG_MAP END MESSAGE MAP ( ) //////////////////////////////////////////////////////////////////////////// / // Initialize class factory and guid IMPLEMENT_OLECREATE_EX (CSRPropPage, "NEWSR. SRPropPage .1" , 0x528c0224, 0x72ec, OxlldO, 0xa6, Oxce, 0, 0x40, 0x33, 0x2d, 0x1, 0xc5) /m/iiiiiimi / miimmmiiiim/ii/i/i/iiii/ii/iiiiiii i / iiiiimi/i/i/ I II CSRPropPage: : CSRPropPageFactory: :UpdateRegιstry - // Adds or removes system registry entries for CSRPropPage BOOL CSRPropPage: : CSRPropPageFactory: : UpdateRegistry (BOOL bRegister) ( if (bRegister) return AfxOleRegisterPropertyPageClass (AfxGetlnstanceHandle ( ) , 625 m_clsια, ID5_SR_PPG) ; else return A xOleUnregisterClass (m clsid, NULL) ; iiii/miiim/i/im/ mim/iiiiiiii/ i/mm /iiii/i/m/iimmiiiiiiiii I II CSRPropPage: : CSRPropPage - Constructor CSRPropPage : : CSRPropPage ( ) : COlePropertvPagedDD, IDS SR PPG CAPTION) ( //{ (AFX_DATA_INIT (CSRPropPage) m_DataBase = _T(""); mJJser = _T("") ; m_Cσntext = _T("") ; mJMode = 0 ; m_OpenAttr = 0; //) )AFX_DATA_INIT ModeInfoLιst=NULL; CSRPropPage: : -CSRPropPage ( ) ( if (ModelnfoList) free (ModelnfoList) ) I II CSRPropPage: : DoDataExchange - Moves data between page and properties void CSRPropPage: : DoDataExchange (CDataExchange* pDX) ! //( (AFX_DATA_MAP (CSRPropPage) DDP_CBStrmg(pDX, IDC_DATABASE, m_DataBase, _T ( "DataBase" ) ) ; DDX_CBStπng(pDX, IDC_DATABASE, πjDataBase) ; DDP_CBStrιng(pDX, IDCJJSER, m_User, _T("User") ); DDX_C3Strmg(pDX, IDC_USER, mJJser) ; DDP_CBStrmg(pDX, IDC_CONTEXT, m_Context, _T ( "Context" ) ) ; DDX_CBStrιng (pDX, IDC_CONTEXT, πjContext) ; 626 DDP_CBInαex(pDX, DC_MODES, mJMoαe, _T'"Mode") ); DDX_C3Index(pDX, IDC_MODES, π j Mode); DDP_C3Index(pDX, IDC_ATTRI3, m_OpenAttr, _ ( "OpenAttr " ) DDX_CBIndex(pDX, IDC_ATTRIB, n j OpenAttr) ; //) )AFX_DATA_MAP DDP_PostProcessιng (pDX) ; ///Tools void CSRPropPage : : FillDataBases ( ) ( CString tmp; DWORD size; CComboBox* CurrComboBox; char* Buff, *ptr; SetControlStatus (IDC_DATABASE, TRUE) ; asrDbList (NULL, size); Buff=(char*) malloc (size) ; ptr=Buff ; asrDbList (Buf f, Ssize); CurrComboBox= ( CComboBox*) GetDlgItem(IDC_DATABASE) ; CurrComboBox->ResetContent ( ) ; while ( (tmp=GetNextStrmg(Sptr) ) '="") CurrComboBox->AddStrιng(tmp) ; if (Buff) free (Buff) ; CurrComboBox->SetCurSel (CurrComboBox->FmdStrιng (-1, m_DataBase) ) ) void CSRPropPage: : FillUsers () ( CString tmp, DbName; DWORD size; CComboBox* CurrComboBox; HDB hDb; char* Buff, *ptr; SetControlStatus (IDC JSER, TRUE) ; CurrComooBox= ( CComboBox* ) GetDlgl tem ( IDC__DATABASE) ; if (CurrComboBox->GetCurSel ( ) ==CB_ERR) return ; CurrComboBox->GetLBText (CurrComboBox->GetCurSel ( ) , DbName ) ; hDb=asrDbOpen (DbName) ; asrDbGetlnfo (hDb, ASRDBINFO_USERS, NULL, Ssize); Buff=(cnar*) malloc (size) ; asrDbGetlnfo (hDb, ASRDBINFO_USERS , Buff, Ssize); 627 ptr=Buf ; CαrrComboBox= (CComboBox*) GetDlgltem ( IDC_USER) ; CurrComboBox->ResetContent ( ) ; while ( (tmp=GetNextStπng(Sptr) ) !="") CurrComboBox->AddStrmg (tmp) ; if (Buff ) free (Buff) ; if (hDb>ASRERR_MAXERR) asrDbClose (hDb) ; CurrComboBox->SetCurSel (CurrComboBox->FιndStrmg(-l, m_User) ) ; void CSRPropPage : : FillContexts ( ) { CString tmp, user, context, DbName; DWORD size; CComboBox* CurrComboBox; char* Buff, *ptr; HDB hDb; SetControlStatus (IDC_CONTEXT, TRUE) ; CurrComboBox=( CComboBox*) GetDlgltem(IDC_DATABASE) ; if (CurrComboBox->GetCurSel ( ) ==CB_ERR) return; CurrComboBox->GetLBText (CurrComboBoχ->GetCurSel ( ) , DbName) ; CurrComboBox=(CComboBox*) GetDlglte (IDC_USER) ; if (CurrComboBox->GetCurSel ( ) ==CB_ERR) return; CurrComboBox->GetLBText (CurrComboBoχ->GetCurSel ( ) , user) ; CurrComboBox= (CComboBox* ) GetDlgltem( IDC_CONTEXT) ; hDb=asrDbOpen (DbName) ; ASRERROR a=asrUsrGetInfo (hDb, user, ASRUSRINFO CONTEXTS, NULL, Ssize) ; Buff=(char*) malloc (size) ; a=asrUsrGetInfo(hDb, user, ASRUSRINFO_CONTEXTS, Buff, Ssize); ptr=Buff ; CurrComboBox->ResetContent ( ) ; while ( (tmp=GetNextstrmg(sptr) ) '="") CurrComboBox->AddStπng (tmp) ; if (Buff) free (Buff) ; 628 i f ( hDb>ASRERR_MAXERR) as rDbClose (hDb ) ; CurrComboBox->SetCurSei ( CurrComboBox->FιndStπng ( -1, m Context) ) ; //////////////////////////////////////////////////////////////////////////// / // CSRPropPage message handlers BOOL CSRPropPage: : OnlnitDialog () ( HCURSOR SaveCursor; SaveCursor=SetCursor (AfxGetApp () ->LoadStandardCursor (IDC_WAIT) ) ; COlePropertyPage : : OnlnitDialog ( ) ; FillDataBases ( ) ; FillUsers () ; FillContexts () ; FillModes ( ) ; FillOpenAttr ( ) ; SetControlStatus ( IDC_DATABASE, TRUE) ; SetCursor ( SaveCursor) ; return FALSE; ) void CSRPropPage : .- OnSelchangeContext ( ) ! void CSRPropPage : : OnSelchangeDatabase ( ) { HCURSOR SaveCursor; SaveCursor=SetCursor (AfxGetApp ( ) ->LoadStandardCursor (IDC_WAIT) ) ; FillUsers () ; FillContexts ( ) ; FillModes ( ) ; SetCursor (SaveCursor) ; void CSRPropPage: :OnSelchangeUser ( ) ( FillContexts ( ) ; 629 void CSRPropPage: : FillModes ( ) ( CString tmp, DbName; DWORD size; CComboBox* CurrComboBox; HDB hDb; HASR hAsr; SetControlStatus (IDC_MODES, TRUE) ; CurrComboBox= (CComboBox* ) GetDlglte (IDC_DATABASE) ; if (CurrComboBox->GetCurSel ( ) ==CB_ERR) return ; CurrComboBox->GetLBText (CurrComboBox->GetCurSel ( ) , DbName) ; hDb=asrDbOpen (DbName) ; hAsr=asrRecOpenEx(hDb, "Win32", NULL, NULL, NULL, NULL, 0) ; asrRecGetModelnfo (hAsr, NULL, Ssize); ModeInfoList=(PMODEINFOLIST) malloc (size) ; asrRecGetModelnfo (hAsr, ModelnfoList, Ssize); CurrComboBox= (CComboBox* ) GetDlgltem( IDC_MODES ) ; CurrComboBox->ResetContent ( ) ; for (int i=0 ; KModelnfoLιst->nbrOfModes ; i++) CurrComboBox->InsertString(ModeInfoList->info[i] .ModeType, ModeInfoList->ιnfo[i] . szName) ; if (hDb>ASRERR_MAXERR) asrDbClose (hDb) ; if (hAsr>ASRERR_MAXERR) asrRecClose (hAsr) ; void CSRPropPage: : FillOpenAttr ( ) ( CComboBox* CurrComboBox; CurrComboBox= (CComboBox* )GetDlgItem(IDC_ATTRIB) ; CurrComboBox->InsertStrmg(-l, "Read access"); CurrComboBox->InsertStrmg(-l, "Write access"); SetControlStatus (IDC DATABASE, TRUE) ; 630 tincluce "stdafx.h" #ιncluce "work.h" CString GetNextStπng (char** szzString) ( CString RetStrιng=*szzStnng; *szzStrmg+=RetStrιng.GetLength ( ) + 1; return RetStrmg; 631 // AcqPropPage . h : neader file // II ////// 111/ II III l/l/lll Illl 1/11 II II 1/1/ 1/11/1/11/ II II II II 11/1/ II II II I II CAcqPropPage : Property page dialog #ιnclude "work.h" class CAcqPropPage : public COlePropertyPage ( DECLARE_DYNCREATE ( CAcqPropPage ) DECLARE_OLECREATE_EX (CAcqPropPage) // Constructors public: CString m_DataBase; DWORD nFormats; CAcqPropPage ( ) ; -CAcqPropPage ( ) ; //Tools PWAVEFORMAT CurrWaveFormat; // Dialog Data //( {AFX_DATA( CAcqPropPage) enum { IDD = IDD_ACQPROPPAGE ) ; CEdit m_EditDescrιptιon; CComboBox m_WaveLιst; CButton π j WaveFormat; CButton rt j RealTime; int m_WaveIndex; int m_XAcqMode; int m_XSRTransfer; //) )AFX_DATA // Implementation void FillWFdnt mode); void FilllDdnt mode); protected: virtual void DoDataExchange (CDataExchange* pDX) ; // DDX/DDV support 632 // Message maps protected: //( (AFX_MSG (CAcqPropPage) virtual BOOL OnlnitDialog () ; afx j nsg void OnWaveformat ( ) ; afxjnsg void OnDeviceid ( ) ; afx j nsg void OnSelchangeWavelist () ; afx_msg void OnRealtime ( ) ; afxjnsg void OnNonrealtime ( ) ; //) )AFX_MSG DECLARE_MESSAGE_MAP ( ) private : void SaveAcqMode ( ) ; enum FillType { FILL_BYDEVICEID, FILL_BYNBRWAVEFORMAT ) ; void FillDes c iption ( FillType ftype, WORD wWhat ) ; void CheckAcqGroup ( BOOL Enable ) ; 633 // NewSR.n : ma header file for NEWSR.DLL #ιf ' defined ( AFXCTL_H / ((error cluαe 'afxctl.h' before including this file #endιf ((include "resource. h" // main symools ιιιιι/1/ι in i in / ii/i/mm iiimiiiii/i/i/i i/i/im/mi III/I/I/III/II/I/I I II CNewSRApp : See NewSR.cpp for implementation. class CNewSRApp : public COleControlModule ( public: BOOL Initlnstance ( ) ; int Exitlnstance () ; HICON SRIcon; }; extern const GUID CDECL _tl d; extern const WORD _wVerMaτor; extern const WORD wVerMmor; 634 / / PrmPrpPg . n : header f__e // ^include "work . h" ^include "resource. h" #ιnclude <afxcmn.h> i III inn/ 1 / / i/iiiii i iiiiiiiimm/ii i / mi mm/iii/ im n ii/iiimiin I 11 CPrmPrpPg : Property page dialog class CPrmPrpPg : public COleProDertyPage ( DECLARE_DYNCREATE (CPrmPrpPg) DECLARE_OLECREATE_EX (CPrmPrpPg) // Constructors SS Destructor public: CPrmPrpPg ( ) ; -CPrmPrpPg () ; //Tools PPARAMINFOLIST Paramlnfo; // Dialog Data //{ (AFX_DATA(CPrmPrpPg) enum ( IDD = IDD_PARAMINFO ) ; CListBox m_Result; CListBox m_LιstWords; CButton m_SetDef; CSliderCtrl m_Slιder; CStatic m_CurrentValue; CStatic m_Mm; CStatic m_Max; CStatic m_Descπptιon; CListBox m_Params; CString m_DataBase; int m_Control; //) )AFX_DATA // Implementation protected: virtual void DoDataExchange (CDataExchange* pDX) ; // DDX/DDV support 635 // Mes sage maps protected : // ( (AFX_MSG ( CPrmPrpPg) virtual BOOL OnlnitDialog () ; afx j nsg void OnSelehangeListl () ; afx j nsg void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) ; afx j nsg void OnDefaultvalue ( ) ; //) }AFX_MSG DECLARE_MESSAGE_MAP ( ) ) ; 636 / / SRCtl . h : Declaration o f t.-.ε CSRCtrl OLE control class . / 1 / 1 / 111111111 / 11111 / 1111 / / 1 / 11 / 1111111 / 111 / 1 / 1 / 1 / 1 I I I 111 / 111 / 1 / 1 I I I 11111/1 / / 1 / CSRCtrl : See SRCtl.cpp for implementation. iinclude "work.h" class CSRCtrl : public COleControl ( DECLARE_DYNCREATE (CSRCtrl ) private: long RecStop ( ) ; long RecStart ( ) ; void ChangeStart ( ) ; CBitmap SRBitMap; // Constructor public: int MemChange (void* Buffer, char d, char s, DWORD dwLength); void InitDefaults ( ) ; int PostPropExchange (CPropExehange* pPX) ; int PrePropExchange (CPropExehange* pPX) ; void SRCtrllmtO ; CSRCtrl ( ) ; ASRERROR CheckError ( long code); // Overrides // Drawing function virtual void OnDraw( CDC* pdc, const CRectS rcBounds, const CRectS rclnvalid) ; // Persistence virtual void DoPropExehange (CPropExehange* pPX) ; // Reset control state virtual void OnResetState ( ) ; virtual BOOL OnSetExtent ( LPSIZEL IpSizeL ); 637 / / Tools SRStruct SR; // int InitProperties ( ) ; PWAVEFORMAT FWaveFormats ; PERSIST_PRROP* PersistProp; // Implementation protected: -CSRCtrl ( ) ; DECLARE_OLECREATE_EX (CSRCtrl) // Class factory and guid DECLARE_OLETYPELIB ( CSRCtrl ! // GetTypelnfo DECLARE_PROPPAGEIDS (CSRCtrl) // Property page IDs DECLARE OLECTLTYPE (CSRCtrl) // Type name and misc status // Message maps //( (AFX_MSG (CSRCtrl) afx j nsg LRESULT OnConfirm(WPARAM wParam, LPARAM IParam) ; afx j nsg LRESULT OnError (WPARAM wParam, LPARAM IParam); afx j nsg LRESULT OnGamRequest (WPARAM wParam, LPARAM IParam); afx j nsg LRESULT OnProgress (WPARAM wParam, LPARAM IParam) ; afx j nsg LRESULT OnPrompt (WPARAM wParam, LPARAM IParam) ; afx j nsg LRESULT OnState (WPARAM wParam, LPARAM IParam); afx j nsg LRESULT OnTramed (WPARAM wParam, LPARAM IParam); afx j nsg LRESULT OnUpdate (WPARAM wParam, LPARAM IParam); afx j nsg LRESULT OnSRNotify 'WPARAM wParam, LPARAM IParam); //) )AFX_MSG DECLARE_MESSAGE_MAP ( ) // Dispatcn maps //( (AFX_DISPATCH (CSRCtrl) CString m_DataBase; afx j nsg void OnDataBaseChanged ( ) ; CString mJJser; afx j nsg void OnUserChangeo ( ) ; CString m_Context; afxjnsg void OnContextChanged( ) ; short JMode; afx j nsg void OnModeChanged ( ) ; 638 snort ™_OpenAttr; afx_msg void OnOpenAttrChangeα ( ) ; long π j XAcqMooe; afx_msg void OnXAcq.ModeChanged ( ) ; long m_XWaveIndex; afxjnsg void OnXWavelnoexChanged ( ) ; BOOL m_SaveCtx; afxjnsg void OnSaveCtxChanged ( ) ; long m_control; afx j nsg void CnControlChanged ( ) ; afxjnsg void ShowProperties () ; afx j nsg long RecAcqWaveBuffer (LPCTSTR IpBuffer, long dwLength); afx j nsg long RecGetState () ; afx j nsg BSTR GetWords (short Type, LPCTSTR Class); afx j nsg long ActivateWords (short Type, LPCTSTR Class, LPCTSTR Words); afxjnsg BSTR GetActiveWords () ; afx j nsg long Init ( ) ; afx j nsg long Start (); afx j nsg long Stop(j; afx j nsg long Close(); afx j nsg long GetParamflong ParamType) ; afx j nsg long SetParamdong ParamType, long NewValue) ; afx j nsg long AddUserWord (LPCTSTR Class, LPCTSTR Word); afx j nsg long CtxActivate (BOOL Activate); afx j nsg long DictClose (BOOL SaveChanges); afx j nsg long DictCopy (LPCTSTR Language, LPCTSTR DictSrc, LPCTSTR DictDest) ; afx j nsg long DictCreate (LPCTSTR Language, LPCTSTR Dictionary); afx j nsg long DictDelete (LPCTSTR Language, LPCTSTR Dictionary); afx j nsg long DictDeleteException (LPCTSTR Word); afx j nsg VARIANT DictGetlnfo (short Type) ; afx j nsg BSTR DictGetTranscription (LPCTSTR Word) ; afx j nsg long DictOpen (LPCTSTR Language, LPCTSTR Dictionary, short Attrib) ; afx j nsg long DictRename (LPCTSTR Language, LPCTSTR DictSrc, LPCTSTR DictDest) ; afx j nsg long DbClose(); afx j nsg long DbCreate (LPCTSTR DbName, LPCTSTR Path) ; afx j nsg long DbDelete (LPCTSTR DbName); afx j nsg long DbExport (short Type, LPCTSTR LangOrUser, LPCTSTR Name, LPCTSTR Path) ; afx j nsg VARIANT DbGetCaps (LPCTSTR Environment, long Type); afx j nsg VARIANT DbGetlnfo (short Type) ; 639 afx j nsg long DbGetParamlnfo ι ) ; afx j nsg long Dblnstall LPCTSTR SetupFile, long nWnα) ; afx_msg BSTR DbLlst () ; afxjnsg long DbOpen (LPCTSTR DbName); afx j nsg long DbUnlnstal (short Type, LPCTSTR ObgectName); afx j nsg long RecAcqClose () ; afx j nsg snort RecAcqGetSignalLevel ( ) ; afx j nsg long RecAcqOpenE (short WaveFormlndex, short Type); afx j nsg long RecBreakU; afx j nsg long RecCloseU; afx j nsg long RecSetMode (short NewMode); afx j nsg long UsrCopy (LPCTSTR UserSrc, LPCTSTR UserDest); afx j nsg long UsrEnable (LPCTSTR UserName, LPCTSTR Language, short Type ) ; afx j nsg long UsrCreate (LPCTSTR UserName); afx j nsg long UsrDelete (LPCTSTR UserName); afx j nsg VARIANT UsrGetlnfo ( LPCTSTR UserName, short Type); afx j nsg long Usrlndependent (LPCTSTR UserName, LPCTSTR Language); afxjnsg long UsrRegister (LPCTSTR User, short Type, LPCTSTR Name); afx j nsg long UsrRename (LPCTSTR OldName, LPCTSTR NewName); afx j nsg long UsrUnregister (LPCTSTR User, short Type, LPCTSTR Name); afx j nsg long CtxClose (BOOL Save) ; afx j nsg long CtxCopy (LPCTSTR SrcUser, LPCTSTR SreContext, LPCTSTR DestUser, LPCTSTR DestContext); afx j nsg long CtxCreate (LPCTSTR User, LPCTSTR Language, LPCTSTR Syntax, LPCTSTR Context) ; afx j nsg long CtxDelete (LPCTSTR User, LPCTSTR Context); afx j nsg long CtxDeleteWord (LPCTSTR Class, LPCTSTR Word); afx j nsg long CtxExpor ( LPCTSTR User, LPCTSTR Format, LPCTSTR Context); afx j nsg long CtxOpen ( LPCTSTR User, LPCTSTR Context, short Attrib); afx j nsg long CtxRename (LPCTSTR User, LPCTSTR OldCtx, LPCTSTR NewCtx); afx j nsg long WaitForEvent (LPCTSTR Map, short tιme_100ms, long dwFlags ) ; afx nsg short GetNbrPhrases ( ) ; afx j nsg BSTR GetPhrase ( short PhraseNbr); afx j nsg short GetPhraseConfLevel (short PhraseNbr); //) }AFX_DISPATCH DECLARE DISPATCH MAP ( ) afxjnsg void AboutBox () ; HGLOBAL SuppProp; HGLOBAL SuppPropDef; 640 // Event maps // ( (AFX_EVENT (CSRCtrl) void FireResult (LPCTSTR BestUtterance, short BestConfidence, short nbrUtterances) (FιreEvent(eventιdResult,EVENT_PARAM(VTS_BSTR VTS_I2 VTS_I2), BestUtterance, BestConfidence, nbrUtterances);) void FireRecError (long id, LPCTSTR ErrorStrmg) (FιreEvent(eventιdRecError,EVENT_PARAM(VTS_I4 VTSJ3STR) , id, ErrorStrmg) ; ) void FireChangeState (short NewState) (FιreEvent(eventιdChangeState,EVENT_PARAM(VTS_I2) , NewState) ; ) //} )AFX_EVENT DECLARE_EVENT_MAP ( ) // Dispatch and event IDs public: BOOL m_WasResult; char* AllTπm(char* str); void Uppercase (LPCTSTR str); LPASRRESULT LastResult; enum ( //{ (AFX_DISP_ID (CSRCtrl) dispidDataBase = IL, dispidUser = 2L, dispidContext = 3L, dispidMode = 4L, dispidOpenAttr = 5L, dispidSaveCtx = 8L, dispidShowProperties = 10L, dispidRecAcqWaveBuffer = 11L, dispidRecGetState = 12L, dispidGetWords = 13L, dispidActivateWords = 14L, dispidGetActiveWords = 15L, dispidlnit = 16L, dispidStart = 17L, dispidstop = 18L, dispidClose = 19L, dispidGetParam = 20L, dispidSetParam = 21L, dispidAddUserWord = 22L, 641 dispidCtxActivate = 23L, dispidDictClose = 24L, dispidDictCopy = 25L, dispidDictCreate = 26L, dispidDictDelete = 27L, dispidDictDeleteException = 28L, dispidDictGetlnfo = 29L, dispidDictGetTranscription = 30L, dispidDictOpen = 31L, dispidDictRename = 32L, dispidDbClose = 33L, dispidDbCreate = 34L, dispidDbDelete = 35L, dispidDbExport = 36L, dispidDbGetCaps = 37L, dispidDbGetlnfo = 38L, dispidDbGetParamlnfo = 39L, dispidDblnstall = 40L, dispidDbList = 41L, dispidDbOpen = 42L, dispidDbUnlnstall = 43L, dispidRecAcqClose = 44L, dispidRecAcqGetSignalLevel = 45L, dispidRecAcqOpenEx = 46L, dispidRecBreak = 47L, dispidRecClose = 48L, dispidRecSetMode = 49L, dispidUsrCopy = 50L, dispidUsrEnable = 51L, dispidUsrCreate = 52L, dispidUsrDelete = 53L, dispidUsrGetlnfo = 54L, dispidUsrlndependent = 55L, dispidUsrRegister = 56L, dispidUsrRename = 57L, dispidUsrUnregister = 58L, dispidCtxClose = 59L, dispidCtxCopy = 60L, dispidCtxCreate = 61L, dispidCtxDelete = 62L, dispidCtxDeleteWord = 63L, dispidCtxExport = 64L, dispidCtxOpen = 65L, 642 dispidCtxRename = 66L, dispidWaitForEvent = 67L, dispidGetNbrPhrases = 68L, dispidGetPhrase = 69L, dispidGetPhraseConfLevel = 70L, eventidResult = IL, eventidRecError = 2L, eventidChangeState = 3L, //) )AFX DISP ID ) ; 643 // SRPpg.h : Declaration of the CSRPropPage property page class. 1111 //////lllll II 111 lllll l/llll 111/ II II 1/1 III I/I/1////1/I//I/1IIIII I I CSRPropPage : See SRPpg. cpp . cpp for implementation. Sinclude "work.h" class CSRPropPage : public COlePropertyPage ( DECLARE_DYNCREATE (CSRPropPage) DECLARE_OLECREATE_EX (CSRPropPage) // Constructor public: CSRPropPage ( ) ; // Destructor -CSRPropPage () ; // Tools void FillDataBases ( ) ; void FillUsers (); void FillContexts ( ) ; void FillModes ( ) ; void FillOpenAttr ( ) ; PMODEINFOLIST ModelnfoList; // Dialog Data //( {AFX_DATA(CSRPropPage) enum { IDD = IDD_PROPPAGE_SR ) ; CString m_DataBase; CString mJJser; CString m_Context; int mJode ; int mjDpenAttr; //} }AFX_DATA // Implementation protected: virtual void DoDataExchange (CDataExchange* pDX) , // DDX/DDV support // Message maps protected: //( (AFX_MSG (CSRPropPage) virtual BOOL OnlnitDialog () ; 644 afx_msg void OnSelcnangeConte.xt)) ; afxjnsg void OnSelchangeDataoase () ; afxjnsg void OnSelchangeUser () ; //) )AFX_MSG DECLARE MESSAGE MAP ( ) ); 645 Installation Source Code 646 αnit Installation; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, NEWSRLib JTL3, OleCtrls, XMIDILibJTLB, ExtCtrls , PDBEngine ; type TMamlnstallForm = class (TForm) ActivateButton: TBitBtn; XMidil: TXMidi; SRI: TSR; Timerl: TTimer; procedure FormCreate (Sender: TObject); procedure ExitButtonCliCK ( Sender : TObject); procedure ActivateButtonClick (Sender : TObject); procedure BιtBtn2Clιck (Sender : TObject); procedure FormClose (Sender : TObject; var Action: TCloseAction); procedure TimerlTimer (Sender : TObject); private { Private declarations ) public ( Public declarations ) CurrentPath : string; CreatorPath : string; DatabasePath : string; GraphicsPath : string; AudioPath : string; UsagePath : string; PDBEngine : TPDBEngine; function GetCurrentPath (CurrentExeName : string) : string; end; var Mamlns tall Form: TMamlnstallForm; implementation uses Seriailnstall, Toylnstall; (SR *.DFM) 647 procedure TMamlnstallForm. FormCreate ( Sender : TObj ect ) ; begin //WindowState : = wsMaximized; Xmidi l . StartHUB ; SRI . Init ; // Fill Pathes CurrentPath := GetCurrentPath (Application . ExeName) ; CreatorPath := Copy (CurrentPath, 1, Length (CurrentPath) -Length ( ' Executables\ ' ) ) ; DatabasePath := CreatorPath + ' PESTO\DATABASE\ ' ; GraphicsPath := CreatorPath + ' PESTO\GRAPHICS\ ' ; AudioPath := CreatorPath + ' PESTO\AUDIO\ ' ; UsagePath := CreatorPath + ' PESTO\USAGE\ ' ; PDBEngine := TPDBEngine. create (self) ; PDBEngine. DataBasePath := DataBasePath; PDBEngine . LoadConfiguration ; end; function TMamlnstallForm. GetCurrentPath (CurrentExeName : string) string; var i : integer; begin i := Length (CurrentExeName) ; While ι>0 do begin if Copy (CurrentExeName,!, 1) = '\* then ι:=0 else begin i := l -1; CurrentExeName := Copy (CurrentExeName, 1, i) ; end; end; Result := CurrentExeName; end; procedure TMamlnstallForm. ExitButtonCliek (Sender : TObject); begin Close; end; procedure TMamlnstallForm. ActivateButtonClick ( Sender : TObj ect ) ; begin 648 Hide ; SeriallnstallForm. WindowState := wsMaximized; SeriallnstallForm. Show; SeriallnstallForm. Section := 1; SeriallnstallForm. Sho Section ( 1) ; end; procedure TMamlnstallForm. BιtBtn2Clιck (Sender : TObject); begin Hide ; ToylnstallForm. WindowState := wsMaximized; ToylnstallForm. Show; ToylnstallForm. Section := 1; ToylnstallForm. ShowSection (1) ; end; procedure TMamlnstallForm. FormClose (Sender : TObject; var Action: TCloseAction) ; begin Xmidil.StopHUB; SRI. Close; PDBEngine. Free ; Winexec(PChar(CurrentPath+* storyTeller.exe* ) , sw_show) ; end; procedure TMamlnstallForm. TimerlTimer (Sender : TObject); begin ActivateButtonClick (nil) ; Timerl. Enabled := False; end; end. 649 program PESTOInstallation; uses Forms , Installation in ' Installation. pas ' (MainlnstallForm), Seriallnstall in ' Seriallnstall . pas ' (SeriallnstallForm), Toylnstall in 'Toylnstall .pas ' (ToylnstallForm), ToySetup in ' ToySetup .pas ' (ToySetupForm) , PDBEngine in ' PDBEngine .pas ' ; {$R *.RES) begin Application . Initialize ; Application. CreateForm(TMainInstallForm, MainlnstallForm) ; Application. CreateFormtTSeriallnstallForm, SeriallnstallForm) ; Application. CreateForm(TToyInstallForm, ToylnstallForm) ; Application. CreateForm(TToySetupForm, ToySetupForm) ; Application. Run; end. 650 unit Seriallnstall; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Jpeg, ComCtrls; type TΞeriallnstallForm = class (TForm) Imagel: TImage; Titlelmage: TImage; Labelllmage: TImage; Label2Image: TImage; Label3Image: TImage; Ballllmage: TImage; Ball2Image: TImage; Ball3Image: TImage; BallVlImage: TImage; BallV2Image: TImage; BallV3Image: TImage; Bιg2Image: TImage; Bιg3Image: TImage; Bigllmage: TImage; Animationl: TAnimate; Anιmatιon2: TAnimate; Anιmatιon3: TAnimate; Nextlmage: TImage; CutBacklmage : TImage; CutNextlmage : TImage; Errorlmage: TImage; ClipErrorlmage: TImage; XErrorAnimate: TAnimate; OopsErrorAnimate: TAnimate; RetryErrorlmage: TImage; ExitErrorlmage: TImage; Label4Image: TImage; Ball4Image: TImage; Helplmage: TImage; Resetlmage: TImage; procedure NextlmageClick (Sender : TObject); procedure CutNextlmageClick (Sender : TObject); procedure CutBacklmageCliek (Sender : TObject); 651 procedure FormCreate (Senoer : TObject); procedure ClipErrorlmageClick (Senoer : TObject); procedure ExitErrorlmageClick (Sender : TObject); procedure RetryErrorlmageClick (Senoer: TObject); private ( Private declarations ) public ! Public declarations ) Section : Integer; procedure ShowSection (Value : Integers- end; var SeriallnstallForm: TSeriallnstallForm; implementation uses Installation, Toylnstall, ToySetup; ($R *.DFM) procedure TSeriallnstallForm. NextlmageClick (Sender: TObject); begin ShowSection (2) ; Section := 2; end; procedure TSeriallnstallForm. CutNextlmageClick (Sender : TObject) ; var HubAck : integer; begin Section := Section +1; if Section = 5 then begin HubAck := MainlnstallForm. Xmidil . HubReset ( 8*16+2 ) ; if HubAck <> 1 then begin sleep (200) ; HubAck := MainlnstallForm. Xmidil. HubReset (8*16+2) ; end; if HubAck = 1 then begin 652 Hide ; ToySetupForm. indowState := wsMaximized; ToySetupForm. Show; ToySetupForm. Section := 1; ToySetupForm. ShowSection (1 ) ; end else begin Section := 5 ; ShowSection (Section) ; end; end else ShowSection (Section) ; end; procedure TSeriallnstallForm. CutBacklmageCliek (Sender : TObject) begin Section := Section -1; ShowSection (Section) ; end; procedure TSeriallnstallForm. ShowSection (Value Integer) ; begin case Value of 1: begin Labelllmage. Visible := True; Labei2Image. Visible := False; Label3Image. Visible := False; Label4Image.Visible := False; Ballllmage. Visible := True; Ball2Image.Visible := False; Ball3Image. Visible := False; Ball4Image.Visible := False; BallVlImage. Visible := False; BallV2Image. Visible := False; BallV3Image. Visible := False; Bigllmage. Visible := True; Big2Image. Visible := False; Big3Image. Visible := False; Animationl. Visible := True; Anιmatιon2.Visible := False; Anιmatιon3.Visible := False; 653 Nextlmage. VisiD e = True; CutBacklmage. Visioie • = False; CutNextlmage. Visible = False; Errorlmage . Visible = False; ClipErrorImage. Visible = False; XErrorAnimate .Visible = False; OopsErrorAnimate . Visioie = False; RetryErrorlmage .Visible = False; ExitErrorImage. Visible = False; Resetlmage. Visible := False; end; : begin Labelllmage. Visible := True; Label2Image.Visible := True; Label3Image. Visible := False; Label4Image. Visible • = False; Ballllmage.Visible := False; Ball2Image. Visible := True; Ball3Image. Visible := False; Ball4Image. Visible := False; BallVlImage.Visible := True; BallV2Image.Visible := False; BallV3Image. Visible := False; Bigllmage.Visible := False; Bιg2Image.Visible := True; Bιg3Image.Visible := False; Animationl.Visible • = False; Anιmatιon2.Visible • = True; Anιmatιon3.Visible := False; Nextlmage. Visible := False; CutBacklmage. Visible := True; CutNextlmage. Visible := True; Errorlmage. Visible := False; ClipErrorlmage. Visible := False; XErrorAnimate. Visible := False; OopsErrorAnimate .Visible := False; RetryErrorlmage. Visible := False; ExitErrorlmage. Visible • = False; Resetlmage. Visible := False; end; : begin 654 Laoe ll age . Visible • = True; LaoeiZ mage . Visible := True; Laoei3I age .Visible := True; Label4Image. Visible := False; Ballllmage. Visible := False; Bali2Image .Visible := False; Ball3Image. Visible := True; 3all4Image. Visible := False; BallVlImage. Visible := True; BallV2Image. Visible := True; BallV3Image. Visible := False; Bigllmage.Visible := False; Bιg2lmage. Visible := False; Bιg3Image. Visible := True; Animationl.Visible := False; Anιmatιon2.Visible := False; Anιmatιon3.Visible := True; Nextlmage. Visible := False; CutBacklmage .Visible := True; CutNextlmage. Visible := True; Errorlmage. Visible := False; ClipErrorlmage. Visible := False; XErrorAnimate. Visible := False; OopsErrorAnimate.Visible := False; RetryErrorlmage. Visible := False; ExitErrorlmage.Visible := False; Resetlmage. Visible := False; end; begin Labelllmage.Visible True; Label2Image. Visible True; Label3Image. Visible True; Label4Image. Visible True; Ballllmage. Visible False; Ball2Image. Visible False; Ball3Image. Visible False; Ball4Image. Visible True; BallVlImage . Visible True; BallV2Image. Visible True; BallV3Image. Visible True; Bigllmage. Visible True; Bιg2Image . Visible False; 655 Bιg3Image .Visible = False; Animation! . Visiole .= True; Anιmatιon2. Visiole • = False; Animations .Visible • = False; Nextlmage .Visible • = False; CutBacklmage. Visible = True; CutNextlmage. Visible := True; Errorlmage .Visible := False; ClipErrorlmage. Visible := False; XErrorAnimate. Visible := False; OopsErrorAnimate. Visible := False; RetryErrorlmage. Visible := False; ExitErrorlmage. Visible := False; Resetlmage. Visible := True; end; begin Labelllmage. Visible := True; Label2Image. Visible := True; Label3Image.Visible := True; Label4Image. Visible := True; Ballllmage. Visible := False; Ball2Image. Visible := False; Ball3Image. Visible := False; Ball4Image. Visible := True; BallVlImage. Visible := True; BallV2Image. Visible := True; BallV3Image. Visible := True; Bigllmage. Visible := False; Bιg2Image. Visible := False; Bιg3Image. Visible := False; Animationl. Visible := False; Anιmatιon2. Visible := False; Anιmatιon3. Visible := False; Nextlmage. Visible := False; CutBacklmage. Visible := False; CutNextlmage. Visible := False; Errorlmage. Visible := True; ClipErrorlmage. Visible := True; XErrorAnimate.Visible := False; OopsErrorAnimate.Visible := True; RetryErrorlmage. Visible • = True; ExitErrorlmage. Visible • = True; 656 Resetlmage . Visible : = False ; end; end; end; procedure TSeriallnstallForm. FormCreate ( Sender : TObj ect ) ; begin With Ballllmage do begin Left := 30; Top := 200; Height := 35; Width := 33; end; With BallVi: [mage do begin Left = 30; Top = 197; Height = 38; Width = 35; end; With Ball2Intiage do begin Left = 31; Top = 269; Height = 35; Width = 33; end; With BallV2.mage do begm Left : = 31; Top : = 266; Height : = 38; Width : = 38; end; With Ball3Iπlage do begin Left : = 59; 657 Top : = 352; Heignt : = 35; Width : = 33; end; With BallV3 Image do begin Left : = 59; Top : = 343; Heignt : = 38; Width : = 38; end; With Ball4Iιnage do begin Left = 82; Top = 422; Height = 35; Width = 33; end; With Nextlmcig 5 do begin Left = 479; Top = 430; Height = 74; Width = 220; end; With CutBacl- :Image do begin Left : = 483; Top : = 429; Height : = 77; Width : = 108; end; With CutNext Image do begin Left : = 590; Top : = 429; Height : = 77; Width : = 108; 658 end; With Bigllmage do begin Left := 393; Top := 34; Height := 359; Width := 328; end; With Bιg2Image do begin Left := 393; Top := 34; Height := 319; Width := 352; end; With Bιg3lmage do begin Left := 393; Top := 34; Height := 326; Width := 352; end; With Animationl do begin FileName := MainlnstallForm. GraphicsPath + 'InstallHUB.Avi' ; Active := True; Left := 593; Top := 294; Height := 40; Width := 32; end; With Anιmatιon2 do begin FileName := MainlnstallForm. GraphicsPath + 'Hub in.Avi ' ; Active := True; Left := 503; Top := 226; Height := 60; 659 Width • = 128 ; eno; With Anιmatιcn3 do begin FileName = MainlnstallForm. GraphicsPath + 'Electric m.Avi'; Active = True; Left = 505; Top = 113 Height = 150 Width = 80; end; With XErrorAnimate do begin FileName := M MaaiinlnstallForm. GraphicsPath + 'XOnHUB.Avi' Active • = Tru Left := 418 Top := 158 Height := 100 Width := 112 end; With OopsErrorAnimate do begin FileName = = MMaaiinn IlnnsstallForm. GraphicsPath + ' Oops.Avi'; Active = True Left = 539; Top = 81 Height = 50 ; Width = 96 end; With Errorlmaς je do begin Left = 405; Top = 140; Height = 125; Width = 362; end; With RetryEi :rc rlmage do begin 660 Left ΞOl, Top • = 296; Height : = c c . Width : = 89; end; With ExitErrorl age do begin Left : = 589; Top : = 296; Height : = 55; Width : = 92; end; With ClipErjcorlmage do begin Left = 488; Top = 433; Height = 68; Width = 201; end; With Resetlnlage do begin Left : = 580; Top : = 175; Height : = 86; Width : = 171; end; end; procedure TSeriallnstallForm. ClipErrorlmageCliek (Sender : TObject) ; begin // Section := 1; ShowSection (Section) ; end; procedure TSeriallnstallForm. ExitErrorlmageClick (Sender : TObject) ; begin close; MainlnstallForm. Close ; 661 eno; procedure TSeriallnstallForm. RetryErrorlmageClick ( Sender : TObj ect ) ; begin // Section := Section -1; CutNextlmageClick (nil) ; end; end. 662 unit Toylnstall; interf ce uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Jpeg, ExtCtrls, ComCtrls; type TToylnstallForm = class (TForm) Imagel: TImage; Stepllmage: TImage; Step2Image: TImage; Step3Image: TImage; BigSteplImage: TImage; BιgStep2Image: TImage; BigStep3Image : TImage; SteplAnimate : TAnimate; NextButtonlmage: TImage; DoneButtonlmage : TImage; Step3BackImage: TImage; Step2NextImage: TImage; Step2BackImage: TImage; procedure NextButtonlmageClick (Sender : TObject); procedure DoneButtonlmageClick (Sender : TObject); procedure FormCreate (Sender : TObject); procedure Step2BackImageClιck (Sender : TObject); procedure Step2NextImageClιck (Sender : TObject); procedure 5tep3BackImageClιck (Sender : TObject); private ( Private declarations ) public ( Public declarations ) Section : Integer; procedure ShowSection (Value : Integer); end; var ToylnstallForm: TToylnstallForm; implementation 663 uses Installation ; ( $R * . DFM) procedure TToylnstallForm. NextButtonlmageClick (Sender : TObject) ; begin Section := 2; ShowSectio (Section) ; end; procedure TToylnstallForm. DoneButtonlmageClick (Sender : TObject) ; begin Close; MainlnstallForm. close ; end; procedure TToylnstallForm. FormCreate ( Sender : TObj ect ) ; begin // With Stepllmage do begin Left := 46; Top := 128; Height • = 224; Width = 275; end; With Step2Irnage do begin Left = 48; Top = 233; Height = 108; Width = 180; end; With Step3Inlage do begin Left = 39; Top = 135; Height : = 140; Width : = 308; end; 664 With EigSteplImage do begin Left := 405; Top := 48; Height := 354; Width := 360; end; With BigSte]s2Image do begin Left := 416; Top := 61; Height • = 341; Width = 335; end; With BigStej D3Image do begin Left = 419; Top = 53; Height = 343; Width = 326; end; With NextButitonlmage do begin Left = 478; Top = 430; Height : = 74; Width • = 223; end; With DoneBut .tonlmage do begin Left : = 589; Top : = 433; Height : = 69; Width : = 105; end; With Step2Ba cklmage do begin Left : = 479; 665 Top = 429 Height = " 7; Width = 110 end; With Step2NextImage oo begin Left = 589; Top = 429; Height = 77; Width = 111; end; With Step3BackImage do begin Left := = 479; Top : = = 429; Height := ■ - 77; Width : = = 110; end; With SteplAnimate do begin FileName := MainlnstallForm. GraphicsPath + ' DollFaceMove.Avi ' ; Active := True; Left := 539; Top := 119; Height := 80; Width := 80; end; end; procedure TToylnstallForm. ShowSection (Value Integer) ; begin case Value of 1: begin Stepllmage. Visible := True; Step2Image. Visible := False; Step3Image. Visible := False; BigSteplImage. Visible := True; BιgStep2Image. Visible := False; BigStep3Image. Visible := False; SteplAnimate. Visible := True; 666 NextButtonlmage. VisiDie • = True; DoneButtonlmage. Visible := False; Step3BackImage. Visible := False; Step2NextImage.Visible • = False; Step2BackImage. Visible := False; end; begin Stepllmage. Visible = True; Step2Image. Visible = True; Step3Image. Visible = False; BigSteplImage . Visible = False; BιgStep2Image . Visible = true; BιgStep3Image. Visible = False; SteplAnimate .Visible = False; NextButtonlmage.Visible = False; DoneButtonlmage .Visible = False; Step3Backlmage.Visible = False; Step2NextImage.Visible = True; Step2BackImage. Visible = True; end; begin Stepllmage.Visible = False; Step2Image. Visible = False; Step3Image.Visible = True; BigSteplImage. Visible = False; BιgStep2Image. Visible = False; BιgStep3Image. Visible = True; SteplAnimate.Visible = False; NextButtonlmage . Visible = False; DoneButtonlmage . Visible = True; Step3BackImage. Visible = True; Step2NextImage. Visible = False; Step2BackImage.Visible = False; end; end; end; proce d ure TToylnstallForm. Step2BackImageClιck (Sender: TObject) begin Section := 1; ShowSection (Section) ; 667 end; procedure TToylnstallForm. Step2NextImageClιck (Sender : TObject); begin Section := 3; ShowSection (Section) ; end; procedure TToylnstallForm. Step3BackImageClιck (Sender : TObject) ; begin Section := 2; ShowSection (Section) ; end; end. 668 unit ToySetup; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, Menus; type TToySetupForm = class (TForm) Image1: TImage; Titlellmage: TImage; Tιtle3Image: TImage; Tιtle2Image: TImage; Animate1 : TAnimate; Helplmage: TImage; Bigllmage: TImage; Nextlmage: TImage; Errorlmage: TImage; TextErrorlmage: TImage; Confirmlmage: TImage; Checklmage: TImage; CutNextlmage: TImage; CutRetrylmage: TImage; Bιg2Image: TImage; Bιg3Image: TImage; Exitlmage: TImage; MamMenul: TMainMenu; testl: TMenuItem; escapel: TMenuItem; procedure FormCreate (Sender : TObject); procedure NextlmageClick (Sender : TOb ect); procedure CutNextlmageClick (Sender : TObject); procedure CutRetrylmageClick (Sender : TObject); procedure ChecklmageClick ( Sender : TObject); procedure ExitlmageClick (Sender : TObject); procedure escapelClick (Sender : TObject); private ( Private declarations ) public ! Public declarations ) Section : Integer; procedure ShowSection (Value : Integer); 669 function ToyTalk : integer ; end; ToySetupForm: TToySetupForm; implementation uses Installation ; ; $R * . DFM) procedure TToySetupForm. FormCreate ( Sender : TObj ect ) ; begin // With Titlellmage do begin Left = 48; Top = 136; Height = 152; Width = 306; end; With Title2Image do begin Left = 57; Top = 124; Height = 236; Width = 331; end; With Title3] [mage do begin Left = 33; Top = 125; Height = 273; Width = 392; end; With Bigllmjjge do begin Left = 419; 670 Top • = 52; Heignt := 343; Widtn .= 326; end; With Bιg2Image do begin Left := 393; Top := 34; Height := 378; Width := 364; end; With Bιg3Image do begin Left := 411; Top := 51; Height := 337; Width := 342; end; With Nextlm;age do begin Left = 478; Top = 430; Height = 74; Width = 223; end; With Checklnαage do begin Left : = 477; Top : = 434; Height : = 66; Width : = 228; end; With CutNext Image do begin Left : = 478; Top : = 435; Height : = 66; Width : = 110; 671 end ; With CutRet rylmage do begin Left • = 588; Top = 435; Height = 66; Width = 115; end; With Errorlmage do begin Left = 432; Top = 120; Height = 184; Width = 320; With TextErrorlmage do begin Left = 36; Top = 243; Height = 152; Width = 371; end; With Confirmlmage do begin Left := = 411; Top : = = 148; Height := = 187; Width := = 353; end; With Animate! do begin FileName := MainlnstallForm. GraphicsPath + ' oops .Avi ' Active := True; Left := 534; Top := 64; Height := 50; Width := 96; end; 672 end; procedure TToySetup Form. ShowSection (Value : Integer ' begin case Value o f 1: begin //step 1 Titiellmage. Visible := True; Tιtle2Image. Visible := False; Tιtle3Image. Visible := False; Bigllmage. Visible := True; Bιg2Image. Visible : = False; Bιg3Image. Visible := False; Errorlmage. Visible := False; TextErrorlmage. Visible := False; Confirmlmage. Visible := False; Animatel .Visible := False; Nextlmage. Visiole := True; Checklmage .Visible := False; CutNextlmage. Visible := False; CutRetrylmage. Visible := False; end; 2: begin //step 2 Titlellmage. Visible False; Tιtle2lmage .Visible True; Tιtle3Image. Visible False; Bigllmage .Visible False; Bιg2Image. Visible True; Bιg3Image .Visible False; Errorlmage .Visible False; TextErrorlmage . Visible False; Confirmlmage .Visible False; Animatel .Visible False; Nextlmage .Visible False; Checklmage . Visiole False; CutNextlmage . Visible True; CutRetrylmage . Visible True; end; 3: begin //step 3 Titlellmage. Visible False; Tιtle2Image. Visible False; Title3Image. Visible True; 673 Bigllmage .Visible False; Bιg2Image. Visible False; Bιg3Image . Visible True; Errorlmage . Visible False; TextErrorlmage. Visible False; Confirmlmage. Visible False; Animatel .Visible False; Nextlmage .Visible False; Checklmage . Visible True; CutNextlmage.Visible False; CutRetrylmage.Visible False; end; : begin //Confirm Titlellmage. Visible False; Tιtle2Image. Visible False; Tιtle3Image. Visible False; Bigllmage.Visible False; Bιg2Image . Visible False; Bιg3Image. Visible False; Errorlmage.Visible False; TextErrorlmage. Visible False; Confirmlmage . Visible True; Animatel.Visible False; Nextlmage.Visible True; Checklmage . Visible False; CutNextlmage . Visible False; CutRetrylmage.Visible False; end; : begin //Error Titlellmage. Visible False; Tιtle2Image.Visible False; Tιtle3Image.Visible False; Bigllmage. Visible False; Bιg2Image. Visible False; Bιg3Image. Visible False; Errorlmage .Visible True; TextErrorlmage . Visible True; Confirmlmage . Visible False; Animatel.Visible True; NextImage.Visible True; Checklmage .Visible False; 674 CutNextlmage. isioiε := False; CutRetrylmage. Visible := False; end; end; end; 675 procedure TToySetupForm. NextlmageClick ( Senoer : TObj ect ) ; begin / / Next Section := Section +1; ShowSection (Section) ; if Section = 5 then begin Hide; MainlnstallForm. Close; end; end; procedure TToySetupForm. CutNextlmageClick (Sender: TObject); begin // CutNext Section := Section +1; ShowSection (Section) ; if Section = 5 then begin Hide ; MainlnstallForm. Close; end; end; procedure TToySetupForm. CutRetrylmageClick (Sender : TObject); begin // CutRetry end; procedure TToySetupForm. ChecklmageClick (Sender : TObject) begin // Check if ToyTalk = 1 then begin Checklmage. Visible := False; CutNextlmage.Visible := True; CutRetrylmage. Visible := True; end else begin ShowSection (10) ; Section :=2; end; 676 end ; function TToySetupForm. ToyTalk : integer; var ToyNo : Integer; begin // ToyTalk ToyNo := MainlnstallForm. PDBEngine .ToyNumber; if (ToyNo>0) and (ToyNo <32) then Result := MainlnstallForm.XMidil .NewToyTalk (ToyNo, MainInstallForm.AudioPath+* Install.wav' ,0,0,0) else if ToyNo > 31 then Result := MainlnstallForm.XMidil . ToyTalk2 (ToyNo, MainInstallForm.AudioPath+' Install.wav' ,0,0,0,0) ; end; procedure TToySetupForm. ExitlmageClick (Sender : TObject); begin // hide; MainlnstallForm. close; end; 677 procedure TToySetupForm. escapelClick (Sender : TCb ect); begin // hide; MainlnstallForm. close; end; end. 678 Toy Configuration Source Code 679 program PESTOConπσuration , uses Forms , Cofiguration in ' Cofiguration. pas * (ConfigurationForm), PDBEngine in ' PDBEngine . pas ' ; ($R *.RES) begin Application. Initialize; Application. CreateForm(TConfιguratιonForm, ConfigurationForm) ; Application. Run; end. 680 unit Cofiσ raticn; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, Spin, PDBEngine, ComCtrls, ExtCtrls, NEWSRLib TLB, OleCtrls, XMIDILιb_TLB; type TConfigurationForm = class (TForm) SpeedButtonl: TSpeedButton; GroupBoxl: TGroupBox; GroupBox2 : TGroupBox; GroupBox3 : TGroupBox; Buttonl: TButton; ComboBoxl: TComboBox; ComboBox2 : TComboBox; ComboBox3: TComboBox; MasterToySpmEdit: TSpmEdit; ToylSpmEdit: TSpinEdit; Toy2SpιnEdιt: TSpmEdit; MasterToyLabel: TLabel; ToylLabel: TLabel; Toy2Label: TLabel; Labelδ: TLabel; Label7: TLabel; LabelS: TLabel; Panell TPanel; TrackBar4: TTrackBar; TrackBar5: TTrackBar; SpeeoButton2 : TSpeedButton; SpeeoButton3: TSpeedButton; SpeedButton4 : TSpeedButton; TitleLabel: TLabel; GainlLabel: TLabel; VolumelLabel : TLabel; SpeedButton5: TSpeedButton; SpeedButtonc: TSpeedButton; Buttcn2: TButton; Button3: TButton; XMidil: TXMidi; SRI: TSR, 681 Gaιn2Labei: TLabel; Volume2Labei : TLabel; procedure SpeeoButtcnlClick (Sender : TObject); procedure FormCreate (Sender : TObject); procedure FormClose (Sender : TObject; var Action: TCloseAction); procedure SpeedButton2Clιck (Sender : TObject); procedure SpeedButton3Clιck ( Sender : TObject); procedure SpeedButton4Clιck (Sender : TObject); procedure SpeedButton5Clιck (Sender : TObject); procedure SpeedButton6Clιck (Sender : TObject); procedure ButtonlClick (Sender : TObject); procedure ComboBoxlChange (Sender: TOb ect); procedure ComboBox2Change (Sender : TObject); procedure ComboBox3Change (Sender : TObject); procedure MasterToySpinEditChange (Sender : TObject); procedure ToylSpinEditChange (Sender : TObject); procedure Toy2SpmEdιtChange (Sender : TObject); procedure Button2Clιck (Sender: TObject); procedure Button3Clιck (Sender : TObject); private ( Private declarations ) public { Public declarations ) DataBaseEngine : TPDBEngine; CurrentPath : string; CreatorPath : string; DatabasePath : string; GraphicsPath : string; AudioPath : string; UsagePath : string; PresentationPath : string; function GetCurrentPath (CurrentExeName : string) : string; function ToyTalk (ToyNo : Integer;TalkFιles : string; LTime: Integer) : Integer; function ToyListen (Map : string; DelayTime : Real) : Integer; function ConvertToyNameToNumber (value : string) : Integer; procedure FillLabels (value : string) ; function ConvertTovNumberToName (value : Integer) : string; end; var ConfigurationForm: TConfigurationForm; 682 const ToyNamel = 'Teddy Bear [01H] ' ; ToyName2 = ' Frog [02H] ' ; ToyName3 = 'Storyteller 1 [21H] ' ToyName4 = 'Storyteller 2 [22H] ' ToyName5 = 'Storyteller 3 [23H] ' ToyGaml = 'Micropnone ' ; ToyGam2 = ' Sensitivity' ; ToyVolumel = 'Volume ' ; ToyVolume2 HubGaml = 'ToysVolume' ; HubGaιn2 = HubVolume1 = 'Microphone ' ; HubVolume2 = ' Level ' ; implementation ($R *.DFM) procedure TConfigurationForm. SpeedButtonlClick ( Sender : TObj ect ) ; begin // try DataBaseEngme. ToyNumber := MasterToySpinEdit. Value; DataBaseEngine . SaveConfiguration; except end; Close; end; procedure TConfigurationForm. FormCreate (Sender : TObject); var temp : integer; begin // Fill Pathes CurrentPath := GetCurrentPath (Application. ExeName) ; CreatorPath := Copy (CurrentPath, 1, Length (CurrentPath) -Length ( 'Executables\ ' ) ) ; DatabasePath CreatorPath + ' PESTO\DATABASE\ ' ; GraphicsPath CreatorPath + ' PESTO\GRAPHICS\ * ; AudioPath CreatorPath + ' PESTO\AUDIO\ ' ; UsagePath CreatorPath + ' PESTO\USAGE\ * ; 683 Presentat onPath := AudioPath + ' PRESENTATIONX ' ; // try DataBaseEngme := TPDBEngine . create (self); DataBaseEngme. DataBasePath := DatabasePath; DataBaseEngme . LoadConfiguration; MasterToySpmEdit. Value := DataBaseEngme . ToyNumber; ComboBoxl . Text := ConvertToyNumberToName (MasterToySpmEdit .Value) ; except end; Width := 319; Height := 407; SRI. Init; Xmidil. StartHUB; ComboBoxl. Iterns.Add (ToyNamel) ; ComboBoxl. Items .Add (ToyName2) ; ComboBoxl. Items .Add (ToyName3) ; ComboBoxl. Items .Add (ToyName4) ; ComboBoxl. Items.Add (ToyName5) ; ComboBox2. Items.Add (ToyNamel) ; ComboBox2.Items.Add(ToyName2) ; ComboBox2. Items.Add (ToyName3) ; ComboBox2. Items .Add (ToyName4) ; ComboBox2. Items .Add (ToyName5 ) ; ComboBox3. Items .Add (ToyNamel ) ; ComboBox3. Items .Add (ToyName2) ; ComboBox3. Items .Add (ToyName3) ; ComboBox3. I ems .Add (ToyName4) ; ComboBox3. Items .Add (ToyName5) ; end; function TConfigurationForm. GetCurrentPath (CurrentExeName : string) : string; var i : integer ; begin i : = Length ( CurrentExeName ) ; While ι>0 do 684 begin if Copy (CurrentExeName, l, 1) = '\' then ι:=0 else begin 1 := i -1; CurrentExeName := Copy (CurrentExeName, 1, i ) ; end; end; Result := CurrentExeName; end; procedure TConfigurationForm. FormClose (Sender : TObject; var Action: TCloseAction) ; begin // DataBaseEngme . Free ; srl. Close; Xmidil. StopHUB; end; procedure TConfigurationForm. SpeedButton2Clιck (Sender : TObject) ; begin FillLabels ( 'TOY' ) ; TitleLabel .Caption := 'Master Toy'; width := 631; end; procedure T C cnfigurationForm. SpeedButton3Clιck (Sender : TObject) ; begin FillLabels ( 'TOY' ) ; TitleLabel. Caption := 'Toyl'; width := 631; end; procedure TConfigurationForm. SpeedButton4Clιck ( Sender : TObject) ; begin FillLabels ( 'TOY' ) ; TitleLabel. Caption := 'Toy2'; width := 631; end; procedure TConfigura t ionForm. SpeedButton5Clιck ( Sender : TObject) ; begin 685 width : = 319 ; end; procedure TConfigurationForm. SpeeoButtonδClick (Sende : TObject) ; begin width := 319; end; procedure TConfigurationForm. ButtonlCli ck ( Sender : TObj ect ) ; begin close ; end; procedure TConfigurationForm. ComboBoxlChange (Sender : TObject); begin MasterToySpmEdit. value := ConvertToyNameToNumber (ComboBoxl . Text) ; end; procedure TConfigurationForm. ComboBox2Change (Sender : TObject); begin ToylSpmEdit. value := ConvertToyNameToNumber (ComboBox?..Text) ; end; procedure TConfigurationForm. ComboBox3Change (Sender : TObject); begin Toy2SpιnEdιt. value := ConvertToyNameToNumber (ComboBox3. Text) ; end; procedure TConfigurationForm.MasterToySpinEditChange (Sender : TObject) ; begin try MasterToyLabel. Caption := copy ( IntToHex (MasterToySpmEdit . Value, 2 ) , length (IntToHex (MasterToySpmEdit. Value, 2) ) -1,2) ; except end; end; procedure TConfigurationForm. ToylSpmEditChange (Sender : TObject) ; begin try ToylLabel . Caption := copy ( IntToHex (ToylSpmEdit .Value, 2 ) , leng t h (IntToHex (ToylSpmEdit. Value, 2) ) -1,2) ; 686 except end; end; procedure TConfigurationForm. oy2SpιnEdιtChange (Sender : TObject) ; begin try Toy2Label. Caption := copy ( IntToHex (Toy2SpιnEdιt .Value, 2 ) , length ( IntToHex (Toy2SpιnEdιt .Value, 2) ) -1,2) ; except end; end; procedure TConfigurationForm. Button2Click (Sender : TObject); begin FillLabels ( 'HUB' ) ; TitleLabel. Caption := 'HUB'; width := 631; end; procedure TConfigurationForm. Button3Click (Sender : TObject ) ; va Answer : Integer; begin // Test Script ToyTalk (MasterToySpinEdit.Value, PresentatιonPath+* b8001.wav' ,0) ; ToyTalk (ToylSpmEdit .Value, PresentatιonPath+ *b8002. wav' , 0) ; ToyTalk (Toy2SpιnEdιt.Value, PresentatιonPath+ ' b8003. wav' , 0) ; ToyTalk (MasterToySpmEdit. Value, PresentatιonPath+ ' gm945. wav' ,50) ; Answer := ToyListen (' story/1, song/2 ', 5 ) ; if Answer = 1 then ToyTalk (MasterToySpmEdit.Value, PresentatιonPath+ ' stml25.wav' , 0) ; if Answer = 2 then ToyTalk (MasterToySpinEdit. Value, PresentatιonPath+ ' sng320. wav' , 0) ; end; function TConfigurationForm. ToyTalk (ToyNo : Integer;TalkFιles : string; LTime: Integer) : Integer; begin sleep (200) ; if (ToyNo > 31) and (ToyNo <> 85) then begin Resul t := XMidil . ToyTalk2 (ToyNo, TalkFiles , 0 , LTime, 0, 0 ) ; 687 if Result < 0 then Result •= XMιdιl.TcyTalk2 (ToyNo, TalkFiles , 0, Time, 0,0); end; if ((ToyNo <32) and (ToyNo >0)) or (ToyNo = 85) then begin Result := XMidil . ewToyTalk (ToyNo, TalkFiles , 0, 9, LTime) ; if Result < 0 then Result := XMidil.NewToyTalk (ToyNo, TalkFiles , 0,9, LTime) ; end; sleep(lOO) ; end; function TConfigurationForm. ToyListen (Map : string; DelayTime : Real) : Integer; var DTime : Integer; Flags : Integer; begin DTime := Trunc (DelayTιme*10) ; Flags := 1; Result := srl .WaitForEvent (Map, DTime, Flags ) ; if (Result > 0) and (srl .GetPhraseConfLevel (1) < 5000) then Result := 0; end; function TConfigurationForm. ConvertToyNameToNumber (value : string) : Integer; begin if ToyNamel = value then Result • = 1; if ToyName2 = value then Result := 2; if ToyName3 = value then Result := 33 i if ToyName4 = value then Result • = 34, if ToyNameS = value then Result := 35; end; function TConfigurationForm. ConvertToyNumberToName (value : Integer) string; begin if value = 1 then Result := ToyNamel; if value = 2 then Result := ToyName2; if value = 33 then Result := ToyName3; if value = 34 then Result := ToyName4; if value = 35 then Result := ToyName5; end; 688 procedure TConfigurationForm. FillLabels ( value string) ; begin i f value = ' HUB ' then begin GainlLabel . caption = HubGainl; Gam2Label . caption = HubGaιn2 ; VolumelLabel . caption = HubVolu el; Volume2Label . caption = HubVolume2 ; end; if value = 'TOY* then begin GamlLabel . caption = ToyGainl; Gaιn2Label . caption = ToyGaιn2; VolumelLabel . caption = ToyVolumel; Volume2Label . caption = ToyVolume2; end; end; end. 689 APPENDIX B 690 RS232 Base Pevised : Monday, April 13 , 199 E 001 Revision : 001 Bill Of Materials April 13 , 199? 15 : 26 : 15 Page 1 Item Quantity Reference Part 1 3 C1,C35,C36 10 nF 2 5 C2,C28,C33,ι C40 ,C47 1.0 nF 3 9 C3,C5,C21,C25, C29, C34 1.0 uF C38,C42, ■ C45 4 1 C4 10 uF 5 4 C6,C7,C14,C15, C16 0.47 uF 6 1 C8 0.15 uF 2 C9,C17 3.3 uF 8 1 CIO 33 pF 9 2 C11,C43 220 pF 10 9 C12,C18, C22 ( ,C23,C30,C41, 0.1 uF C48,C50, C52 1 1 C13 47 nF 2 1 C19 15 pF 3 1 C20 10 pF 4 2 C24,C27 100 nF 5 1 C26 2.2 uF 6 2 C32,C31 22 pF 7 1 C37 68 nF 8 1 C39 22 nF 9 1 C44 68 pF 0 1 C46 560 pF 1 1 C49 100 uF 2 1 C51 10uF/16V 3 1 Dl RED 4 4 D2,D3,D4 ,D5 1N4148 5 2 JP2, JP1 JUMPER 6 1 JI Antenna 7 1 J2 CON28C 8 1 PI RS232 9 2 Q2,Q1 2N2222 0 2 Q3,Q5 2N2907 1 2 Q4,Q6 BC547 2 15 R1,R2,R4 ,R6, R9 ,R10, R12, 47 K 691 R15,R16,R17 , R55 , R56 , R57 R58,R5933 1 R3 1 R5 47 1 R6 3.9 9 R7,R29,R32,I45,] 53,l R62, 1 K R65,R70,R72 2 R11,R14 27 K 1 R13 680 K 9 R18,R19,R20, ,R21, ,R23, , R26 , 100 K R36,R39,R54 1 R22 33 K 1 R24 510 3 R25,R43,R74 10 2 R27,R66 10 K 1 R28 200 K 1 R30 220 1 R31 470 3 R33,R61,R68 100 1 R34 50 1 R35 51K 1 R38 5.1 K 2 R42,R40 500 1 R41 7/5 K 2 R50,R44 121 K 2 R48,R46 165 K 1 R47 50 K 1 R49 140 K 1 R51 107 K 1 R52 120 K 5 R60,R63,R67, R72, R73 2.7 K 2 R64,R69 3 K 1 SI Reset 1 UI MC13111 1 U2 4053PR 2 U3,U6 74HC574 1 U4 PIC16C73 Micro< ;hip 1 U5 6264 1 U7 TL074 1 U8 RY3 GB021- 900MHz Sharp 1 Yl 10 .240 MHz 1 Y2 14 .7456 MHz 692 APPENDIX C 693 TOY 900MHZ PRODUCT Revised: Monday, April 30, 199E Revision: I .1 Bill Of Materials April 13, 199E 15:31:2£ Page 1 Item Quantity Reference Part 1 1 Cl 6. .9 uF 2 2 C2,C4 27 pF 3 1 C3 2. ,2 uF 12 C5,C6,C7fcC9, -C20, ,C24, C25, .01 uF C27,C30, C41,,C46,,C48 1 C8 100 UF/16V 4 C10,C33, C34, , C37 10 nF 1 Cll 1 nF 3 C12,C15, C44 1 uF 4 C13,C35, C36, ,C38 10 uF 0 5 C14,C22, C23, , C26, C32 0. 47 uF 1 1 C16 3. 3 uF 2 1 C17 150 nF 3 1 C18 33 pF 4 1 C19 220 pF 5 1 C21 6. 8 pF 6 1 C28 15 PF 7 2 C45,C29 10 pF 8 1 C31 68 nF 9 1 C39 680 nF 0 1 C40 47 pF 1 1 C42 470 nF 3 1 Dl 1N1448 4 5 D2,D3,D4 ,D5, D6 1N4148 5 1 JI POWER 6 1 J2 ANT1 7 1 J3 MOTOR CON 8 1 J4 MIC 9 3 L1,L2,L3 56 uHN 0 2 Q5,Q1 2N2907 1 3 3Q2,Q6,Q7 2N2222 2 2 Q4,Q3 2SD1834 3 1 RSI 750 4 2 RTC1,R48 470 K 5 1 Rl 3. 3 K 694 16 R2,R3,R4,R5 , R17 ,R79,,R35, 100 K R35,R40,R 1, ,R43, ,R49 ; ,R50, R51,R60 1 R6 10 K 4 R7,R8,R11,E39 51 K 1 R9 130 K 1 RIO 10 M 2 R24,R12 47 6 R13,R14,R45, ,R46, ,R47, ,R89 10 K 1 R15 2 K 2 R16,R18 22 K 16 R20.R21.R23. R26. ,R27, R28, 47 K R31,R34,R37, R38. .R53. R54, R55,R56,R57, R 58 2 R22,R42 8. 2 K 1 R24 3. 9 K 2 R29,R33 27 K 1 R30 1. 0 K 1 R32 680 K 1 R44 470 1 UI MC69HC05P3 1 U2 MAX485 1 U3 MC13111 1 U4 TL074 1 U5 14521 1 U6 RY3 GB05- 900mhZ Sharp 1 U7 LM4861 1 Yl 4 MHZ 1 Y2 10. 240 MHZ 1 EXTRA CAP 47 Nf 695 It will be appreciated by persons skilled in the art that the present invention is not limited to what has been particularly shown and described hereinabove. Rather, the scope of the present invention is defined only by the claims that follow: 696

Claims: CLAIMS Interactive toy apparatus comprising: a toy having a fanciful physical appearance; a speaker mounted on the toy; a user input receiver; a user information storage unit storing information relating to at least one user: a content controller operative in response to current user inputs received via said user input receiver and to information stored in said storage unit for providing audio content to said user via said speaker. 2. Interactive toy apparatus according to claim 1 and wherein said user input receiver includes an audio receiver. 3. Interactive toy apparatus according to claim 2 wherein said current user input comprises a verbal input received via said audio receiver. 4. Interactive toy apparatus according to claim 1 and wherein said user input receiver includes a tactile input receiver. 5. Interactive toy apparatus according to claim 1 and wherein said storage unit stores personal information relating to at least one user and said content controller is operative to personalize said audio content. 6. Interactive toy apparatus according to claim 1 and wherein said storage unit stores information relating to the interaction of at least one user with said interactive toy apparatus and said content controller is operative to control said audio content in accordance with stored information relating to past interaction of said at least one user with said interactive toy apparatus. 697 7. Interactive toy apparatus according to claim 5 and wherein said storage unit also stores information relating to the interaction of at least one user with said interactive toy apparatus and said content controller also is operative to control said audio content in accordance with information relating to past interaction of said at least one user with said interactive toy apparatus. 8. Interactive toy apparatus according to claim 1 and wherein said storage unit stores information input verbally by a user via said user input receiver. 9. Interactive toy apparatus according to claim 5 and wherein said storage unit stores information input verbally by a user via said user input receiver. 10. Interactive toy apparatus according to claim 7 and wherein said storage unit stores information input verbally by a user via said user input receiver. 11. Interactive toy apparatus according to claim 1 and also comprising a content storage unit storing audio contents of at least one content title to be played to a user via the speaker, said at least one content title being interactive and containing interactive branching. 12. Interactive toy apparatus according to claim 11 wherein said at least one content title comprises: a plurality of audio files storing a corresponding plurality of content title sections including. at least one two alternative content title sections; and a script defining branching between said alternative user sections in response to any of a user input, an environmental condition, a past interaction, personal information related to a user, a remote computer, and a time-related condition. 13. Interactive toy apparatus according to claim 5 and also comprising a content storage unit storing audio contents of at least one content title to be played to a 698 user via the speaker, said at least one content title being interactive and containing interactive branching. 14. Interactive toy apparatus according to claim 13 wherein said at least one content title comprises a plurality of parallel sections of content elements including at » least two alternative sections and a script defining branching between alternative sections in a personalized manner. 15. Interactive toy apparatus according to claim 1 and wherein said user information storage unit is located at least partially in said toy. 16. Interactive toy apparatus according to claim 1 and wherein said user information storage unit is located at least partially outside said toy. 17. Interactive toy apparatus according to claim 1 and wherein said content storage unit is located at least partially in said toy. 18. Interactive toy apparatus according to claim 1 and wherein said content storage unit is located at least partially outside said toy. 19. Interactive toy apparatus according to claim 1 wherein the user input receiver comprises: a microphone mounted on the toy; and a speech recognition unit receiving a speech input from the microphone. 20. Interactive toy apparatus according to claim 5 wherein the user information storage unit is operative to store said personal information related to a plurality of users each identifiable with a unique code and wherein said content controller is operative to prompt any of said users to provide said user's code. 699 21 Interactive toy apparatus according to claim 5 wherein the user information storage unit is operative to store information regarding a user's participation performance 22. Toy apparatus having changing facial expressions, the toy comprising multi-featured face apparatus including a plurality of multi-positionable facial features, and a facial expression control unit operative to generate at least three combinations of positions of said plurality of facial features representing at least two corresponding facial expressions 23. Apparatus according to claim 22 wherein the facial expression control unit is operative to cause the features to fluctuate between positions at different rates, thereby to generate an illusion of different emotions 24. Toy apparatus according to claim 22 and also comprising a speaker device, an audio memory storing an audio pronouncement, and an audio output unit operative to control output of the audio pronouncement by the speaker device, and wherein the facial expression control unit is operative to generate the combinations of positions synchronously with output of the pronouncement 25 Toy apparatus for playing an interactive verbal game comprising a toy, a speaker device mounted on the toy, a microphone mounted on the toy, a speech recognition unit receiving a speech input from the microphone, and an audio storage unit storing 700 a multiplicity of verbal game segments to be played through the speaker device; and a script storage defining interactive branching between the verbal game segments. 26. Toy apparatus according to claim 25 wherein the verbal game segments include at least one segment which prompts a user to generate a spoken input to the verbal game. 27. Toy apparatus according to claim 25 wherein at least one segment includes two or more verbal strings and a prompt to said user to reproduce one of the verbal strings. 28. Toy apparatus according to claim 25 wherein at least one segment comprises a riddle. 29. Toy apparatus according to claim 25 wherein at least one of the verbal strings has educational content. 30. Toy apparatus according to claim 25 wherein at least one of the verbal strings comprises a feedback to said user regarding the quality of said user's performance in the game. 31. Interactive toy apparatus according to claim 1 and further comprising: multi-featured face apparatus assembled with said toy including a plurality of multi-positionable facial features; and a facial expression control unit operative to generate at least three combinations of positions of said plurality of facial features representing at least two corresponding facial expressions. 701 32. Interactive toy apparatus according to claim 31 wherein the facial expression control unit is operative to cause the features to fluctuate between positions at different rates, thereby to generate an illusion of different emotions. 33. Interactive toy apparatus according to claim 31 and also comprising: an audio memory storing an audio pronouncement; and an audio output unit operative to control output of the audio pronouncement by the speaker device, and wherein the facial expression control unit is operative to generate the combinations of positions synchronously with output of the pronouncement. 34. Interactive toy apparatus according to claim 1 and further comprising: a microphone mounted on the toy; a speech recognition unit receiving a speech input from the microphone; and an audio storage unit storing: a multiplicity of verbal game segments of a verbal game to be played through the speaker device; and a script storage defining interactive branching between the verbal game segments. 35. Interactive toy apparatus according to claim 34 wherein the verbal game segments include at least one segment which prompts a user to generate a spoken input to the verbal game. 36. Interactive toy apparatus according to claim 34 wherein at least one segment includes two or more verbal strings and a prompt to said user to reproduce one of the verbal strings. 37. Interactive toy apparatus according to claim 34 wherein at least one segment comprises a riddle. 702 38. Interactive toy apparatus according to claim 34 wherein at least one of the verbal strings has educational content 39 Interactive toy apparatus according to claim 34 wherein at least one of the verbal strings comprises a feedback to said user regarding the quality of said user's performance in the game. 40. A method of toy interaction comprising: providing a toy having a fanciful physical appearance; providing a speaker mounted on the toy; providing a user input receiver, storing in a user information storage unit information relating to at least one user: providing, via a content controller operative in response to current user inputs received via said user input receiver and to information stored in said storage unit, audio content to said user via said speaker. 41. A method according to claim 40 and wherein said storing step comprises storing personal information relating to at least one user and personalizing, via said content controller, said audio content 42. A method according to claim 40 and wherein said storing step comprises storing information relating to the interaction of at least one user with said interactive toy apparatus and controlling, via said content controller, said audio content in accordance with stored information relating to past interaction of said at least one user with said interactive toy apparatus 43. A method according to claim 40 and further comprising storing, in a content storage unit, audio contents of at least one content title to be played to a user via the speaker, said at least one content title being interactive and containing interactive branching 703 44. A method according to claim 40 and further comprising storing personal information related to a plurality of users each identifiable with a unique code and prompting, via said content controller, any of said users to provide said user's code. 45. A method according to claim 40 and further comprising storing information regarding a user's participation performance. 46. A method according to claim 40 and further comprising: providing multi-featured face apparatus including a plurality of multi-positionable facial features; and generating at least three combinations of positions of said plurality of facial features representing at least two corresponding facial expressions. 47. A method according to claim 46 and further comprising causing the features to fluctuate between positions at different rates, thereby to generate an illusion of different emotions. 48. A method according to claim 46 and also comprising: storing an audio pronouncement; and providing said audio pronouncement by said speaker; and generating combinations of facial positions synchronously with output of the pronouncement. 49. A system for teaching programming to schoolchildren using interactive objects, the system comprising: a computerized school-child interface permitting a school-child to breathe life into an interactive object by defining characteristics of the interactive object, said computerized school-child interface being operative to at least partially define, in response to school-child inputs, interactions between said interactive object and humans; and 704 a computerized teacher interface permitting a teacher to monitor the school-child's progress in defining characteristics of the interactive object. 50. A system according to claim 49 wherein the computerized teacher interface permits the teacher to configure the computerized school-child interface. 51. A teaching system for teaching engineering and programming of interactive objects to students, the system comprising: a computerized student interface permitting a student to breathe life into an interactive object by defining characteristics of the interactive object, said computerized user interface being operative to at least partially define, in response to student inputs, interactions between said interactive object and humans; and a computerized teacher interface permitting a teacher to configure the computerized student interface. 52. A computer system for development of emotionally perceptive computerized creatures comprising: a computerized user interface permitting a user to develop an emotionally perceptive computer-controlled creature by defining interactions between the emotionally perceptive computer-controlled creature and natural humans including at least one response of said emotionally perceptive computer-controlled creature to at least one parameter, indicative of natural human emotion, derived from a stimulus provided by the natural human; and a creature control unit operative to control the emotionally perceptive creature in accordance with the characteristics and interactions defined by the user. 53. A system according to claim 52 wherein said parameter indicative of natural human emotion comprises a characteristic of natural human speech other than language content thereof. 705 54. A method for development of emotionally perceptive computerized creatures, the method comprising: defining interactions between the emotionally perceptive computer-controlled creature and natural humans including at least one response of said emotionally perceptive computer-controlled creature to at least one parameter, indicative of natural human emotion, derived from a stimulus provided by the natural human; and controlling the emotionally perceptive creature in accordance with the characteristics and interactions defined by the user. 55. A method for teaching programming to students, the method comprising: providing a computerized visual-programming based school-child interface permitting a school-child to perform visual programming; and providing a computerized teacher interface permitting a teacher to configure the computerized school-child interface. 56. A computerized emotionally perceptive computerized creature comprising: a plurality of interaction modes operative to carry out a corresponding plurality of interactions with natural humans including at least one response to at least one natural human emotion parameter, indicative of natural human emotion; and an emotion perception unit operative to derive at least one natural human emotion parameter from a stimulus provided by the natural human, and to supply the parameter to at least one of the plurality of interaction modes. 57. A creature according to claim 56 and also comprising a physical body operative to participate in at least one of the plurality of interactions. 706

Inventors: GABAY JACOB, GABAY OZ, SANDLERMAN NIMROD, GABAY, JACOB, GABAY, OZ, SANDLERMAN, NIMROD
Applicants: CREATOR LTD, GABAY JACOB, GABAY OZ, SANDLERMAN NIMROD, CREATOR LTD., GABAY, JACOB, GABAY, OZ, SANDLERMAN, NIMROD
Application year: 1999
Main classification: A63H30
IPC codes: A63H3, A63H11, A63H13, G06F9, G06F19, G09B5, G10L13, G10L15