FinchSmarts.mesa
Copyright © 1985, 1986 by Xerox Corporation. All rights reserved.
Last Edited by: Swinehart, June 1, 1986 6:34:11 pm PDT
Polle Zellweger (PTZ) October 24, 1985 4:56:34 pm PDT
DIRECTORY
BasicTime USING [ GMT ],
LarkFeepRpcControl USING [ InterfaceRecord ],
MBQueue USING [ Queue ],
RefID USING [ ID ],
RefQ USING [ Queue ],
Rope USING [ ROPE ],
RPC USING [ EncryptionKey ],
ThParty USING [ PartyInfo ],
Thrush USING
[ ConversationID, ConvEventBody, InterfaceSpec, NB, nullConvID, nullID, PartyID, Reason, ROPE, SHHH, SmartsID, StateInConv ],
ThSmartsRpcControl
;
FinchSmarts: CEDAR DEFINITIONS = {
Types
ConversationID: TYPE = Thrush.ConversationID;
nullConvID: ConversationID = Thrush.nullConvID;
NB: TYPE = Thrush.NB;
nullID: RefID.ID = Thrush.nullID;
WhoOriginated: TYPE = { unknown, us, them };
PartyID: TYPE = Thrush.PartyID;
Reason: TYPE = Thrush.Reason;
ROPE: TYPE = Thrush.ROPE;
SHHH: TYPE = Thrush.SHHH;
FinchInfo: TYPE = REF FinchInfoBody;
FinchInfoBody: TYPE = MONITORED RECORD [
smartsID: Thrush.SmartsID←nullID,
partyID: PartyID ← nullID,
shh: SHHHNIL,
conversations: RefQ.Queue -- of ConvDescs --,
requests: MBQueue.Queue,
stateChange: CONDITION,
myName: ThSmartsRpcControl.InterfaceName ← [],
myRName: ROPENIL,
myPassword: RPC.EncryptionKey ← NULL,
Call backs
ReportSystemState: PROC[ on: BOOL ],
ReportConversationState: PROC[ nb: NB, cDesc: ConvDesc, remark: ROPENIL ]
];
ConvDesc: TYPE = REF ConvDescBody;
ConvDescBody: TYPE = RECORD [
Switching data
situation: Thrush.ConvEventBody, -- amalgam of useful info from last-reported event
Data of use to clients, maintained by FinchSmarts
whoOriginated: WhoOriginated ← unknown,
ultimateState: Thrush.StateInConv ← idle, -- last state reached (except for idle)
Maintained by SmartsImpl:
For calls that were completed, this will be active
For attempted outgoing calls, this is perhaps maybe
For incoming calls that were not answered, this is perhaps ringing
startTime: BasicTime.GMTNULL,
subject: ROPENIL,
numParties: NAT𡤀,
numActive: NAT𡤀,
numIdle: NAT𡤀,
partyInfo: ThParty.PartyInfo←NIL, -- Complete description as of some recent time
feepInterfaceSpec: Thrush.InterfaceSpec,
feepInterface: LarkFeepRpcControl.InterfaceRecord,
Client-maintained data
clientData: REFNIL,
ReportConversationState implementation can store client-dependent pointers here;
but this field is cleared once the ConvDesc leaves the FinchInfo.conversations Queue.
originatorRecorded: BOOLFALSE,
reportComplete: BOOLFALSE
];
Initialization
InitFinchSmarts: PROC [
thrushInstance: Thrush.ROPENIL,
ReportSystemState: PROC[ on: BOOL ],
Whenever a toggle occurs, so does this procedure.
ReportConversationState: PROC[ nb: NB, cDesc: ConvDesc, remark: ROPENIL ]
Client-relevant changes in conversation state are reported in gory detail; FinchSmarts is allowed to invent parts of it (e.g., reason and remark fields)
];
Expect ReportSystemState, followed by some number of ReportConversationStates, soon.
No more than one client should call this procedure, at present.
FinchIsRunning: PROC RETURNS [finchIsRunning: BOOL];
UninitFinchSmarts: PROC[problem: Thrush.ROPENIL, nb: Thrush.NBNIL]; 
Call Management
PlaceCall: PROC [
convID: Thrush.ConversationID ← nullConvID,
rName: ROPENIL,
number: ROPE←NIL,
useNumber: BOOLFALSE];
Uses specified conversation, creates a new one or uses one that's in a sufficiently idle state.
Interpretation of rName and number -- evaluate until action can be taken:
rName exists in switching system (has an Etherphone, usually) and ~use#: call that party.
number#NIL: rName is simply a description; call by number
rName=NIL or use#: invalid parameters
rName exists in obsolete directory and ~use#: use the resulting number
all tests fail: no such party.
AnswerCall: PROC[convID: ConversationID];
DisconnectCall: PROC[
convID: ConversationID,
reason: Thrush.Reason←$terminating,
comment: ROPENIL
];
If the other party is willing to do it (trunk parties only, at present), generate touchtones corresponding to the characters in feepString. For talking to feep-controlled services.
Alphabetic characters in feepString are translated to their corresponding digits, based ont he mapping found on most telephone touchpads and dials.
Feep: PROC[convID: ConversationID, feepString: ROPE];
Management of services
Some tunes are stored in the Grapevine registry under global "noise names". Play one of them.
PlayNoiseProc: TYPE = PROC [
convID: Thrush.ConversationHandle ← Thrush.nullConvHandle, --vestigial until I figger it out
noiseName: ATOM,
queueIt: BOOLFALSE, -- Should be FALSE if timeout stuff is used!
serverInstance: ROPENIL, -- defaults to UserProfile.ThrushClientServerInstance; this is where the noise is stored.
failOK: BOOLFALSE, -- playing is optional; leave connection open if tune doesn't exist.
wait: BOOL ← FALSE -- wait until things appear to be started properly, or have failed
] RETURNS [ started: BOOL ]; -- TRUE: things appear to be started properly
PlayNoise: PlayNoiseProc;
Registration
This is like the WalnutRegistry. Finch registers its procedures here, and clients of Finch obtain and use them. FinchRegistryImpl implements these procedures. Finch runs FinchRegistryImpl if it's not already running, and so do its applications. Multiple instances of FinchRegistryImpl produce multiple registrations, though, so be careful with configs.
Unlike WalnutRegistry, this one is presently set up to deal with only one set of registered procs at a time.
Created for use by WalnutVoice, which wants to be able to run with or without Finch running.
FinchState: TYPE = { unknown, running, stopped };
Procs: TYPE = REF ProcsRecord;
ProcsRecord: TYPE = RECORD [
finchIsRunning: PROC RETURNS [isRunning: BOOL]
];
Register: PROC [finchSmartsProcs: Procs];
Register a set of procedures to be invoked when the appropriate database changes occur. Return a registration that can be used to name the set
GetProcs: PROC RETURNS [Procs];
Get the current registered set, or NIL
CurrentFinchState: PROC RETURNS [finchState: FinchState];
a quick and safe way to find out if Finch has been loaded and if it is active or not
}.
Swinehart, July 18, 1985 3:31:34 pm PDT
Created FinchSmarts.Register and friends -- easier for WalnutVoice to deal with Finch.
changes to: InitFinchSmarts, RecordTuneProc, RecordTune, StopTuneProc, StopTune, PlaybackTuneProc, PlaybackTune, PlayNoiseProc, PlayNoise, Feep, FinchState, Procs, CurrentFinchState, Procs, Register, FinchIsRunning, UninitFinchSmarts, GetProcs
Polle Zellweger (PTZ) July 13, 1985 5:20:26 pm PDT
adding Text-to-Speech server
Changes to: DIRECTORY, FinchInfoBody, ConvDescBody
Added: TextToSpeech, StopSpeech
Swinehart, August 6, 1985 4:19:33 pm PDT
Merge PTZ Prose changes
changes to: DIRECTORY, FinchInfoBody, ConvDescBody, PlayNoise, TextToSpeech, StopSpeechProc, StopSpeech, ProcsRecord
Polle Zellweger (PTZ) August 29, 1985 5:06:29 pm PDT
changes to: TextToSpeechProc, ProseTranslateProc, TextToSpeech, StopSpeechProc, StopSpeech, ResetProse, ProcsRecord
Polle Zellweger (PTZ) September 3, 1985 6:17:21 pm PDT
Allow registration of proseTranslateProc.
changes to: ProseTranslateProc, TextToSpeech, RegisterTranslateProcType, RegisterTranslateProc, ProcsRecord
Polle Zellweger (PTZ) October 24, 1985 4:56:25 pm PDT
Move bluejayConnection and proseConnection from FinchInfo to ConvDesc.
changes to: FinchInfoBody, ConvDescBody