FinchSmarts.mesa
Copyright © 1985, 1986 by Xerox Corporation. All rights reserved.
Last Edited by: Swinehart, November 3, 1986 3:45:12 pm PST
Doug Terry, September 5, 1986 3:44:36 pm PDT
Polle Zellweger (PTZ) October 24, 1985 4:56:34 pm PDT
DIRECTORY
Atom USING [ PropList ],
BasicTime USING [ GMT ],
LarkFeepRpcControl USING [ InterfaceRecord ],
MBQueue USING [ Queue ],
RefID USING [ ID ],
Rope USING [ ROPE ],
RPC USING [ EncryptionKey ],
ThParty USING [ PartyInfo ],
Thrush USING
[ ActionReport, 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: LIST OF ConvDesc -- of ConvDescs --,
requests: MBQueue.Queue,
visitors: LIST OF Rope.ROPENIL,
stateChange: CONDITION,
myName: ThSmartsRpcControl.InterfaceName ← [],
myRName: ROPENIL,
myPassword: RPC.EncryptionKey ← NULL
];
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.
props: Atom.PropList ← NIL,
Client-specific values, such as information used by synthesizer code and such. Placed here as a convenience for such services.
originatorRecorded: BOOLFALSE,
reportComplete: BOOLFALSE
];
Initialization
InitFinchSmarts: PROC [thrushInstance: Thrush.ROPENIL];
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,
newState: Thrush.StateInConv ← $idle -- Can also be $failed, to terminate with fast-busy and such.
];
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
VoiceConnect: PROC [
serviceName: ROPE,
convID: Thrush.ConversationID ← nullConvID
] RETURNS [
nb: NB←$success,
cDesc: ConvDesc←NIL
];
Establishes an active conversation with the named voice service, e.g. "recording". Uses specified conversation, creates a new one, or uses one that's in a sufficiently idle state.
LookupServiceInterface: PROC [
serviceName: ROPE,
interfaceName: ROPE,
cDesc: ConvDesc←NIL
] RETURNS [
nb: NB←$success,
shhh: Thrush.SHHH,
interfaceSpec: Thrush.InterfaceSpec
];
Looks up the interface for the named voice service, e.g. the "VoiceRopeServer" interface for the "recording" service. Clients can then import this interface directly.
Visiting: no authentication because reliable authentication is not readily available anyway.
IdentifyVisitor: PROC[visitor: Rope.ROPE];
ReleaseVisitor: PROC[visitor: Rope.ROPE];
Reporting
Clients of Finch can register callback procedures to receive reports concerning the state of conversations, actions taken by the recording service, etc.
Expect ReportSystemState, followed by some number of ReportConversationStates, soon.
ReportSystemStateProc: TYPE = PROC[ on: BOOL ];
Whenever a toggle occurs, so does this procedure.
ReportConversationStateProc: TYPE = 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)
ReportRequestStateProc: TYPE = PROC[ cDesc: ConvDesc, actionReport: Thrush.ActionReport, actionRequest: REF ] RETURNS [betterActionRequest: REF];
ThSmarts.ReportAction was called; we are willing to pass the report on to this routine. FinchSmarts implementation will locate the relevant action request (e.g., an IntervalSpec) and pass it on with the action report.
N.B.!!! Each registered ReportRequestStateProc must either return actionReport, or return a better value for it. The intended use is for an upstream registered proc. to compute the request value as a function of actionReport and some local state. Downstream procedures get the augmented report. Care must be taken to register these procedures (with the help of the before hint (see RegisterForReports), so that the right thing happens.
RegisterForReports: PROC [s: ReportSystemStateProc ← NIL, c: ReportConversationStateProc ← NIL, r: ReportRequestStateProc ← NIL, before: BOOLTRUE];
If before is true, procs go at front of list, else they go at end of list.
UnRegisterForReports: PROC [s: ReportSystemStateProc ← NIL, c: ReportConversationStateProc ← NIL, r: ReportRequestStateProc ← NIL];
Remove procs from the list of report subscribers.
ReportConversationState: PROC [nb: NB, cDesc: ConvDesc, remark: Rope.ROPE];
Distributes a report to all subscribers.
}.
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
Doug Terry, August 28, 1986 4:22:57 pm PDT
Created FinchSmarts.RegisterForReports; removed all routines dealing with record or playback of tunes and removed record/play stuff from FinchInfo and ConvDesc; retired FinchSmarts.Register and friends.
changes to: ReportSystemStateProc, ReportConversationStateProc, ReportRequestStateProc, RegisterForReports, DIRECTORY, FinchInfoBody, ConvDescBody, InitFinchSmarts, UnRegisterForReports
Doug Terry, August 29, 1986 12:06:10 pm PDT
New interface procedures for FinchSmarts clients to get at voice services: VoiceConnect and LookupServiceInterface.
changes to: VoiceConnect, LookupServiceInterface
Swinehart, September 25, 1986 11:12:43 am PDT
Add props field to ConvDesc, in order to allow per-conversation application-specific data.
changes to: ConvDescBody