// Lab 8, Working with structs
// Programmer : Maiar Khattab
// Editor(s) used : Code Blocks 13.12
// Compiler(s) used : Code Blocks 13.12
#include<iostream>
using std:: cout ;
using std:: endl ;
#include<cstdlib>
//struct def
struct tod
{
int hour; // the hr , 0-23
int minute; // the min, 0-59
int second; //the sec, 0-59
char descr [ 32 ] ; //the description of the time of day
} ;
//void printTod(const tod&);
int main ( )
{
cout << "Lab 8, Working With structs\n " ;
cout << "Programmer: Maiar Khattab\n " ;
cout << "Editor(s) used: Code Blocks 13.12\n " ;
cout << "Compiler(s) used: Code Blocks 13.12\n " ;
cout << "File: " << __FILE__ << endl;
cout << "Complied: " << __DATE__ << " at " << __TIME__ << endl << endl;
tod theTime[ ] = { { 12 ,0 ,0 , "noon" } ,
{ 0 ,0 ,0 ," midnight" } ,
{ 6 ,00 ,00 ," supper " } ,
{ 11 ,30 ,0 ,"bedtime" } } ;
for ( int i; i < 5 ; i++ )
{
char descr [ 32 ] ;
cout << theTime[ i] .descr << " is " << theTime[ i] .hour << ':'
<< theTime[ i] .minute << ":" << theTime[ i] .second << endl;
}
}
IC8vIExhYiA4LCBXb3JraW5nIHdpdGggc3RydWN0cwovLyBQcm9ncmFtbWVyIDogTWFpYXIgS2hhdHRhYgovLyBFZGl0b3IocykgdXNlZCA6IENvZGUgQmxvY2tzIDEzLjEyCi8vIENvbXBpbGVyKHMpIHVzZWQgOiBDb2RlIEJsb2NrcyAxMy4xMgoKI2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIHN0ZDo6Y291dDsKdXNpbmcgc3RkOjplbmRsOwoKI2luY2x1ZGU8Y3N0ZGxpYj4KCi8vc3RydWN0IGRlZgpzdHJ1Y3QgdG9kCnsKaW50IGhvdXI7Ly8gdGhlIGhyICwgMC0yMwppbnQgbWludXRlOy8vIHRoZSBtaW4sIDAtNTkKaW50IHNlY29uZDsvL3RoZSBzZWMsIDAtNTkKY2hhciBkZXNjciBbMzJdOy8vdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0aW1lIG9mIGRheQoKfTsKLy92b2lkIHByaW50VG9kKGNvbnN0IHRvZCYpOwppbnQgbWFpbiAoKQp7CiAgY291dCA8PCAiTGFiIDgsIFdvcmtpbmcgV2l0aCBzdHJ1Y3RzXG4iOwogIGNvdXQgPDwgIlByb2dyYW1tZXI6IE1haWFyIEtoYXR0YWJcbiI7CiAgY291dCA8PCAiRWRpdG9yKHMpIHVzZWQ6IENvZGUgQmxvY2tzIDEzLjEyXG4iOwogIGNvdXQgPDwgIkNvbXBpbGVyKHMpIHVzZWQ6IENvZGUgQmxvY2tzIDEzLjEyXG4iOwogIGNvdXQgPDwgIkZpbGU6ICIgPDwgX19GSUxFX18gPDwgZW5kbDsKICBjb3V0IDw8ICJDb21wbGllZDogIiA8PCBfX0RBVEVfXyA8PCAiIGF0ICIgPDwgX19USU1FX18gPDwgZW5kbCA8PCBlbmRsOwoKICAgICAgICAgICAgdG9kIHRoZVRpbWVbXSA9ICB7ezEyLDAsMCwgIm5vb24ifSwKICAgICAgICAgICAgezAsMCwwLCIgbWlkbmlnaHQifSwKICAgICAgICAgICAgezYsMDAsMDAsIiBzdXBwZXIgIn0sCiAgICAgICAgICAgIHsxMSwzMCwwLCJiZWR0aW1lIn19OwogICAgICAgICAgCiAgICAgICAgICBmb3IoaW50IGk7IGkgPDU7IGkrKykKICAgICAgICAgIHsKICAgICAgICAgICAgIGNoYXIgZGVzY3IgWzMyXTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBjb3V0IDw8IHRoZVRpbWVbaV0uZGVzY3IgPDwgIiBpcyAiIDw8IHRoZVRpbWVbaV0uaG91ciA8PCAnOicgCiAgICAgICAgICAgIDw8IHRoZVRpbWVbaV0ubWludXRlIDw8ICI6IiA8PCB0aGVUaW1lW2ldLnNlY29uZCA8PCBlbmRsOyAKICAgICAgICAgIH0KfQogICAgICAKICA=
stdin
LyoKKiBBdXRob3I6IEQuIEhlcnJlbmRvZXJmZXIKKiBMaWNlbnNlOiBHUEx2MgoqCiogUHJvamVjdDogVXNlIHNhbmR3aWNoIHRvYXN0ZXIgb3ZlbiBmb3IgcmVmbG93IHByb2Nlc3NpbmcKKgoqIENvbm5lY3Rpb25zIGFyZToKKiBGb3IgdGhlIExDRDogIFBJTjQKKiAgICAgICAgICAgICAgIFBJTjUKKiAgICAgICAgICAgICAgIFBJTjYKKiAgICAgICAgICAgICAgIFBJTjcKKiAgICAgICAgICAgICAgIFBJTjgKKiAgICAgICAgICAgICAgIFBJTjkKKgoqIEZvciB0aGUgdGVtcC1wcm9iZToKKiAgICAgICAgICAgICAgIFBJTjIgKFNDSykKKiAgICAgICAgICAgICAgIFBJTjMgKENTKQoqICAgICAgICAgICAgICAgUElOMTEgKFNPKQoqCiogRm9yIHRoZSBTU1IgdG8gdGhlIEhlYXRlcjoKKiAgICAgICAgICAgICAgIFBJTjEzIAoqLwoKCiNpbmNsdWRlICZsdDtMaXF1aWRDcnlzdGFsLmgmZ3Q7CiNpbmNsdWRlICZsdDtNQVg2Njc1LmgmZ3Q7CgpMaXF1aWRDcnlzdGFsIGxjZCg4LCA5LCA0LCA1LCA2LCA3KTsKCiNkZWZpbmUgU0NLdSAyICAgICAgICAgICAgIC8vIFNDSyBwaW4gb2YgTUFYNjY3NQojZGVmaW5lIENTIDMgICAgICAgICAgICAgICAvLyBDUyBwaW4gb24gTUFYNjY3NQojZGVmaW5lIFNPIDExICAgICAgICAgICAgICAvLyBTTyBwaW4gb2YgTUFYNjY3NQojZGVmaW5lIHVuaXRzIDEgICAgICAgICAgICAvLyBVbml0cyB0byByZWFkb3V0IHRlbXAgKDAgPSByYXcsIDEgPSDLmkMsIDIgPSDLmkYpCmZsb2F0IHRlbXBlcmF0dXJlID0gMC4wOyAgIC8vIFRlbXBlcmF0dXJlIG91dHB1dCB2YXJpYWJsZQoKI2RlZmluZSBIRUFURVIgMTMKI2RlZmluZSBNSU5fT04gNSAgICAgICAgIAoKI2RlZmluZSBNQVhfU1RFUFMgMTIKCgoJCQkJCgkJCQkKCQkJCgovLyBJbml0aWFsaXplIHRoZSBNQVg2Njc1IExpYnJhcnkgZm9yIG91ciBjaGlwCk1BWDY2NzUgdGVtcChDUyxTTyxTQ0t1LHVuaXRzKTsKCnZvaWQgc2V0dXAoKSB7CiAgU2VyaWFsLmJlZ2luKDExNTAwMCk7IC8vRmFzdCwgbG9nZ2luZyBpcyBleHBlbnNpdmUKICAvLyBzZXQgdXAgdGhlIExDRCdzIG51bWJlciBvZiBjb2x1bW5zIGFuZCByb3dzOiAKICBsY2QuYmVnaW4oMTYsIDIpOwogIC8vIFByaW50IGEgbWVzc2FnZSB0byB0aGUgTENELgogIGxjZC5wcmludCgmcXVvdDtPdmVuQ29udHJvbCAxLjAmcXVvdDspOwoKICBwaW5Nb2RlKEhFQVRFUiwgT1VUUFVUKTsKfQoKCmludCBzdG9wID0gMDsKaW50IGRfbW9kZSA9IDE7ICAgLy9EaXNwbGF5IG1vZGUKCmludCBjb3VudCA9IDA7CmludCBoZWF0aW5nID0gMDsKaW50IHdhaXRpbmcgPSAwOwppbnQgcG93ZXIgPSAwOyAgICAvLyBoZWF0aW5nIHBvd2VyIGluICUKaW50IGN5Y2xlID0gMDsKCmNoYXIgcHJvZ25hbWVbMzJdID0gJnF1b3Q7JnF1b3Q7OwoKLyogUElEIFByb2Nlc3NpbmcKCktwID0gUHJvcHRpb25hbCBDb25zdGFudC4KS2kgPSBJbnRlZ3JhbCBDb25zdGFudC4KS2QgPSBEZXJpdmF0aXZlIENvbnN0YW50LgplcnIgPSBFeHBlY3RlZCBPdXRwdXQgLSBBY3R1YWwgT3V0cHV0IGllLiBlcnJvcjsKaWVyICA9IGllciBmcm9tIHByZXZpb3VzIGxvb3AgKyBlcnI7ICggaS5lLiBpbnRlZ3JhbCBlcnJvciApCmRlciAgPSBlcnIgLSBlcnIgZnJvbSBwcmV2aW91cyBsb29wOyAoIGkuZS4gZGlmZmVyZW50aWFsIGVycm9yKQpkdCA9IGV4ZWN1dGlvbiB0aW1lIG9mIGxvb3AuCgpvdXRwdXQgPSBLcCAqIGVyciArIChLaSAqIGllciAqIGR0KSArIChLZCAqIGRlciAvZHQpOwoqLwoKZmxvYXQgS3BbTUFYX1NURVBTXSA9IHsyLjB9OwpmbG9hdCBLaVtNQVhfU1RFUFNdID0gezAuMDN9OwpmbG9hdCBLZFtNQVhfU1RFUFNdID0gezAuN307CgppbnQgc3RlcHMgPSAxOwppbnQgYWN0aW9uW01BWF9TVEVQU107CmludCB3YWl0W01BWF9TVEVQU10gPSB7MH07CgpmbG9hdCBwX2xldmVsW01BWF9TVEVQU10gPSB7MS4wfTsKZmxvYXQgdGFyZ2V0X3RlbXBbTUFYX1NURVBTXSA9IHswfTsKZmxvYXQgd2luZG93X3NpemVbTUFYX1NURVBTXSA9IHswfTsKCmludCBwcm9nX3N0ZXAgPSAwOwoKZmxvYXQgZXJyID0gMDsKZmxvYXQgZXJyX3ByZXYgPSAwOwpmbG9hdCBpZXIgPSAwOwpmbG9hdCBpZXJfcHJldiA9IDA7CmZsb2F0IGRlciA9IDA7CgppbnQgcGlkX2luaXQgPSAxOwoKZmxvYXQgZHQgPSAxOwoKaW50IHByb2dfcmVhZHkgPSAwOwppbnQgcHJvZ19kb25lICA9IDA7CmZsb2F0IHByb2dfdGVtcCA9IDAuMDsKZmxvYXQgcHJvZ193aW5kb3cgPSAwLjA7CmludCAgIHByb2dfd2FpdCA9IDA7CmludCAgIHByb2dfYWN0aW9uID0gMDsKaW50IHByb2dfd2FpdGluZyA9IDA7Cgp1bnNpZ25lZCBsb25nIHRpbWUgPSBtaWxsaXMoKTsKdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVfZGlzcGxheSA9IHRpbWUgKyAzNTAwOyAgLy9TcHJlYWQgdGhlIGV2ZW50cyBzb21ld2hhdAp1bnNpZ25lZCBsb25nIG5leHRfdGltZV9rZXkgICAgID0gdGltZSArIDMyMDA7CnVuc2lnbmVkIGxvbmcgbmV4dF90aW1lX3Bvd2VyICAgPSB0aW1lICsgNDk3NTsKdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVfc2VjICAgICA9IHRpbWUgKyAxMDAwOwp1bnNpZ25lZCBsb25nIHNlY29uZHMgPSAwOwp1bnNpZ25lZCBsb25nIGNvdW50ZG93biA9IDA7CgoKLy8KLy8gVGhlIHByb2dyYW1zLCBhcyB0aGV5IGFyZSBjYWxsZWQgY2FuIHNldCBhbGwgZWxlbWVudHMKLy8gb2YgdGhlIEZTTSB0aGF0IHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcKLy8KCnZvaWQgb2ZmKCkgCnsKICBzdGVwcyA9IDE7CiAgYWN0aW9uWzBdID0gMDsKICB3YWl0WzBdID0gMDsKCiAgdGFyZ2V0X3RlbXBbMF0gPSAwOwogIEtwWzBdID0gMC4wOwogIEtpWzBdID0gMC4wOwogIEtkWzBdID0gMC4wOwogIAogIHBfbGV2ZWxbMF0gPSAwLjA7CiAgd2luZG93X3NpemVbMF0gPSAxLjA7CgogIHNwcmludGYocHJvZ25hbWUsJnF1b3Q7b2ZmJnF1b3Q7KTsKICBwaWRfaW5pdCA9IDE7CgogIHNlcmlhbExvZ0luaXQoMCk7Cn0KCnZvaWQgcHJlaGVhdCgpIAp7CiAgc3RlcHMgPSAxOwogIGFjdGlvblswXSA9IDA7CiAgd2FpdFswXSA9IDA7CiAgCiAgdGFyZ2V0X3RlbXBbMF0gPSA0MDsKICBLcFswXSA9IDIuMDsKICBLaVswXSA9IDAuMDA3OwogIEtkWzBdID0gMy4wOwogIAogIHBfbGV2ZWxbMF0gPSAwLjc7CiAgd2luZG93X3NpemVbMF0gPSAxLjA7CgogIHNwcmludGYocHJvZ25hbWUsJnF1b3Q7cHJlaGVhdCZxdW90Oyk7CiAgcGlkX2luaXQgPSAxOwoKICBzZXJpYWxMb2dJbml0KDApOwp9Cgp2b2lkIGhlYXQoKSAKewogIHN0ZXBzID0gMTsKICBhY3Rpb25bMF0gPSAwOwogIHdhaXRbMF0gPSAwOwoKICB0YXJnZXRfdGVtcFswXSA9IDE1MDsKICBLcFswXSA9IDEuMjsKICBLaVswXSA9IDAuMDU7CiAgS2RbMF0gPSAzLjA7CiAgCiAgcF9sZXZlbFswXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVswXSA9IDAuMDsKCiAgc3ByaW50Zihwcm9nbmFtZSwmcXVvdDtoZWF0JnF1b3Q7KTsKICBwaWRfaW5pdCA9IDE7CiAgCiAgc2VyaWFsTG9nSW5pdCgwKTsKfQoKdm9pZCBjdXJ2ZV8yMTUoKSAKewogIGludCBzPTA7CgogIC8vIFN0ZXAgMDoKICBhY3Rpb25bc10gPSAwOwogIHdhaXRbc10gPSAwOwogIHRhcmdldF90ZW1wW3NdID0gNDA7CiAgS3Bbc10gPSAzLjA7CiAgS2lbc10gPSAwLjAwNzsKICBLZFtzXSA9IDAuMDsKICBwX2xldmVsW3NdID0gMS4wOwogIHdpbmRvd19zaXplW3NdID0gMC4wOwogIHMrKzsKCiAgLy8gU3RlcCAxOgogIGFjdGlvbltzXSA9IDE7CiAgd2FpdFtzXSA9IDA7CiAgdGFyZ2V0X3RlbXBbc10gPSA0MDsKICBLcFtzXSA9IDMuNTsKICBLaVtzXSA9IDAuMDA3OwogIEtkW3NdID0gMC4wOwogIHBfbGV2ZWxbc10gPSAxLjA7CiAgd2luZG93X3NpemVbc10gPSAwLjA7CiAgcysrOwoKICAvLyBTdGVwIDI6IDEwMCBkZWcgc3RhcnQKICBhY3Rpb25bc10gPSAwOwogIHdhaXRbc10gPSAwOwogIHRhcmdldF90ZW1wW3NdID0gMTAwOwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAyLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgMzogMTIwIDMwcwogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDMwOwogIHRhcmdldF90ZW1wW3NdID0gMTIwOwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgNDogMTMwIDMwcwogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDMwOwogIHRhcmdldF90ZW1wW3NdID0gMTMwOwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgNTogMTM1IDMwcwogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDMwOwogIHRhcmdldF90ZW1wW3NdID0gMTM1OwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgNjogMTQwIDMwcwogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDMwOwogIHRhcmdldF90ZW1wW3NdID0gMTQwOwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgNzogMTQ1IDMwcwogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDMwOwogIHRhcmdldF90ZW1wW3NdID0gMTQ1OwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgODogMTUwIAogIGFjdGlvbltzXSA9IDA7CiAgd2FpdFtzXSA9IDA7CiAgdGFyZ2V0X3RlbXBbc10gPSAxNTA7CiAgS3Bbc10gPSA0LjU7CiAgS2lbc10gPSAwLjAwNzsKICBLZFtzXSA9IDAuMDsKICBwX2xldmVsW3NdID0gMS4wOwogIHdpbmRvd19zaXplW3NdID0gMC4wOwogIHMrKzsKCiAgLy8gU3RlcCA5OiAyMjUgMTBzIAogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDEwOwogIHRhcmdldF90ZW1wW3NdID0gMjI1OwogIEtwW3NdID0gNS4wOwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAzLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDAuMDsKICBzKys7CgogIC8vIFN0ZXAgMTA6IDAgIAogIGFjdGlvbltzXSA9IDA7CiAgd2FpdFtzXSA9IDA7CiAgdGFyZ2V0X3RlbXBbc10gPSAwOwogIEtwW3NdID0gNS4wOwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDAuMDsKICBzKys7CiAgCiAgc3RlcHMgPSBzOwogIHNwcmludGYocHJvZ25hbWUsJnF1b3Q7Y3VydmUtMjE1JnF1b3Q7KTsKICBwaWRfaW5pdCA9IDE7CgogIHNlcmlhbExvZ0luaXQoMCk7Cn0KCnZvaWQgY3VydmVfMjQwKCkgCnsKICBpbnQgcz0wOwoKICAvLyBTdGVwIDA6CiAgYWN0aW9uW3NdID0gMDsKICB3YWl0W3NdID0gMDsKICB0YXJnZXRfdGVtcFtzXSA9IDQwOwogIEtwW3NdID0gNC4wOwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDAuMDsKICBzKys7CgogIC8vIFN0ZXAgMToKICBhY3Rpb25bc10gPSAxOwogIHdhaXRbc10gPSAwOwogIHRhcmdldF90ZW1wW3NdID0gNDA7CiAgS3Bbc10gPSA0LjU7CiAgS2lbc10gPSAwLjAwNzsKICBLZFtzXSA9IDAuMDsKICBwX2xldmVsW3NdID0gMS4wOwogIHdpbmRvd19zaXplW3NdID0gMC4wOwogIHMrKzsKCiAgLy8gU3RlcCAyOiAxNTAgZGVnIHN0YXJ0CiAgYWN0aW9uW3NdID0gMDsKICB3YWl0W3NdID0gMDsKICB0YXJnZXRfdGVtcFtzXSA9IDE1MDsKICBLcFtzXSA9IDQuNTsKICBLaVtzXSA9IDAuMDA3OwogIEtkW3NdID0gMC4wOwogIHBfbGV2ZWxbc10gPSAxLjA7CiAgd2luZG93X3NpemVbc10gPSAxLjA7CiAgcysrOwoKICAvLyBTdGVwIDM6IDE1NSAzMHMKICBhY3Rpb25bc10gPSAyOwogIHdhaXRbc10gPSAzMDsKICB0YXJnZXRfdGVtcFtzXSA9IDE1NTsKICBLcFtzXSA9IDQuNTsKICBLaVtzXSA9IDAuMDA3OwogIEtkW3NdID0gMC4wOwogIHBfbGV2ZWxbc10gPSAxLjA7CiAgd2luZG93X3NpemVbc10gPSAxLjA7CiAgcysrOwoKICAvLyBTdGVwIDQ6IDE2MCAzMHMKICBhY3Rpb25bc10gPSAyOwogIHdhaXRbc10gPSAzMDsKICB0YXJnZXRfdGVtcFtzXSA9IDE2MDsKICBLcFtzXSA9IDQuNTsKICBLaVtzXSA9IDAuMDA3OwogIEtkW3NdID0gMC4wOwogIHBfbGV2ZWxbc10gPSAxLjA7CiAgd2luZG93X3NpemVbc10gPSAxLjA7CiAgcysrOwoKICAvLyBTdGVwIDU6IDE2NSAzMHMKICBhY3Rpb25bc10gPSAyOwogIHdhaXRbc10gPSAzMDsKICB0YXJnZXRfdGVtcFtzXSA9IDE2NTsKICBLcFtzXSA9IDQuNTsKICBLaVtzXSA9IDAuMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgNjogMTcwIDMwcwogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDMwOwogIHRhcmdldF90ZW1wW3NdID0gMTcwOwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgNzogMTc1IDMwcwogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDMwOwogIHRhcmdldF90ZW1wW3NdID0gMTc1OwogIEtwW3NdID0gNC41OwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgODogMTgwIAogIGFjdGlvbltzXSA9IDA7CiAgd2FpdFtzXSA9IDA7CiAgdGFyZ2V0X3RlbXBbc10gPSAxODA7CiAgS3Bbc10gPSA0LjU7CiAgS2lbc10gPSAwLjAwNzsKICBLZFtzXSA9IDAuMDsKICBwX2xldmVsW3NdID0gMS4wOwogIHdpbmRvd19zaXplW3NdID0gMS4wOwogIHMrKzsKCiAgLy8gU3RlcCA5OiAyNTUgMTBzIAogIGFjdGlvbltzXSA9IDI7CiAgd2FpdFtzXSA9IDEwOwogIHRhcmdldF90ZW1wW3NdID0gMjU1OwogIEtwW3NdID0gOC4wOwogIEtpW3NdID0gMC4wMDc7CiAgS2Rbc10gPSAzLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDAuMDsKICBzKys7CgogIC8vIFN0ZXAgMTA6IDI1NSAxMHMgCiAgYWN0aW9uW3NdID0gMDsKICB3YWl0W3NdID0gMDsKICB0YXJnZXRfdGVtcFtzXSA9IDA7CiAgS3Bbc10gPSAxMC4wOwogIEtpW3NdID0gMC4wOwogIEtkW3NdID0gMC4wOwogIHBfbGV2ZWxbc10gPSAxLjA7CiAgd2luZG93X3NpemVbc10gPSAwLjA7CiAgcysrOwogIAogIHN0ZXBzID0gczsKCiAgc3ByaW50Zihwcm9nbmFtZSwmcXVvdDtjdXJ2ZS0yNDAmcXVvdDspOwogIHBpZF9pbml0ID0gMTsKCiAgc2VyaWFsTG9nSW5pdCgwKTsKfQoKdm9pZCB0ZXN0KCkgCnsKICBpbnQgcz0wOwogIAogIC8vIFN0ZXAgMToKICBhY3Rpb25bc10gPSA1OwogIHdhaXRbc10gPSAyMDsKICB0YXJnZXRfdGVtcFtzXSA9IDI1MDsKICBLcFtzXSA9IDQuMDsKICBLaVtzXSA9IDAuMDE7CiAgS2Rbc10gPSAwLjA7CiAgcF9sZXZlbFtzXSA9IDEuMDsKICB3aW5kb3dfc2l6ZVtzXSA9IDEuMDsKICBzKys7CgogIC8vIFN0ZXAgMjoKICBhY3Rpb25bc10gPSAxOwogIHdhaXRbc10gPSAwOwogIHRhcmdldF90ZW1wW3NdID0gMjMwOwogIEtwW3NdID0gNC4wOwogIEtpW3NdID0gMC4wMTsKICBLZFtzXSA9IDAuMDsKICBwX2xldmVsW3NdID0gMS4wOwogIHdpbmRvd19zaXplW3NdID0gMS4wOwogIHMrKzsKCiAgLy8gU3RlcCAzOgogIGFjdGlvbltzXSA9IDA7CiAgd2FpdFtzXSA9IDA7CiAgdGFyZ2V0X3RlbXBbc10gPSAyMzA7CiAgS3Bbc10gPSA0LjA7CiAgS2lbc10gPSAwLjAxOwogIEtkW3NdID0gMC4wOwogIHBfbGV2ZWxbc10gPSAxLjA7CiAgd2luZG93X3NpemVbc10gPSAxLjA7CiAgcysrOwogIAogIHN0ZXBzID0gczsKICBzcHJpbnRmKHByb2duYW1lLCZxdW90O3Rlc3QmcXVvdDspOwogIHBpZF9pbml0ID0gMTsKCiAgc2VyaWFsTG9nSW5pdCgwKTsKfQoKLy8KLy8gVGhlIG1vZGUgc2VsZWN0b3IgZm9yIHRoZSBydW5uaW5nIHByb2dyYW1zIGZyb20gYWJvdmUKLy8geW91IGNhbiBhZGQgYW55IGhlcmUsIGFuZCBpbXBsZW1lbnQgYWJvdmUKLy8KCmludCBtb2RlID0gMjsKCnZvaWQgZG9fbW9kZShpbnQgdG1vZGUpCnsKICBzd2l0Y2godG1vZGUpewogICAgY2FzZSAwOgogICAgICAvLyBMb3dlciBMSU1JVCAtIGlnbm9yZQogICAgICBtb2RlPTE7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAvLyBvZmYKICAgICAgb2ZmKCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICAvLyBwcmVoZWF0CiAgICAgIHByZWhlYXQoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIC8vIGhlYXQKICAgICAgaGVhdCgpOwogICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgLy8gY3VydmUKICAgICAgY3VydmVfMjE1KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSA1OgogICAgICAvLyBjdXJ2ZQogICAgICBjdXJ2ZV8yNDAoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDY6CiAgICAgIC8vIHRlc3QKICAgICAgdGVzdCgpOwogICAgICBicmVhazsKICAgIGNhc2UgNzoKICAgICAgLy8gVXBwZXIgTElNSVQgLSBpZ25vcmUKICAgICAgbW9kZT02OwogICAgICBicmVhazsKICB9CiAgCiAgLy8gcmVzZXQgdGhlIGZzbQogIHByb2dfcmVhZHkgPSAwOwogIHByb2dfc3RlcCA9IDA7CiAgY291bnRkb3duID0gMDsKICB3YWl0aW5nID0gMDsKICBoZWF0aW5nID0gMDsKfQoKaW50IGlfa2V5ID0gMTAyNDsKaW50IHBfa2V5ID0gMTAyNDsKaW50IGtleSA9IDEwMjQ7IC8vIElucHV0IGJ1dHRvbnMKCnZvaWQgbG9vcCgpCnsKICAvLyBwcmVzZWxlY3Qgc2V0dGluZ3MgMXN0IHRpbWUuCiAgZG9fbW9kZShtb2RlKTsKICAKICAvLyBTY2hlZHVsZXIgCiAgd2hpbGUgKCFzdG9wKSB7CiAgICB0aW1lID0gbWlsbGlzKCk7CgogICAgLy8gU2NoZWR1bGluZzoKICAgIGlmICgobG9uZykodGltZSAtIG5leHRfdGltZV9wb3dlcikgJmd0OyAwKSB7CiAgICAgIG5leHRfdGltZV9wb3dlciArPSA1MDsgLy8gcmVwZWF0IGV2ZXJ5IDUwbXMKICAgICAgZG9fb3ZlbigpOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoKGxvbmcpKHRpbWUgLSBuZXh0X3RpbWVfa2V5KSAmZ3Q7IDApIHsKICAgICAgbmV4dF90aW1lX2tleSArPSAxMDA7IC8vIHJlcGVhdCBldmVyeSAxMDBtcwogICAgICByZWFkX2tleXBhZCgpOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoKGxvbmcpKHRpbWUgLSBuZXh0X3RpbWVfc2VjKSAmZ3Q7IDApIHsKICAgICAgbmV4dF90aW1lX3NlYyArPSAxMDAwOyAvLyByZXBlYXQgZXZlcnkgMTAwMG1zCiAgICAgIHNlY29uZHMrKzsKICAgICAgaWYgKGNvdW50ZG93biAmZ3Q7IDApCiAgICAgICAgY291bnRkb3duLS07CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgCiAgICAvLyBVc2VyIGludGVyZmFjZToKICAgIGlmICgobG9uZykodGltZSAtIG5leHRfdGltZV9kaXNwbGF5KSAmZ3Q7IDAgfHwga2V5ICE9IDEwMjQpIHsKICAgICAgCiAgICAgIGlmIChrZXkgPT0gMTAyNCkKICAgICAgICBuZXh0X3RpbWVfZGlzcGxheSArPSAxMDAwOwogICAgICBlbHNlCiAgICAgICAgbmV4dF90aW1lX2Rpc3BsYXkgPSBtaWxsaXMoKSArIDIwMDA7IAoKICAgICAgdGVtcGVyYXR1cmUgPSB0ZW1wLnJlYWRfdGVtcCgpOwovLyAgICAgIHRlbXBlcmF0dXJlID0gc2ltX3JlYWQoKTsKCiAgICAgIC8vIFBhc3MgdGhyb3VnaCB0aGUgaGVhdGluZyBGU00gaGFuZGxlciAKICAgICAgcHJvZ19oZWF0aW5nKCk7ICAgICAgCiAgICAgIAogICAgICBpZiAoIXByb2dfd2FpdGluZykKICAgICAgewogICAgICAgIGlmIChrZXkgPT0gMCkgeyAvLyBMZWZ0IGFuZCByaWdodCBrZXlzIHN3aXRjaCBtb2RlCiAgICAgICAgICAvLyByaWdodCBrZXkKICAgICAgICAgIG1vZGUrKzsKICAgICAgICAgIGRvX21vZGUobW9kZSk7CiAgICAgICAgICBjb3VudD0wOwogICAgICAgICAgcHJvZ19yZWFkeSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChrZXkgJmd0OyA0MDAgJmFtcDsmYW1wOyBrZXkgJmx0OyA0MTUpIHsKICAgICAgICAgIC8vIGxlZnQga2V5CiAgICAgICAgICBtb2RlLS07CiAgICAgICAgICBkb19tb2RlKG1vZGUpOwogICAgICAgICAgY291bnQ9MDsKICAgICAgICAgIHByb2dfcmVhZHkgPSAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRfbW9kZSA9PSAxKSB7ICAvLyBVcCBhbmQgZG93biBrZXlzIGZvciBkaXNwbGF5IG1vZGUgMQogICAgICAgICAgaWYgKGtleSAmZ3Q7IDk3ICZhbXA7JmFtcDsga2V5ICZsdDsgMTA1KSB7CiAgICAgICAgICAgIC8vIHVwIGtleQogICAgICAgICAgICBwcm9nX3RlbXAgKz0gNS4wOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGtleSAmZ3Q7IDI0NSAmYW1wOyZhbXA7IGtleSAmbHQ7IDI2MCkgewogICAgICAgICAgICAvLyBkb3duIGtleQogICAgICAgICAgICBwcm9nX3RlbXAgLT0gNS4wOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGtleSAmZ3Q7IDYzNSAmYW1wOyZhbXA7IGtleSAmbHQ7IDY0NSkgewogICAgICAgIC8vIHNlbGVjdCBrZXkKICAgICAgICBwcm9nX3dhaXRpbmcgPSAwOwogICAgICB9CiAgICAgIAogICAgICBpZiAoZF9tb2RlID09IDEpIHsgLy8gRGlzcGxheSBtb2RlIDEgCiAgICAgICAgZG9fZGlzcGxheSgpOwogICAgICB9CiAgICAgIAogICAgICBjb3VudCsrOwogICAgICBrZXkgPSAxMDI0OyAvL3Jlc2V0IGtleXMKICAgIH0KICB9ICAKfQo=
/*
* Author: D. Herrendoerfer
* License: GPLv2
*
* Project: Use sandwich toaster oven for reflow processing
*
* Connections are:
* For the LCD: PIN4
* PIN5
* PIN6
* PIN7
* PIN8
* PIN9
*
* For the temp-probe:
* PIN2 (SCK)
* PIN3 (CS)
* PIN11 (SO)
*
* For the SSR to the Heater:
* PIN13
*/
#include <LiquidCrystal.h>
#include <MAX6675.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define SCKu 2 // SCK pin of MAX6675
#define CS 3 // CS pin on MAX6675
#define SO 11 // SO pin of MAX6675
#define units 1 // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F)
float temperature = 0.0; // Temperature output variable
#define HEATER 13
#define MIN_ON 5
#define MAX_STEPS 12
// Initialize the MAX6675 Library for our chip
MAX6675 temp(CS,SO,SCKu,units);
void setup() {
Serial.begin(115000); //Fast, logging is expensive
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("OvenControl 1.0");
pinMode(HEATER, OUTPUT);
}
int stop = 0;
int d_mode = 1; //Display mode
int count = 0;
int heating = 0;
int waiting = 0;
int power = 0; // heating power in %
int cycle = 0;
char progname[32] = "";
/* PID Processing
Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
ier = ier from previous loop + err; ( i.e. integral error )
der = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.
output = Kp * err + (Ki * ier * dt) + (Kd * der /dt);
*/
float Kp[MAX_STEPS] = {2.0};
float Ki[MAX_STEPS] = {0.03};
float Kd[MAX_STEPS] = {0.7};
int steps = 1;
int action[MAX_STEPS];
int wait[MAX_STEPS] = {0};
float p_level[MAX_STEPS] = {1.0};
float target_temp[MAX_STEPS] = {0};
float window_size[MAX_STEPS] = {0};
int prog_step = 0;
float err = 0;
float err_prev = 0;
float ier = 0;
float ier_prev = 0;
float der = 0;
int pid_init = 1;
float dt = 1;
int prog_ready = 0;
int prog_done = 0;
float prog_temp = 0.0;
float prog_window = 0.0;
int prog_wait = 0;
int prog_action = 0;
int prog_waiting = 0;
unsigned long time = millis();
unsigned long next_time_display = time + 3500; //Spread the events somewhat
unsigned long next_time_key = time + 3200;
unsigned long next_time_power = time + 4975;
unsigned long next_time_sec = time + 1000;
unsigned long seconds = 0;
unsigned long countdown = 0;
//
// The programs, as they are called can set all elements
// of the FSM that the controller is running
//
void off()
{
steps = 1;
action[0] = 0;
wait[0] = 0;
target_temp[0] = 0;
Kp[0] = 0.0;
Ki[0] = 0.0;
Kd[0] = 0.0;
p_level[0] = 0.0;
window_size[0] = 1.0;
sprintf(progname,"off");
pid_init = 1;
serialLogInit(0);
}
void preheat()
{
steps = 1;
action[0] = 0;
wait[0] = 0;
target_temp[0] = 40;
Kp[0] = 2.0;
Ki[0] = 0.007;
Kd[0] = 3.0;
p_level[0] = 0.7;
window_size[0] = 1.0;
sprintf(progname,"preheat");
pid_init = 1;
serialLogInit(0);
}
void heat()
{
steps = 1;
action[0] = 0;
wait[0] = 0;
target_temp[0] = 150;
Kp[0] = 1.2;
Ki[0] = 0.05;
Kd[0] = 3.0;
p_level[0] = 1.0;
window_size[0] = 0.0;
sprintf(progname,"heat");
pid_init = 1;
serialLogInit(0);
}
void curve_215()
{
int s=0;
// Step 0:
action[s] = 0;
wait[s] = 0;
target_temp[s] = 40;
Kp[s] = 3.0;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
// Step 1:
action[s] = 1;
wait[s] = 0;
target_temp[s] = 40;
Kp[s] = 3.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
// Step 2: 100 deg start
action[s] = 0;
wait[s] = 0;
target_temp[s] = 100;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 2.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 3: 120 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 120;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 4: 130 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 130;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 5: 135 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 135;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 6: 140 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 140;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 7: 145 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 145;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 8: 150
action[s] = 0;
wait[s] = 0;
target_temp[s] = 150;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
// Step 9: 225 10s
action[s] = 2;
wait[s] = 10;
target_temp[s] = 225;
Kp[s] = 5.0;
Ki[s] = 0.007;
Kd[s] = 3.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
// Step 10: 0
action[s] = 0;
wait[s] = 0;
target_temp[s] = 0;
Kp[s] = 5.0;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
steps = s;
sprintf(progname,"curve-215");
pid_init = 1;
serialLogInit(0);
}
void curve_240()
{
int s=0;
// Step 0:
action[s] = 0;
wait[s] = 0;
target_temp[s] = 40;
Kp[s] = 4.0;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
// Step 1:
action[s] = 1;
wait[s] = 0;
target_temp[s] = 40;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
// Step 2: 150 deg start
action[s] = 0;
wait[s] = 0;
target_temp[s] = 150;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 3: 155 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 155;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 4: 160 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 160;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 5: 165 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 165;
Kp[s] = 4.5;
Ki[s] = 0.07;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 6: 170 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 170;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 7: 175 30s
action[s] = 2;
wait[s] = 30;
target_temp[s] = 175;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 8: 180
action[s] = 0;
wait[s] = 0;
target_temp[s] = 180;
Kp[s] = 4.5;
Ki[s] = 0.007;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 9: 255 10s
action[s] = 2;
wait[s] = 10;
target_temp[s] = 255;
Kp[s] = 8.0;
Ki[s] = 0.007;
Kd[s] = 3.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
// Step 10: 255 10s
action[s] = 0;
wait[s] = 0;
target_temp[s] = 0;
Kp[s] = 10.0;
Ki[s] = 0.0;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 0.0;
s++;
steps = s;
sprintf(progname,"curve-240");
pid_init = 1;
serialLogInit(0);
}
void test()
{
int s=0;
// Step 1:
action[s] = 5;
wait[s] = 20;
target_temp[s] = 250;
Kp[s] = 4.0;
Ki[s] = 0.01;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 2:
action[s] = 1;
wait[s] = 0;
target_temp[s] = 230;
Kp[s] = 4.0;
Ki[s] = 0.01;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
// Step 3:
action[s] = 0;
wait[s] = 0;
target_temp[s] = 230;
Kp[s] = 4.0;
Ki[s] = 0.01;
Kd[s] = 0.0;
p_level[s] = 1.0;
window_size[s] = 1.0;
s++;
steps = s;
sprintf(progname,"test");
pid_init = 1;
serialLogInit(0);
}
//
// The mode selector for the running programs from above
// you can add any here, and implement above
//
int mode = 2;
void do_mode(int tmode)
{
switch(tmode){
case 0:
// Lower LIMIT - ignore
mode=1;
break;
case 1:
// off
off();
break;
case 2:
// preheat
preheat();
break;
case 3:
// heat
heat();
break;
case 4:
// curve
curve_215();
break;
case 5:
// curve
curve_240();
break;
case 6:
// test
test();
break;
case 7:
// Upper LIMIT - ignore
mode=6;
break;
}
// reset the fsm
prog_ready = 0;
prog_step = 0;
countdown = 0;
waiting = 0;
heating = 0;
}
int i_key = 1024;
int p_key = 1024;
int key = 1024; // Input buttons
void loop()
{
// preselect settings 1st time.
do_mode(mode);
// Scheduler
while (!stop) {
time = millis();
// Scheduling:
if ((long)(time - next_time_power) > 0) {
next_time_power += 50; // repeat every 50ms
do_oven();
continue;
}
if ((long)(time - next_time_key) > 0) {
next_time_key += 100; // repeat every 100ms
read_keypad();
continue;
}
if ((long)(time - next_time_sec) > 0) {
next_time_sec += 1000; // repeat every 1000ms
seconds++;
if (countdown > 0)
countdown--;
continue;
}
// User interface:
if ((long)(time - next_time_display) > 0 || key != 1024) {
if (key == 1024)
next_time_display += 1000;
else
next_time_display = millis() + 2000;
temperature = temp.read_temp();
// temperature = sim_read();
// Pass through the heating FSM handler
prog_heating();
if (!prog_waiting)
{
if (key == 0) { // Left and right keys switch mode
// right key
mode++;
do_mode(mode);
count=0;
prog_ready = 0;
}
if (key > 400 && key < 415) {
// left key
mode--;
do_mode(mode);
count=0;
prog_ready = 0;
}
if (d_mode == 1) { // Up and down keys for display mode 1
if (key > 97 && key < 105) {
// up key
prog_temp += 5.0;
}
if (key > 245 && key < 260) {
// down key
prog_temp -= 5.0;
}
}
}
if (key > 635 && key < 645) {
// select key
prog_waiting = 0;
}
if (d_mode == 1) { // Display mode 1
do_display();
}
count++;
key = 1024; //reset keys
}
}
}