File indexing completed on 2024-06-09 13:46:33

0001 /***************************************************************************
0002  *   Copyright (C) 2003 by David Saxton                                    *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #include "delay.h"
0012 
0013 #include "flowcode.h"
0014 #include "libraryitem.h"
0015 #include "icndocument.h"
0016 
0017 #include <KLocalizedString>
0018 
0019 Item *Delay::construct(ItemDocument *itemDocument, bool newItem, const char *id)
0020 {
0021     return new Delay(static_cast<ICNDocument *>(itemDocument), newItem, id);
0022 }
0023 
0024 LibraryItem *Delay::libraryItem()
0025 {
0026     return new LibraryItem(QStringList(QString("flow/delay")), i18n("Delay"), i18n("Functions"), "delay.png", LibraryItem::lit_flowpart, Delay::construct);
0027 }
0028 
0029 Delay::Delay(ICNDocument *icnDocument, bool newItem, const char *id)
0030     : FlowPart(icnDocument, newItem, id ? id : "delay")
0031 {
0032     m_name = i18n("Delay");
0033     initProcessSymbol();
0034     createStdInput();
0035     createStdOutput();
0036 
0037     createProperty("delay_length", Variant::Type::Double);
0038     property("delay_length")->setCaption(i18n("Pause Length"));
0039     property("delay_length")->setUnit("sec");
0040     property("delay_length")->setValue(1.0);
0041 }
0042 
0043 Delay::~Delay()
0044 {
0045 }
0046 
0047 void Delay::dataChanged()
0048 {
0049     double delay = dataDouble("delay_length");
0050     setCaption(i18n("Delay for %1 sec", QString::number(delay / getMultiplier(delay), 'g', 3) + getNumberMag(delay)));
0051 }
0052 
0053 void Delay::generateMicrobe(FlowCode *code)
0054 {
0055     const double delayLength_ms = dataDouble("delay_length") * 1e3;
0056     code->addCode("delay " + QString::number(delayLength_ms));
0057     code->addCodeBranch(outputPart("stdoutput"));
0058 
0059     //  code->addVariable("COUNT_REPEAT");
0060 
0061 #if 0
0062     // Code for pauses less than 769uS
0063     if ( pauseLength < 769 )
0064     {
0065         code->addCodeBlock( id(),   "movlw " + QString::number(pauseLength/3) + "\n"
0066                                     "movwf COUNT_REPEAT\n"
0067                                     "call count_3uS\n"
0068                                     + gotoCode("stdoutput") );
0069                                     
0070         code->addCodeBlock( "count_3uS",    "decfsz COUNT_REPEAT,1\n"
0071                                             "goto count_3uS\n"
0072                                             "return" );
0073     }
0074     else if ( pauseLength < 196609 )
0075     {
0076         code->addVariable("COUNT_LOOP_1");
0077         
0078         code->addCodeBlock( id(),   "movlw " + QString::number(pauseLength/(3*256)) + "\n"
0079                                     "movwf COUNT_REPEAT\n"
0080                                     "call count_768uS\n"
0081                                     + gotoCode("stdoutput") );
0082                                     
0083         code->addCodeBlock( "count_768uS",  "decfsz COUNT_LOOP_1,1\n"
0084                                             "goto count_768uS\n"
0085                                             "decfsz COUNT_REPEAT,1\n"
0086                                             "goto count_768uS\n"
0087                                             "return" );
0088     }
0089     else if ( pauseLength < 50331649 )
0090     {
0091         code->addVariable("COUNT_LOOP_1");
0092         code->addVariable("COUNT_LOOP_2");
0093         
0094         code->addCodeBlock( id(),   "movlw " + QString::number(pauseLength/(3*256*256)) + "\n"
0095                                     "movwf COUNT_REPEAT\n"
0096                                     "call count_200mS\n"
0097                                     + gotoCode("stdoutput") );
0098                                     
0099         code->addCodeBlock( "count_200mS",  "decfsz COUNT_LOOP_1,1\n"
0100                                             "goto count_200mS\n"
0101                                             "decfsz COUNT_LOOP_2,1\n"
0102                                             "goto count_200mS\n"
0103                                             "decfsz COUNT_REPEAT,1\n"
0104                                             "goto count_200mS\n"
0105                                             "return" );
0106     }
0107     else/* if ( pauseLength < 12884901889 )*/
0108     {
0109         code->addVariable("COUNT_LOOP_1");
0110         code->addVariable("COUNT_LOOP_2");
0111         code->addVariable("COUNT_LOOP_3");
0112         
0113         code->addCodeBlock( id(),   "movlw " + QString::number(pauseLength/(3*256*256*256)) + "\n"
0114                                     "movwf COUNT_REPEAT\n"
0115                                     "call count_50S\n"
0116                                     + gotoCode("stdoutput") );
0117                                     
0118         code->addCodeBlock( "count_50S",    "decfsz COUNT_LOOP_1,1\n"
0119                                             "goto count_50S\n"
0120                                             "decfsz COUNT_LOOP_2,1\n"
0121                                             "goto count_50S\n"
0122                                             "decfsz COUNT_LOOP_3,1\n"
0123                                             "goto count_50S\n"
0124                                             "decfsz COUNT_REPEAT,1\n"
0125                                             "goto count_50S\n"
0126                                             "return" );
0127     }
0128 #endif
0129 }