Shop OBEX P1 Docs P2 Docs Learn Events
Soft RTC — Parallax Forums

Soft RTC

RsadeikaRsadeika Posts: 3,837
edited 2013-05-17 09:16 in Propeller 1
I am using SimpleIDE 0-9-28 on a Windows 7 PC. This is a program that jazzed provided a few years back, which ran as expected on the previous versions of SimpleIDE, 0-8-5 being the last version; now, the program hangs at the settime() function. I have tried some different settings but I can not get it to work. Are there some specials settings that have to be turned on in this version of SimpleIDE?

Ray
/*
  raytime.c
   
*/

#include "simpletools.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/rtc.h>
#include <propeller.h>

#define BUFFERLEN 10

void printtime(void);
int getdst(void);
int prompttime(char *prompt);
void settime(void);

int main()
{
  // Add startup code here.
  _rtc_start_timekeeping_cog();
  pause(300);
  printf("Soft RTC.\n");
  printtime();

  settime();
  for(;;)
  {
    pause(1000);
    printtime();
  }
  return 0;  
}

void printtime(void)
{
  time_t now;
  now = time(NULL);
  printf("%s", asctime(localtime(&now)));
}

int getdst(void)
{
  int rc = 0;
  printf("Use daylight savings time [y/n] ?");
  fflush(stdout);
  rc = (getchar() == 'y') ? 1 : 0;
  getchar();
  return rc;
}

int prompttime(char *prompt)
{
  int rc = 0;
  char *endp;
  char buffer[BUFFERLEN];
  do {
    printf("Enter %s: ",prompt);
    fflush(stdout);

    fgets(buffer,BUFFERLEN,stdin);
    fflush(stdin);

    rc = strtol(buffer, &endp, 10);

    if(endp == buffer)
    {
      if('\n' == *endp)
      {
        rc = 0;
        break;
      }
      printf("Invalid entry \"%c....\" Please enter a number.\n", *endp);
    }
  } while(endp == buffer);
  return rc;
}

void settime(void)
{
  struct timeval tv;
  struct tm t;

  t.tm_isdst = getdst();
  t.tm_year = prompttime("Year")-1900;
  t.tm_mon = prompttime("Month")-1;
  t.tm_mday = prompttime("Day of the month");
  t.tm_hour = prompttime("Hour");
  t.tm_min = prompttime("Minute");
  t.tm_sec = prompttime("Second");

  tv.tv_sec = mktime(&t);
  settimeofday(&tv, 0);
  printf("Set time all done.\n");
}

Comments

  • jazzedjazzed Posts: 11,803
    edited 2013-05-15 08:02
    Hi Ray,

    Very odd. I ran the example on linux and it worked perfectly, but on windows there are issues.

    For Windows:
    1. In Simple Terminal click to check "Echo On"
    2. Click options and click to uncheck "Enter is NL"
    3. Make sure "Swap Receive CR/NL" is not checked.

    I'll file a bug to set the terminal appropriately for window.
    I have no idea at this time why we need to check "Echo On" in windows.

    The same thing happens if I remove simpletools and run with propeller-load -r -t
  • jazzedjazzed Posts: 11,803
    edited 2013-05-15 08:51
    This problem is happening because of the tiny lib. Disable the tiny lib and everything works fine with default settings.

    Andy, we have a decision to make.
  • RsadeikaRsadeika Posts: 3,837
    edited 2013-05-17 04:50
    After disabling tiny lib, the program works as expected. Now, I have a question about " _rtc_start_timekeeping_cog();", what exactly is this function doing? It seems that if I do not have that function in my program, the time seems to run as expected. If, in fact, this function is really starting another cog, am I restricted to running this program only in LMM, and CMM?

    Ray
  • jazzedjazzed Posts: 11,803
    edited 2013-05-17 08:39
    Hi Ray.

    Read this: http://propgcc.googlecode.com/hg/doc/Library.html#RTC

    The timekeeping cog is written in ASM, so there are no concerns about moving from LMM/CMM to XMM.
  • ersmithersmith Posts: 6,054
    edited 2013-05-17 09:16
    Rsadeika wrote: »
    After disabling tiny lib, the program works as expected. Now, I have a question about " _rtc_start_timekeeping_cog();", what exactly is this function doing? It seems that if I do not have that function in my program, the time seems to run as expected. If, in fact, this function is really starting another cog, am I restricted to running this program only in LMM, and CMM?

    This function starts another cog to monitor the elapsed time. If your main code calls a time related function at least once every 50 seconds or so (before the 32 bit hardware CNT overflows) then it isn't strictly necessary... but if you miss a CNT window the time will get screwed up. With another COG keeping track of the time there will never be a problem, As Steve mentioned the RTC COG code is in assembly, and works in any memory mode including XMM.
Sign In or Register to comment.