Я написал C код, содержащий конечный автомат 1 . Сейчас я ищу способ для создания файла html, документирующего этот конечный автомат, например [2].
Я смотрел на доксиген [3]. Он может извлекать тексты, графы вызовов и тому подобное, но не может генерировать диаграммы состояний. Я посмотрел на Графвиз [4]. Он может генерировать графики конечных автоматов, но не может объединять текст и график в одном файле html. Я нашел препроцессор Doxygen [5], который утверждает, что может документировать конечные автоматы, но последнее обновление относится к 2009
Кто-нибудь знает систему, которая может извлекать как текст, так и диаграммы из исходного кода, или специально созданные комментарии в коде, которые активно разрабатываются?
Правка 1 Я не так ясно выразил свой вопрос, как следовало бы. Я хотел бы выяснить рабочий процесс, который позволяет мне документировать и проверять код C, который я создаю для продукта на основе микроконтроллера.
Я бы хотел, чтобы мои пользователи, не обладая знаниями программирования, могли быть в состоянии понять, что я собираюсь реализовать в C коде, так что есть большая вероятность, что код C, который я создаю, на самом деле то, что хочет пользователь.
До сих пор я придумал это рабочий процесс:
1) Я и пользователь садимся и обсуждаем, какие могут быть все неисправности, и что должна делать моя программа в ответ на них. Это хранится в электронной таблице.
2) Я преобразовываю электронную таблицу из шага 1 в один или несколько конечных автоматов. Это можно сделать ручкой и бумагой. Когда это будет сделано, я позволю пользователю проверить, соответствует ли конечный автомат электронной таблице.
3) Я пишу конечный автомат в понятной для машины форме и позволяю программе сгенерировать графическое представление конечного автомата. , Я позволяю пользователю проверить, является ли это тем же конечным автоматом, что и версия шага 2.
4) Я принимаю понятную машине форму конечного автомата и использую ее для написания модульных тестов для каждого состояния и перехода. о государственной машине. Я позволил сотруднику с навыками программирования проверить, соответствуют ли юнит-тесты конечному автомату.
5) Я пишу код C и настраиваю его так, чтобы он прошел все модульные тесты.
6) Готовый продукт тестируется в соответствии со сценарием, начиная с шага 1.
Записывая это, я понимаю, что в этом процессе много ручной работы, которая может выполняться автоматически. Знаете ли вы об инструментах, которые могут это сделать?
SM C [6], как полагает Fiddling Bits, выглядит многообещающе, но я не уверен, что он может сгенерировать C -файл, подобный опубликованному под 1 . Я также не уверен, смогу ли я совершить двустороннее путешествие, как это: я записываю конечный автомат в файл .sm, пусть SM C сгенерирует файл C. Я редактирую файл C, позволяю SM C обновить файл .sm, я редактирую файл .sm и позволяю SM C снова обновить файл C.
Edit 2 Я посмотрел на plantuml в соответствии с предложением Mar c, но это добавляет дополнительную сложность в инструменты, необходимые для генерации html страниц.
Я решил проблему с помощью команда \ dot [7] для вставки диаграммы graphvid в блок команд doxygen. См. [8] код C.
1 код C
typedef enum
{
stIDLE=0,
stDONE
} TRXSTATES;
TRXSTATES theState = stIDLE;
void execute (void)
{
switch (theState)
{
case stIDLE:
{
theState = stDONE
break;
}
case stDONE:
{
break;
}
}
}
[2] требуемая html страница
Some smart text about this state machine
+--------+ +--------+
+ stIDLE + ----> + stDONE +
+--------+ +--------+
[3] http://www.doxygen.nl/index.html
[4] http://graphviz.org/
[5] https://sites.google.com/site/abudden/doxygen-preprocessor
[6] http://smc.sourceforge.net/
[7] http://www.doxygen.nl/manual/commands.html#cmddot
[8] обновленный C код
/** \mainpage
* Some smart text about this state machine
* \dot
* digraph statemachine {
* rankdir=LR
* node [shape=record, fontname=Helvetica, fontsize=10];
* stIdle [ label="Idle" ];
* stDone [ label="Done" ];
* stIdle -> stDone [ label ="Finished", arrowhead="open", style="solid" ];
* }
* \enddot
*/
typedef enum
{
stIDLE=0,
stDONE
} TRXSTATES;
TRXSTATES theState = stIDLE;
void execute (void)
{
switch (theState)
{
case stIDLE:
{
theState = stDONE
break;
}
case stDONE:
{
break;
}
}
}