Програма призначена для прийому/передачі голосових даних через модем. Дана програма побудована по принципу state машини, яка описується діаграмою станів-переходів. Діаграма станів представляє собою орієнтований граф, вершини якого (події і псевдоподії) з'єднані ребрами-переходами. Стани і умови, зв'язані з переходом, на діаграмі відображаються у вигляді мітки на відповідному ребрі. Діаграма станів зображена нижче на рисунку.
Приклад діаграми робочого сценарію:
В будь-який момент часу кінцевий автомат (state машина) знаходиться в одному із станів. При надходженні зовнішньої події (event) або виконанні певної умови, автомат може перейти із активного стану в новий по одному з переходів.
До складу програми входить основний файл:
Програма VoiceModem запускається тільки з командного рядка. Параметри командного рядка мають наступний формат:
VoiceModem.exe -s "назва_скрипта" -q "Param" "файл_номерів" -p "назва_пара-ра" "значення" -l "файл_трасування" "рівень_трасування"
1) Ключ -s вказує на параметр файлу сценарію. Цей ключ є обов'язковим. всі інші ключові параметри можуть бути відсутні.
Наприклад:
VoiceModem.exe -s "Script.scn"
2) Ключ -q вказує на наявність файлу номерів. Кожен номер з Файлу номерів передається як параметр Param у файл сценарію.
Наприклад:
VoiceModem.exe -s "Script.scn" -q Param "Numbers.txt"
3) Ключ -p вказує на передачу пар-рів у файл сценарію з їх відповідною заміною.
Наприклад:
VoiceModem.exe -s "Script.scn" -p COM COM1 -p ComSpeed 115200
4) Ключ -l вказує на наявність в програмі файлу логування. Рівень трасування може приймати значення:
Наприклад:
VoiceModem.exe -s "Script.scn" -p COM COM1 -p ComSpeed 115200 -l "VoiceModem.log" 1
У файлі повинна бути оголошена обов'язкова секція (у квадратних дужках) під назвою: [Global Options], в якій описуються такі ключові слова (команди):
1) Команда StartAction вказує точку входу в сценарії. Значенням цієї команди може бути будь-який рядок.
Наприклад:
StartAction = action_name
2) Команда TimersNumber вказує кількість таймерів в сценарії.
Наприклад:
TimersNumber = 5
тобто вказано 5 таймерів (від 0 до 4 відповідно). При TimersNumber = 0 - таймери не використовуються.
3) Команда CountersNumber вказує кількість лічильників в сценарії.
Наприклад:
CountersNumber = 5
тобто вказано 5 лічильників (від 0 до 4 відповідно). При CountersNumber = 0 - лічильники не використовуються.
4) Команда PortName вказує на порт, через який працює програма VoiceModem. Наприклад:
PortName = COM1 PortName = COM2 і т.д.
Ім'я порта може бути передано як параметр (для цього використовуються символи: < > ). Наприклад:
PortName = <COM> PortName = <param_Com> і т.д.
5) Команда PortSpeed вказує на швидкість порта.
Примітка:
Швидкість порта - це числова константа, яка може приймати такі значення:
PortSpeed = 110 PortSpeed = 300 PortSpeed = 600 PortSpeed = 1200 PortSpeed = 2400 PortSpeed = 4800 PortSpeed = 9600 PortSpeed = 14400 PortSpeed = 19200 PortSpeed = 38400 PortSpeed = 56000 PortSpeed = 57600 PortSpeed = 115200
6) Команда AutoStart дозволяє запустити програму VoiceModem з певним файлом завдання атоматично при
AutoStart = true.
В іншому випадку записується значення false, яке є встановлено по замовчуванню.
Примітка:
1) Значення всіх вище перерахованих команд можуть бути передані через командний рядок у вигляді:
команда_скрипта = <параметр>
2) Після того як вказано значення певної команди, забороняється вказувати будь-які інші символи, навіть коментарі.
Наприклад:
PortName = 'COM2' // не можна вказувати коментар PortSpeed = 115200 ;; тут теж
Якщо потрібно закоментарити певну команду, то потрібно це зробити перед самою командою:
//PortName = 'COM2' ;; це також закоментарено PortSpeed = 115200
Події описуються у секції Action наступним чином: [action action_name], де action_name - ідентифікатор події.
В секції Action описуються такі ключові слова (команди):
1) Команда ExitScript вказує на вихід із скрипта.
Наприклад:
ExitScript =;
При ExitScript = true номер телефонної лінії попадає в чергу прогрими дя повторного набору.
2) Команда SetState вказує на перехід в інший стан. Значенням цієї команди може бути будь-який ідентифікатор стану.
Наприклад:
SetState = state_name1
3) Команда SetTimer встановлює таймер на певне значення (інтервал часу задається в мілісекундах: \\1 секунда = 1000 мілісекунд). SetTimer має наступний формат запису:
SetTimer(x) = інтервал_часу
де x - номер таймера, який потрібно встановити (нумерація на номер таймера починається з нуля);
Наприклад:
Опишемо в сценарії два таймера
TimersNumber = 2
Пізніше у певній події встановимо випадкові значення цих двох таймерів
SetTimer(0) = 20000 SetTimer(1) = 100000
Примітка:
В будь-якому сценарії не може бути встановлено більше таймерів, ніж TimersNumber. Тобто з прикладу зазначеного вище випливає, що SetTimer(2) = значення не існує у сценарії.
4) Команда SetCounter встановлює лічильник певним значенням. SetCounter має наступний формат запису:
SetCounter(x) = значення_лічильника
де x - номер лічильника, який потрібно встановити (нумерація на номер лічильника починається з нуля); Значенням лічильника може бути ціле число.
Наприклад:
Опишемо в сценарії два лічильника:
CountersNumber = 2
Пізніше у певній події встановимо випадкові значення цих двох лічильників:
SetCounter(0) = 5 SetCounter(1) = 10
Примітка:
В будь-якому сценарії не може бути встановлено більше лічильників, ніж CountersNumber. Тобто з прикладу зазначеного вище випливає, що SetCounter(2) = значення не існує у сценарії.
5) Команда CounterModify здійснює інкремент/декремент певного лічильника. Формат запису команди:
CounterModify(x) = +-значення
де x - номер лічильника, який потрібно модифікувати;
Щоб використати команду CounterModify(x), до цього потрібно встановити відповідний лічильник.
6) Команда SetModemCmd задає АТ-команду модема.
Наприклад:
SetModemCmd = atz
7) Команда SendSound задає шлях до файлу даних, який буде передано в голосовому режимі на певний телефонний номер. Наприклад:
SendSound = D:\VoiceModem\sound.wav
Примітка:
Файл із звуковими даними може бути будь-якого формату.
8) Команда RecordSound задає шлях до файлу, в який буде збережено голосові дані (розмова певного абонента, до якого додзвонилися по визначеному номеру). Наприклад:
RecordSound = D:\VoiceModem\sound.wav
Зауваження:
Файл для запису звукових даних повинен бути тільки формату (*.wav)!!!
9) Команда FinishSend зупиняє передачу даних, визначених командою SendSound і переводить модем з голосового режиму в командний режим.
FinishSend має такий формат запису:
FinishSend = true
10) Команда FinishRecord зберігає дані у файл, вказаний командою RecordSound і переводить модем з голосового режиму в командний.
FinishRecord має такий формат запису:
FinishRecord = true
11) Команда SetMessage передає повідомлення через графічний діалог. Рядок з повідомленням записується в лапках. Наприклад:
SetMessage = 'Some notification!'
Реакція у стані описуються в секції State наступним чином: [state state_name], де state_name - ідентифікатор стану.
В секції State описуються такі ключові слова (команди):
1) Команда ifTimerExpired здійснює перехід на action подію, якщо час відповідного таймера закінчився. Формат запису ifTimerExpired:
ifTimerExpired(x) = action_name
де x - відповідний номер таймера;
2) Команда ifCounterExpired здійснює перехід на action подію, якщо відповідний лічильник зменшився до нуля. Формат запису ifCounterExpired:
ifCounterExpired(x) = action_name
де x - відповідний номер лічильника;
3) Команда ifModemAnswer здійснює перехід на action подію, якщо від модема прийшла відповідна відповідь. Формат запису ifModemAnswer:
ifModemAnswer('ANSWER') = action_name
4) Команда ifSoundFinished здійснює перехід на action подію, якщо всі звукові дані були передані через модем (з файлу, встановленого командою SendSound).
Формат запису ifSoundFinished:
ifSoundFinished = action_name
5) Команда ifUserSays здійснює перехід на action подію, якщо користувач в діалозі натиснув певну кнопку.
Стандартний формат запису:
ifUserSays('YES') = action_name ifUserSays('NO') = action_name ifUserSays('CANCEL') = action_name
Зауваження:
Константи 'YES' 'NO' 'CANCEL' змінювати не можна!!!