RELEASE NOTES Release MyExperience v.0.8.2 - August 6th, 2008 - Fixed the start menu / desktop toolbar becoming visible when transitioning between survey panels. I removed a line in the QuestionPanel constructor that was forcing its response widget to have focus but the QuestionPanel didn't even have a parent yet. - Added string array related methods to ExecutableBase: Split, Join, and JoinPrettyPrint (she called it JoinFormat but Format has its own connotation with relation to strings) - Added GetResponses() method that allows the survey designer to obtain all the responses for a given question. It returns an array of Response objects. Call Response.Value to get the raw value. I felt like this was an improvement over Jennifer's technique because this way the responses are strongly Typed. - Fixed bug in SurveyForm where the ResponseOption was never passed to the SurveyEngine. This made it impossible to get incoming edge labels. - Fixed string concatenation bug in SimkinCS (http://sourceforge.net/tracker/index.php?func=detail&aid=2040396&group_id=188488&atid=925521) - Fixed RandomTimeSensor EndTime must be after 8am bug (http://sourceforge.net/tracker/index.php?func=detail&aid=2025835&group_id=188488&atid=925521) filed by Jennifer Beaudin - Fixed region specific bug: http://sourceforge.net/tracker/index.php?func=detail&aid=2039105&group_id=188488&atid=925521. Although this was originally marked as an issue with language, it is actually an issue with the regionality configuration of the device. see also: http://csharponphone.blogspot.com/2008/08/importance-of-sqlcecommandparameters.html - Added a quick check for '==' in DatabasePopulator and prints out a warning in the log file when these strings occur - Updated PlaySoundAction to return immediately if the sound file is not found - Updated NotificationForm to use the default sound if the set SoundFile property path is invalid - Fixed the IsActionTypeExecuting method so that it appropriately returns false/true (http://sourceforge.net/tracker/index.php?func=detail&aid=1984849&group_id=188488&atid=925521) - Added ability to get references to executing actions of a given name and given type in ExecutableBase - Added ability to check for the existence of a file and directory in ExecutableBase: see DoesFileExist and DoesDirectoryExist - Added ability to append text to a file in ExecutableBase: see AppendStringToFile - Fixed the negative number bug in SimkinCS: http://sourceforge.net/tracker/index.php?func=detail&aid=1909445&group_id=188488&atid=925521 - Updated ForegroundWindowSensor to print out information more like Visual Studio's Remote Spy tool. Use the recently added ForegroundWindowTitleSensor to get the same behavior as ForegroundWindowSensor used to offer. - Fixed a bug in PowerNotificationSensor where a state change event was occurring on every power notification event (rather than when the power state was actually different) - Changed the StatePeriod object from a struct to a class - Updated MyExperienceLogger to periodically check for lost .log files (E.g., files that were never renamed to .tocompress) - Updated a LogStatement object in the MyExperience.Logger project to include StateEntered and the last StatePeriod duration - Fixed bug in GsmMotionSensor where the incorrect average PhoneSignalStrength was being used (a local var vs. a field) - Added CurrentAveragePhoneSignalStrength and PreviousAveragePhoneSignalStrength to GsmMotionSensor - Renamed DateTimeEnded and DateTimeStarted to DateTimeEndedUtc and DateTimeStartedUtc in ActionEventArgs - Added BringToTopDuringCountdown property to NotificationAction that pushes the NotificationForm to the top of the screen when the form is about to time out. - Now setting the max size of the database dynamically based on the current size at startup. The default max size is 128MB. The global maximum is 4096 MB. This is still buggy as once the maxsize is reached, the application has to be restarted - Fixed bug where after TimeOutForm is closed via tap/keypress, SurveyForm would not show up. Added this.Show() in SurveyForm after the TimeOutForm closes - Added line in MyExperienceLogger to log initial state values when sensors are first loaded - Added LogStateChanges to Sensor. This refers only to the MyExperienceLog.txt file. Some sensor state changes are incredibly verbose and, as a result, when logged (for debugging purposes), the log file grows incredibly fast. this boolean property allows the researcher to turn off logging state changes on a sensor by sensor basis. - Added GetAgeString to ExecutableBase, which returns a human readable age string. - Add PhoneSignalStrength property to GsmMotionSensor - Added fix for bug in MainForm where _splashForm was used before it was initialized. This bug only affected PocketPCs. Note this fix has NOT been tested. - Attempted to make script columns of type NVARCHAR(MAX) but this data type is not allowed in SQL Compact Edition so continuing to use NTEXT instead - Added in location string to Simkin so that parsing errors in the scripts actually tell you some relevant information about the source of the error. Debugging scripts is still definitely the most frustrating part of using MyExperience - Added phone signal strength calculation to GsmMotionSensor - Added more time related methods to ExecutableBase like IsWeekday() and IsWeekend(), which are useful in scripts. - Fixed some log.ErrorFormat statements, which should have simply been log.Error - ActionEventArgs now contains a reference to the Action (rather than just the name) - Removed overloaded logging function in ExecutableBase which was causing some log output to go to the debug window - Changed default RecordStateChanges in Sensor from false to true - Added Duration field to sensor history table in database - Added RecordStateChanges property to top level Sensor class. If false, the sensor state changes will not be recorded to the database. - Fixed slight display bug with images in QuestionPanels - Fixed GsmSensor; very simple station vs. motion gsm Sensor - The Survey TimeOutForm now plays a sound, vibration, and flashes led's after the survey has been inactive for a certain amount of time - The last X (settable) seconds of a SurveyAction plays the SystemSound beep every second until the SurveyForm either autodismisses or snoozes - Overrode the ToString in StatePeriod to print out Duration - Added GetTrigger() method to TriggerExecutable thereby allowing trigger scripts to get access to the trigger itself - Added DeviceIdleSensor that works like PowerNotificationSensor except only fires an event when the device goes idle. In addition, the user can set how long the device needs to be idle before the event is fired - Updated StatePeriod to return Duration. Added StatePeriod references to StateChangedEventArgs - Fixed a null conversion error in Simkin. Now, null and SimkinCS.Null types are properly dealt with - Added DebugWriteAppender, the reason log4net logging was not being pushed through to the Debug Output console in Visual Studio was because DebugWriteAppender was coming from Roam.Common, which was compiled in Release mode. I moved DebugWriteAppender over to MyExperience so that when compiling and running in debug mode, the log4net log statements properly print out in the Visual Studio Output window as long as DebugWriteAppender is enabled in LogConfig.xml - Moved MainForm from MyExperience.Application namespace (project) over to MyExperience - Updated SplashForm usage, new startup images can be defined by placing a PNG called "Startup.png" in the application directory. This will automatically replace the "StatueOfLibertyTransparent240x320.png" pic that is the default. - Updated SetWallpaperAction, which now supports three modes of operation including AutoCrop, Stretch and Center - Updated HttpPostAction with RequestUriWithParameters readonly property - Added some conversion methods to ExecutableBase - Updated SensorStateSnapshot such that timestamp information is available as well as a reference to the source Sensor - Updated GsmSmoothedCommonCellRatioSensor so that the average cell count reading is accessible via a property Release MyExperience v.0.8.1 - February 26th, 2008 - There was a bug in NotificationForm with regards to how Snooze was handled. I rewrote NotificationAction and NotificationForm such that the snooze functionality is now handled by NotificationAction outside of the modal dialog. This is probably how it should have been from the beginning. One relevant note is that NotificationAction assumes it is being called by a thread other than the UI thread. - Fixed a bug in the GLOBALS subsection of the MyExperience.XML file where they appropriate values were not being seen by the application. - Wrote a hack to force the MainForm to hide. For some reason, a simple this.Hide() or this.Visible=false; call will not work in MainForm. The menubar and titlebar refuse to hide. My hack basically grabs a handle to the desktop window and forces that to the top window. - Added menu to LoadedSensorsForm to view properties (you could do this before by pressing the select button but that was nonintuitive) - Added ability to slightly customize the MainForm via Global settings (e.g., you can set the left menu name, you can disable the debug menus from showing, you can disable exiting the program). The end goal, however, is still to make MainForm customization a first level object in the XML file. - Set this.ControlBox = false on all relevant forms. This takes away the (X) in the upper-right hand corner on PocketPC devices - Minor change to RandomTimeSensor, added readonly CurrentTimeBlock property - Fixed LogViewerForm on PocketPCs - Fixed GlobalsForm property view issue - Can now access running actions from the AvailableActionsForm - Fixed NullReferenceException bug in PropertyForm - Added MspInstantActivitySensor whose state is a tuple where the string is the currently sensed activity and the int is the confidence score (e.g., "Walking, 89" or "Bicycling, 72"). This sensor can update its activity inference four times per second. - Added MspMessage to create a more object oriented hierarchy around the MSP string messages received over bluetooth from the MSP device. - Added two hsa_defs.txt files which is used by the MspHumanScaleActivitySensor. This sensor, unlike MspInstantActivitySensor, applies smoothing to activity states (thus it recognizes activities at the "human scale" rather than micro scale). - Made sure that all connections received from Roam.SqlCe.SqlCeConnectionManager were immediately closed after usage of that connection completed. On the desktop, when using SQL lib, the correct operation is to grab a SQL connection, run a sql command (or a series of sql commands) and then immediately close the connection. On the mobile, because there is no SQL connection pool, the appropriate operation is to keep connections open as long as possible. This is because opening a connection on the mobile can take 1-2 seconds. This is not efficient. Thus, in Roam (http://www.sourceforge.net/projects/roam) I implemented my own SQL connection pool, which is also thread safe. A discussion about connection pooling and SQL thread safety on the mobile can be found on my csharponphone blog at http://csharponphone.blogspot.com/2007/01/keeping-sqlceconnection-open-and-thread.html (which was written more than a year ago now) - Added some new debug views (e.g., one for viewing SQL information, one for viewing thread information) - Added DownloadAction that can download an artifact (e.g., music file, image, etc.) based on a provided URL. We are currently using this in UbiGreen to download images. - Added new overloaded SaveBinaryData method to Action class that takes in a Stream (rather than a byte array) - Updated amount of DEBUG level logging that the DatabasePopulator class outputs. This should better help us track down issues people are having when MyExperience first starts. I also added more verbse INFO level logging to the Initialize method of MyExperienceFramework, which is automatically shown on the SplashScreen. - Updated both the AudioRecorder and the CameraWidget so that they are more immune to accidental "double click" or "double keypress" issues. - The AudioRecorder now has a _minimumRecordTime field (this has not been exposed as a property, however) - Added RunningSensorCount property to SensorManager - Updated way Globals closes its SqlConnection (it checks to see if the connection was already open on the current thread before closing it) - Fixed a bug in SendSmsAction that was causing an exception whenever the empty constructor was used - Added SaveResult enum that ScreenShotAction, DownloadAction, and others use as their action result - Added MspWindowActivitySensor which just uses a moving window average for smoothing - Added refresh menu item to LoadedSensorsForm - Added CurrentStateDuration and PreviousStateDuration properties to Sensor - Added new Question script type: OnCreate, which executes when the question is created - Exposed GetQuestion in SurveyEngine such that a question can call "GetQuestion()" to get a reference to itself Release MyExperience v0.8 - Added AvailableActionsForm which lists the actions defined in the XML file and also allows the researcher the ability to arbitrarily execute any of these actions at any time - Added RetryInterval property to SendSmsAction - Updated GPS speed sensor to use different units, e.g., mph, kmph, knots. - Refactored MyExperience.Sensors.Pols into MyExperience.Sensors.Gsm - Fixed a bug in SimkinCS where setting properties using reflection were not properly being converted to the right types - Exposed some ActionManager functionality in XML scripts via the ExecutableBase - Updated KeyEvent class to have IsNumber and IsLetter Methods - Updated PlaySoundAction so that volume can be set - Updated RecordAudioAction so that the save file functionality works more like the ScreenShotAction - Updated the CreateProcessAction to expose the ProcessStartInfo properties - Added the KillProcessAction (which is essentially the opposite of the CreateProcessAction) - Fixed bug in SimkinCS in TypeConverter.cs where a type could not be converted to itself - Updated NotificationAction to include the ability to turn on the backlight during the notification (this is now on by default) - Hooked up the TimeOutForm, i had forgotten to integrate this back in to the new SurveyForm after refactor - Added DesktopVisibleSensor that fires a state change when the desktop becomes visible - Stripped sensor history functionality out of the base sensor class (this was buggy and will be re-added again in future releases) - Updated privacy-related functionality for one-way hashing privacy sensitive information that MyExperience logs such as incoming phone call numbers and names - Added the ability to sense actual sms messages being sent (rather than a boolean value which indicated whether a message was sent or not). This functionality is dependent on a proprietary 3rd party library that Intel Research purchased last year and this library is not checked into the open source library. Thus, by default, this functionality is not enabled and the project: MyExperience.Sensors.InTheHand is not loaded in the .sln - Renamed SmsSentSensor to SmsSentCountSensor - Added in privacy preservation in the SystemStatesSensor and SystemStateSensor classes - Fixed bug in SmsSentSensor when user had never sent any SmsMessages previously (thus, most recent message was null) - Added ForegroundWindowSensor which is a polling-based sensor that fires a state change when the foreground window's title changes - Update to AudioRecorder widget, added more thorough instructions to user about how to record their audio. - Updated DatabasePopulator parse code slightly to log a WARNING when an unexpected start element is found outside an action, sensor, question, or trigger element - Updated AudioRecorder, CameraWidget, VideoCameraWidget, and TimeOutForm to check for the current platform (e.g., SmartPhone vs. PocketPC) and modify their instructions accordingly (e.g., if on a PocketPC, the CameraWidget says "tap here to launch camera" rather than "press any key to launch camera" - Optimized SurveyPanel display slightly in SurveyForm. I set the .Size to Form.ClientSize before the SurveyPanel was displayed. - Fixed bug in MultilineTextBox, where the MinimumHeight was too small - Updated DateTimePicker slightly to make MinimumHeight a few pixels taller - Updated RandomTimeSensor with two new properties LastPrompt and TimeUntilNextPrompt that are viewable from the debug viewer making it easier to double check correct behavior - Added ability to disallow going "back" in a SurveyAction - Added feature to disable "next" until a user begins entering a response - Put in simple debouncer on MainForm such that the left menu tap doesn't accidentally invoke multiple instances of a survey updated exception handling in CustomComparer and ActionManager - Fixed longstanding bug in DateSensor (see http://csharponphone.blogspot.com/2006/08/issues-with-systemstatedate.html) - Added new BinaryActionData table to the Database/DatabaseSchema.cs. This table is for actions that collect binary data, which needs saving. For example, the ScreenShotAction takes screen shots of the device in the form of images. Before, the only choice was to save these images onto the filesystem.Now, however, the screenshots can be saved directly into the database in the BinaryActionData table. - Added SaveLocation flag enum to specify saving location (currently either in a file, in the database, or both) - Fixed log font size on splash screen on pocket pcs - Added Sleep function to ExecutableBase, which can be called from any script - Added the HttpPostAction (this has not been tested, use at own risk) - Added new action: SetWallpaperAction that sets the device's background wallpaper to the supplied image pointed to by the ImageFile property. Release MyExperience_CSE440 2007-10-11 - User can now use "back key" to go back in survey panels - Added more refined GSM functionality. See the default MyExperience.XML file to observe how a current study is using GSM cell tower information to detect a user's motion - Fixed a few UI bugs. For example, the TextBoxFilteredList height was not being set appropriately. - Uncommented the lines in the installer.bat that dealt with installing SQL Compact Edition and .NET CF 2 on the device. Thus, the installer will now ask the user if s/he would like to install these two things before installing MyExperience.