peony3000

Gadgeteer_Simple_Wifi_01 (Partial)

Apr 24th, 2013
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 24.32 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Threading;
  4. using System.IO;
  5. using System.Net;
  6. using Microsoft.SPOT;
  7. using Microsoft.SPOT.Presentation;
  8. using Microsoft.SPOT.Presentation.Controls;
  9. using Microsoft.SPOT.Presentation.Media;
  10. using Microsoft.SPOT.Touch;
  11. // add the time methods
  12. using Microsoft.SPOT.Time;
  13.  
  14. using Gadgeteer.Networking;
  15. using GT = Gadgeteer;
  16. using GTM = Gadgeteer.Modules;
  17. using Gadgeteer.Modules.GHIElectronics;
  18.  
  19. namespace Gadgeteer_Simple_Wifi_01
  20. {
  21.     public partial class Program
  22.     {
  23.         // create new timer event
  24.         // to start the wifi
  25.         GT.Timer wifiTimer = new GT.Timer(4000, GT.Timer.BehaviorType.RunOnce);
  26.  
  27.         // create new timer event
  28.         // to trigger the calendar query every 15 minutes
  29.         //GT.Timer calendarTimer = new GT.Timer(15 * 60 * 1000, GT.Timer.BehaviorType.RunContinuously);
  30.         GT.Timer calendarTimer = new GT.Timer(1 * 60 * 1000, GT.Timer.BehaviorType.RunContinuously);
  31.  
  32.         // is the wifi connected
  33.         bool wifiConnected = false;
  34.  
  35.         // current time and date
  36.  
  37.  
  38.         // AM or PM marker
  39.         bool morningMarker;
  40.  
  41.         // offsets for creating the clock slots
  42.         int pmOffset = 12;
  43.         int dayOffset = 1;
  44.  
  45.         // 30 minute meeting slot arrays
  46.         // for 12 hours
  47.         DateTime[] slotStartTime = new DateTime[24];
  48.         DateTime[] slotEndTime = new DateTime[24];
  49.         bool[] eventSlot = new bool[24];
  50.         bool[] eventEdge = new bool[24];
  51.  
  52.         int currentSlot = 0;
  53.  
  54.         //DispatcherTimer timer;
  55.         bool timeSynchronized;
  56.  
  57.  
  58.         // This method is run when the mainboard is powered up or reset.  
  59.         void ProgramStarted()
  60.         {
  61.             /*******************************************************************************************
  62.             Modules added in the Program.gadgeteer designer view are used by typing
  63.             their name followed by a period, e.g.  button.  or  camera.
  64.            
  65.             Many modules generate useful events. Type +=<tab><tab> to add a handler to an event, e.g.:
  66.                 button.ButtonPressed +=<tab><tab>
  67.            
  68.             If you want to do something periodically, use a GT.Timer and handle its Tick event, e.g.:
  69.                 GT.Timer timer = new GT.Timer(1000); // every second (1000ms)
  70.                 timer.Tick +=<tab><tab>
  71.                 timer.Start();
  72.             *******************************************************************************************/
  73.  
  74.             // jump out of the program start to startWifi later
  75.             // create a timer event handler robot
  76.             wifiTimer.Tick += new GT.Timer.TickEventHandler(wifiTimer_Tick);
  77.             // start the timer
  78.             wifiTimer.Start();
  79.  
  80.             // query the calendar every 15 minutes
  81.             // create a timer event handler robot
  82.             calendarTimer.Tick += new GT.Timer.TickEventHandler(calendarTimer_Tick);
  83.  
  84.             //DateTime from the internet
  85.             TimeService.SystemTimeChanged += new SystemTimeChangedEventHandler(TimeService_SystemTimeChanged);
  86.             TimeService.TimeSyncFailed += new TimeSyncFailedEventHandler(TimeService_TimeSyncFailed);
  87.  
  88.             // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
  89.             Debug.Print("Program Started");
  90.         }
  91.  
  92.  
  93.         void calendarTimer_Tick(GT.Timer timer)
  94.         {
  95.             // query the web based calendar
  96.             getFromWeb();
  97.         }
  98.  
  99.         void wifiTimer_Tick(GT.Timer timer)
  100.         {
  101.             // start the wifi
  102.             startWifi();
  103.  
  104.             // make sure the timer stops
  105.             timer.Stop();
  106.         }
  107.  
  108.         void startWifi()
  109.         {
  110.  
  111.             if (!wifi_RS21.Interface.IsOpen)
  112.             {
  113.                 wifi_RS21.Interface.Open();
  114.             }
  115.  
  116.             if (!wifi_RS21.Interface.NetworkInterface.IsDhcpEnabled)
  117.             {
  118.                 wifi_RS21.Interface.NetworkInterface.EnableDhcp();
  119.             }
  120.  
  121.             GHI.Premium.Net.NetworkInterfaceExtension.AssignNetworkingStackTo(wifi_RS21.Interface);
  122.  
  123.             wifi_RS21.Interface.WirelessConnectivityChanged += new GHI.Premium.Net.WiFiRS9110.WirelessConnectivityChangedEventHandler(Interface_WirelessConnectivityChanged);
  124.             //wifi_RS21.Interface.NetworkAddressChanged += new GHI.Premium.Net.NetworkInterfaceExtension.NetworkAddressChangedEventHandler(Interface_NetworkAddressChanged);
  125.  
  126.             // Your router SSID needed here
  127.             //String networkName = "RISD-MiscDevices";
  128.             String networkName = "networkname";
  129.             // Your network password here
  130.             //String networkPassword = "R1sdB34ch2012";
  131.             String networkPassword = "password";
  132.  
  133.             try
  134.             {
  135.                 Debug.Print("Trying the network");
  136.  
  137.                 // wifi needs your SSID network name
  138.                 GHI.Premium.Net.WiFiNetworkInfo[] ScanResp = wifi_RS21.Interface.Scan(networkName);
  139.  
  140.                 if (ScanResp != null && ScanResp.Length > 0)
  141.                 {
  142.                     // wifi needs the password key
  143.                     wifi_RS21.Interface.Join(ScanResp[0], networkPassword);
  144.                     Debug.Print("***Connected to network...");
  145.                 }
  146.                 else
  147.                 {
  148.                     Debug.Print("***Wireless network was not found");
  149.                 }
  150.             }
  151.             catch (Exception e)
  152.             {
  153.                 Debug.Print("!!! Exception : " + e.Message);
  154.             }
  155.  
  156.             // connected!
  157.             Debug.Print("Network connected here first?");
  158.             wifiConnected = true;
  159.  
  160.             // set the time
  161.             setWorldTime();
  162.  
  163.         }
  164.  
  165.         void setWorldTime()
  166.         {
  167.             // Configure TimeService settings
  168.             // create a settings object
  169.             TimeServiceSettings settings = new TimeServiceSettings();
  170.  
  171.             // fill the settings
  172.             settings.ForceSyncAtWakeUp = true;
  173.             // refresh time in seconds
  174.             settings.RefreshTime = 1800;
  175.  
  176.             // set up some time servers
  177.             IPAddress[] address = Dns.GetHostEntry("time-a.nist.gov").AddressList;
  178.             if (address != null && address.Length > 0)
  179.             {
  180.                 settings.PrimaryServer = address[0].GetAddressBytes();
  181.             }
  182.  
  183.             address = Dns.GetHostEntry("pool.ntp.org").AddressList;
  184.             if (address != null && address.Length > 0)
  185.             {
  186.                 settings.AlternateServer = address[0].GetAddressBytes();
  187.             }
  188.  
  189.             // load the settings
  190.             TimeService.Settings = settings;
  191.  
  192.             // Add the time zone offset to the retrieved UTC Time
  193.             // (in this example, it assumes that time zone is GMT - 4 hours).
  194.             // this doesn't work?
  195.             TimeService.SetTimeZoneOffset(60 * -4);
  196.  
  197.             // start the time service running
  198.             TimeService.Start();
  199.  
  200.         }
  201.  
  202.         void TimeService_TimeSyncFailed(object sender, TimeSyncFailedEventArgs e)
  203.         {
  204.             Debug.Print("Failed: " + e.ErrorCode);
  205.         }
  206.  
  207.         void TimeService_SystemTimeChanged(object sender, SystemTimeChangedEventArgs e)
  208.         {
  209.             // the time has been returned
  210.             Debug.Print("Time set at: " + e.EventTime);
  211.  
  212.             //Debug.Print("Network time received.");
  213.             if (!timeSynchronized)
  214.             {
  215.                 // make a note that the time has been set
  216.                 timeSynchronized = true;
  217.  
  218.                 // get the calendar info for the first time
  219.                 getFromWeb();
  220.             }
  221.         }
  222.  
  223.         void Interface_WirelessConnectivityChanged(object sender, GHI.Premium.Net.WiFiRS9110.WirelessConnectivityEventArgs e)
  224.         {
  225.             // network up
  226.             if (e.IsConnected)
  227.             {
  228.                 Debug.Print("Network connected!");
  229.                 // set the time here?
  230.             }
  231.             else
  232.             {
  233.                 Debug.Print("Not conneced");
  234.             }
  235.         }
  236.  
  237.         void getFromWeb()
  238.         {
  239.  
  240.             // ask the calendar for the previous and next 24 hours
  241.             WebClient.GetFromWeb("http://inbetwixt.com/calendar/calendar.json").ResponseReceived += new HttpRequest.ResponseHandler(Program_ResponseReceived);
  242.  
  243.             Debug.Print("***Waiting for response...");
  244.  
  245.         }
  246.  
  247.         void Program_ResponseReceived(HttpRequest sender, HttpResponse response)
  248.         {
  249.             // do something with the responce
  250.             //Debug.Print("response: " + response.Text);
  251.  
  252.             // create all the clock face time slots
  253.             createClock();
  254.  
  255.             // then process the events
  256.             processEvents(response);
  257.         }
  258.  
  259.         void createClock()
  260.         {
  261.  
  262.             //eventSlotObject[0].slotStartTime;
  263.  
  264.             //Debug.Print("Test " + slotStartTime[0]);
  265.  
  266.             // is it currently AM or PM on the clock face?
  267.             if (DateTime.Now.ToString("tt") == "AM")
  268.             {
  269.                 Debug.Print("The current slot is AM");
  270.                 morningMarker = true;
  271.  
  272.             }
  273.             else if (DateTime.Now.ToString("tt") == "PM")
  274.             {
  275.                 Debug.Print("The current slot is PM");
  276.                 morningMarker = false;
  277.  
  278.             }
  279.  
  280.             // what is the current clock hour for the current time?
  281.             currentSlot = Convert.ToInt32(DateTime.Now.ToString("hh")) * 2;
  282.  
  283.             // check if the time is past the half hour
  284.             if (Convert.ToInt32(DateTime.Now.ToString("mm")) >= 30)
  285.             {
  286.                 currentSlot++;
  287.             }
  288.  
  289.             Debug.Print("currentSlot: " + currentSlot);
  290.  
  291.             // reset the data in the eventObjects
  292.             // DO NOT use this on the first or last day of the month!!
  293.  
  294.             Debug.Print("Current time: " + DateTime.Now.ToString("HH:mm"));
  295.  
  296.             // count forwards towards the 24th slot
  297.             for (int increment = 0; increment < 24; increment++)
  298.             {
  299.  
  300.                 Debug.Print("Calculating slot: " + increment);
  301.  
  302.                 if (increment == currentSlot)
  303.                 {
  304.                     Debug.Print("This is the current slot!");
  305.                 }
  306.  
  307.                 // if this slot is before the current slot
  308.                 if (increment < currentSlot)
  309.                 {
  310.  
  311.                     // if the current slot is AM and this slot is before the current slot
  312.                     // then all these dates and times are in today PM
  313.                     if (morningMarker)
  314.                     {
  315.                         Debug.Print("The current slot is AM and this slot is before it");
  316.  
  317.                         // fix the 12 o'clock weirdness
  318.                         if (currentSlot == 0 || currentSlot == 1)
  319.                         {
  320.                             pmOffset = 0;
  321.                             dayOffset = 0;
  322.                         }
  323.                         // add 12 hours for PM
  324.                         else
  325.                         {
  326.                             pmOffset = 12;
  327.                             dayOffset = 0;
  328.                         }
  329.  
  330.                         // slot start time
  331.                         slotStartTime[increment] = new DateTime(
  332.                             DateTime.Now.Year,
  333.                             DateTime.Now.Month,
  334.                             DateTime.Now.Day + dayOffset,
  335.                             // here is the slot hour time for PM
  336.                             ((increment - (increment % 2)) / 2) + pmOffset,
  337.                             // here are the minutes example 9 = 30, 6 = 0
  338.                             (30 * (currentSlot % 2)),
  339.                             // zero seconds
  340.                             0);
  341.  
  342.                         Debug.Print("Slot: " + increment + " start time " + slotStartTime[increment]);
  343.  
  344.                         // slot end time
  345.                         slotEndTime[increment] = new DateTime(
  346.                              DateTime.Now.Year,
  347.                             DateTime.Now.Month,
  348.                             DateTime.Now.Day + dayOffset,
  349.                             // here is the slot hour time for PM
  350.                             ((increment - (increment % 2)) / 2) + pmOffset,
  351.                             // here are the minutes example 9 = 59, 6 = 29
  352.                             ((30 * (currentSlot % 2)) + 29),
  353.                             // 29 seconds
  354.                             29);
  355.  
  356.                         Debug.Print("Slot: " + increment + " end time " + slotEndTime[increment]);
  357.  
  358.                     }
  359.                     // if the current slot is PM and this slot is before the current slot
  360.                     // then all these dates and times are in tomorrow AM
  361.                     else
  362.                     {
  363.                         Debug.Print("The current slot is PM and this slot is before it");
  364.  
  365.                         // fix the 12 o'clock weirdness
  366.                         if (increment == 0 || increment == 1)
  367.                         {
  368.                             pmOffset = 0;
  369.                             dayOffset = 1;
  370.                         }
  371.                         // don't add 12 hours
  372.                         else
  373.                         {
  374.                             pmOffset = 0;
  375.                             dayOffset = 1;
  376.                         }
  377.  
  378.                         // slot start time
  379.                         slotStartTime[increment] = new DateTime(
  380.                              DateTime.Now.Year,
  381.                             DateTime.Now.Month,
  382.                             DateTime.Now.Day + dayOffset,
  383.                             // here is the slot hour time for PM
  384.                             ((increment - (increment % 2)) / 2) + pmOffset,
  385.                             // here are the minutes example 9 = 30, 6 = 0
  386.                             (30 * (increment % 2)),
  387.                             // zero seconds
  388.                             0);
  389.  
  390.                         Debug.Print("Slot: " + increment + " start time " + slotStartTime[increment]);
  391.  
  392.                         //eventSlotObject[increment].slotStartYear = 2013;
  393.                         //eventSlotObject[increment].slotStartMonth = DateTime.Now.Month;
  394.                         //eventSlotObject[increment].slotStartDay = DateTime.Now.Day + dayOffset;
  395.                         //// here is the slot hour time for PM
  396.                         //eventSlotObject[increment].slotStartHour = (increment / 2) - (increment % 2) + pmOffset;
  397.                         //// here are the minutes example 9 = 30, 6 = 0
  398.                         //eventSlotObject[increment].slotStartMinute = (30 * (currentSlot % 2));
  399.                         //// zero seconds
  400.                         //eventSlotObject[increment].slotStartSecond = 0;
  401.  
  402.                         //Debug.Print("Slot: " + increment + " start time " + eventSlotObject[increment].slotStartHour + ":" + eventSlotObject[increment].slotStartMinute);
  403.  
  404.                         // slot end time
  405.                         slotEndTime[increment] = new DateTime(
  406.                              DateTime.Now.Year,
  407.                             DateTime.Now.Month,
  408.                             DateTime.Now.Day + dayOffset,
  409.                             // here is the slot hour time for PM
  410.                             ((increment - (increment % 2)) / 2) + pmOffset,
  411.                             // here are the minutes example 9 = 59, 6 = 29
  412.                             ((30 * (increment % 2)) + 29),
  413.                             // 29 seconds
  414.                             29);
  415.  
  416.                         Debug.Print("Slot: " + increment + " end time " + slotEndTime[increment]);
  417.  
  418.                         //eventSlotObject[increment].slotEndYear = DateTime.Now.Year;
  419.                         //eventSlotObject[increment].slotEndMonth = DateTime.Now.Month;
  420.                         //eventSlotObject[increment].slotEndDay = DateTime.Now.Day + dayOffset;
  421.                         //// here is the slot hour time for PM
  422.                         //eventSlotObject[increment].slotEndHour = (increment / 2) - (increment % 2) + pmOffset;
  423.                         //// here are the minutes example 9 = 59, 6 = 29
  424.                         //eventSlotObject[increment].slotEndMinute = ((30 * (currentSlot % 2)) + 29);
  425.                         //// zero seconds
  426.                         //eventSlotObject[increment].slotEndSecond = 0;
  427.  
  428.                         //Debug.Print("Slot: " + increment + " end time " + eventSlotObject[increment].slotEndHour + ":" + eventSlotObject[increment].slotEndMinute);
  429.  
  430.                     }
  431.  
  432.                 }
  433.                 // if this slot is the current slot or after the current slot
  434.                 else
  435.                 {
  436.  
  437.                     // if the current slot is AM and this slot is after the current slot
  438.                     // then all these dates and times are in today AM
  439.                     if (morningMarker)
  440.                     {
  441.                         Debug.Print("The current slot is AM and this slot is after it");
  442.  
  443.                         // fix the 12 o'clock weirdness
  444.                         if (increment == 0 || increment == 1)
  445.                         {
  446.                             pmOffset = 0;
  447.                             dayOffset = 0;
  448.                         }
  449.                         // don't add 12 hours
  450.                         else
  451.                         {
  452.                             pmOffset = 0;
  453.                             dayOffset = 0;
  454.                         }
  455.  
  456.                         // slot start time
  457.                         slotStartTime[increment] = new DateTime(
  458.                              DateTime.Now.Year,
  459.                             DateTime.Now.Month,
  460.                             DateTime.Now.Day + dayOffset,
  461.                             // here is the slot hour time for PM
  462.                             ((increment - (increment % 2)) / 2) + pmOffset,
  463.                             // here are the minutes example 9 = 30, 6 = 0
  464.                             (30 * (increment % 2)),
  465.                             // zero seconds
  466.                             0);
  467.  
  468.                         Debug.Print("Slot: " + increment + " start time " + slotStartTime[increment]);
  469.  
  470.                         // slot end time
  471.                         slotEndTime[increment] = new DateTime(
  472.                              DateTime.Now.Year,
  473.                             DateTime.Now.Month,
  474.                             DateTime.Now.Day + dayOffset,
  475.                             // here is the slot hour time for PM
  476.                             ((increment - (increment % 2)) / 2) + pmOffset,
  477.                             // here are the minutes example 9 = 59, 6 = 29
  478.                             ((30 * (increment % 2)) + 29),
  479.                             // 29 seconds
  480.                             29);
  481.  
  482.                         Debug.Print("Slot: " + increment + " end time " + slotEndTime[increment]);
  483.                     }
  484.                     // if the current slot is PM and this slot is after the current slot
  485.                     // then all these dates and times are in today PM
  486.                     else
  487.                     {
  488.                         Debug.Print("The current slot is PM and this slot is after it");
  489.  
  490.                         // fix the 12 o'clock weirdness
  491.                         if (increment == 0 || increment == 1)
  492.                         {
  493.                             pmOffset = 0;
  494.                             dayOffset = 0;
  495.                         }
  496.                         // add 12 hours for PM
  497.                         else
  498.                         {
  499.                             pmOffset = 12;
  500.                             dayOffset = 0;
  501.                         }
  502.  
  503.                         // slot start time
  504.                         slotStartTime[increment] = new DateTime(
  505.                              DateTime.Now.Year,
  506.                             DateTime.Now.Month,
  507.                             DateTime.Now.Day + dayOffset,
  508.                             // here is the slot hour time for PM
  509.                             ((increment - (increment % 2)) / 2) + pmOffset,
  510.                             // here are the minutes example 9 = 30, 6 = 0
  511.                             (30 * (increment % 2)),
  512.                             // zero seconds
  513.                             0);
  514.  
  515.                         Debug.Print("Slot: " + increment + " start time " + slotStartTime[increment]);
  516.  
  517.                         // slot end time
  518.                         slotEndTime[increment] = new DateTime(
  519.                              DateTime.Now.Year,
  520.                             DateTime.Now.Month,
  521.                             DateTime.Now.Day + dayOffset,
  522.                             // here is the slot hour time for PM
  523.                             ((increment - (increment % 2)) / 2) + pmOffset,
  524.                             // here are the minutes example 9 = 59, 6 = 29
  525.                             ((30 * (increment % 2)) + 29),
  526.                             // 29 seconds
  527.                             29);
  528.  
  529.                         Debug.Print("Slot: " + increment + " end time " + slotEndTime[increment]);
  530.  
  531.                     }
  532.                 }
  533.             }
  534.         }
  535.  
  536.  
  537.         void processEvents(HttpResponse response)
  538.         {
  539.             // run through each calendar event and ask if each eventSlot is involved
  540.  
  541.  
  542.             // if the reponse contains some event items then update the eventObject data
  543.             if (response.Text.IndexOf("items") < 0)
  544.             {
  545.                 // if no items then do nothing
  546.                 Debug.Print("No event items!");
  547.             }
  548.             else
  549.             {
  550.  
  551.                 //Debug.Print("response " + response.Text);
  552.  
  553.                 // trim the response to the event items
  554.                 string[] responseString = (response.Text.Substring(response.Text.IndexOf("items") - 1)).Split("\r\n".ToCharArray());
  555.                 bool eventMapping = false;
  556.                 bool startHunting = false;
  557.                 bool endHunting = false;
  558.  
  559.                 for (int increment = 0; increment < responseString.Length; increment++)
  560.                 {
  561.                     //Debug.Print("increment: "+increment);
  562.  
  563.                     // find "kind": "calendar#event", and trigger event mapping
  564.                     if (eventMapping == false && responseString[increment].IndexOf("calendar#event") > -1)
  565.                     {
  566.                         // new event!
  567.                         Debug.Print("New event!");
  568.                         eventMapping = true;
  569.                         startHunting = true;
  570.                     }
  571.  
  572.                     // if event mapping
  573.                     // then look for the start and stop times
  574.                     // begin start hunting
  575.  
  576.                     // find "start": {
  577.  
  578.                     if (eventMapping == true && startHunting == true)
  579.                     {
  580.                         if (responseString[increment].IndexOf("start") > -1)
  581.                         {
  582.                             // found the event start
  583.                             // jump to next line
  584.                             Debug.Print("Start time: " + responseString[increment + 1].Substring(responseString[increment + 1].IndexOf("dateTime") + 12, responseString[increment + 1].Length - (responseString[increment + 1].IndexOf("dateTime") + 12) - 7));
  585.                             startHunting = false;
  586.                             endHunting = true;
  587.                         }
  588.                     }
  589.                    
  590.                     // find "end": {
  591.  
  592.                     if (eventMapping == true && endHunting == true)
  593.                     {
  594.                         if (responseString[increment].IndexOf("end") > -1)
  595.                         {
  596.                             // found the event start
  597.                             // jump to next line
  598.                             Debug.Print("End time: " + responseString[increment + 1].Substring(responseString[increment + 1].IndexOf("dateTime") + 12, responseString[increment + 1].Length - (responseString[increment + 1].IndexOf("dateTime") + 12) - 7));
  599.                             eventMapping = false;
  600.                             endHunting = false;
  601.                         }
  602.                     }
  603.                 }
  604.                
  605.             }
  606.  
  607.  
  608.         }
  609.     }
  610. }
Add Comment
Please, Sign In to add comment