diff --git a/Chapter 0 - Abstract.tex b/Chapter 0 - Abstract.tex index 52a1b47..e3fba5c 100644 --- a/Chapter 0 - Abstract.tex +++ b/Chapter 0 - Abstract.tex @@ -13,8 +13,8 @@ \chapter*{Abstract}\label{cap:abstract_ro} \chapter*{Abstract}\label{cap:abstract_en} %%%%%%%%%%%% Section: Abstract %%%%%%%%%%%% -This bachelor work consists in realising a platform that works in conjunction with a Brain-Computer Interface(BCI), specifically the Unicorn Hybrid Black BCI\cite{Unicorn_Technology}, to facilitate access to applications compatible with the aforementioned platform. The platform aims to improve accessibility for a disabled person that is using a BCI as follows: normally when changing between applications the disabled subject must wait for an able-bodied helper to change applications and recalibrate the hardware; by creating a platform that houses applications the user may need and that allows the user to change between them seamlessly using an already existing solution\cite{Unicorn_Speller} the need for the said helper is removed, thus giving the end-user more freedom in interacting with his/her favourite programs. +This bachelor's work consists in realising a platform that works in conjunction with a Brain-Computer Interface(BCI), specifically the Unicorn Hybrid Black BCI\cite{Unicorn_Technology}, to facilitate access to applications compatible with the aforementioned platform. The platform aims to improve accessibility for a disabled person that is using a BCI as follows: normally when changing between applications the disabled subject must wait for an able-bodied helper to change applications and recalibrate the hardware; by creating a platform that houses applications the user may need and that allows the user to change between them seamlessly using an already existing solution\cite{Unicorn_Speller} the need for the said helper is removed, thus giving the end-user more freedom in interacting with his/her favourite programs. \vspace{\baselineskip}\newline -Due to the fact that the application is targeted at impaired individuals, the need for an able-bodied helper will arise when it comes to adding new applications to the platform and/or removing existing ones should that need to arise. An installer tool was created to aid the helper in installing the BCI applications via a graphical user interface. The apps used to demonstrate the platform will be taken (with permission) from UVT's submissions in the br41n.io hackathons, in which students competed with ideas for applications that integrate Brain Computer interfacing. +Due to the fact that the application is targeted at impaired individuals, the need for an able-bodied helper will arise when it comes to adding new applications to the platform and/or removing existing ones should that need to arise. An installer tool was created to aid the helper in installing the BCI applications via a graphical user interface. The apps used to demonstrate the platform will be taken (with permission) from UVT's submissions in the br41n.io hackathons, in which students competed with ideas for applications that integrate Brain-Computer interfacing. \vspace{\baselineskip}\newline Accordingly, this paper consists of two main parts, the platform solution itself and the installer solution. In creating the platform, the Unity engine was employed for creating an easy-to-understand user experience and for interfacing with Unicorn's proprietary BCI speller\cite{Unicorn_Speller} using the C\# programming language. The installer tool is an MFC-type dialogue application written in the C++ programming language that uses batch files to download and manipulate the application files inside of the Windows file system. While both programs can be used separately, they create an easier user experience for both user groups if used together: the impaired and the helpers, consequently creating a complete solution. diff --git a/Chapter 1 - Introduction.tex b/Chapter 1 - Introduction.tex index 717c49e..c551720 100644 --- a/Chapter 1 - Introduction.tex +++ b/Chapter 1 - Introduction.tex @@ -36,7 +36,7 @@ \section{Objectives}\label{sect:objectives} \vspace{\baselineskip}\newline All objectives hinge on the experience of the end-user and all features of this project are catered towards a disabled individual. This solution tries to prioritize accessibility and ease of use over other aspects. That being said, no testers from the target demographic have been employed in developing this solution, so it may or may not work as intended on the targeted user base. That being said, the implementation method may also work on other problems that require a platform controlled by the user. \vspace{\baselineskip}\newline -Therefore we can conclude on 3 primary objectives: creating an easily understandable and navigable user experience, ensuring the stability of the proposed solution, and developing a way to integrate apps within the platform without the need to modify the apps themselves to fit in. +Therefore we can conclude with 3 primary objectives: creating an easily understandable and navigable user experience, ensuring the stability of the proposed solution, and developing a way to integrate apps within the platform without the need to modify the apps themselves to fit in. diff --git a/Chapter 2 - Theoretical Basis.tex b/Chapter 2 - Theoretical Basis.tex index 10f3d11..823046a 100644 --- a/Chapter 2 - Theoretical Basis.tex +++ b/Chapter 2 - Theoretical Basis.tex @@ -35,7 +35,7 @@ \subsection{Brain-Computer Interfacing} A brain-computer interface(BCI) or brain-machine interface(BMI) is a computer-based system that acquires brain signals, analyses them and translates them into usable data or commands which are then exported to other devices to be used to other extents. By definition, a BCI uses some form or another of data processing and as such an EEG alone cannot be called a BCI\cite{Shih_2012}. BCI implementations vary based on the invasiveness of their data acquisition methods. As such, there are non-invasive BCIs (using electroencephalography, magnetoencephalography, electrooculography or magnetic resonance imaging), semi-invasive BCIs (using electrocorticography and endovascular methods) and invasive BCIs (using microelectrode arrays). \subsection{Unicorn Hybrid Black BCI} -The BCI that will be used in the implementation of this paper is the Unicorn Hybrid Black. This is a non-invasive BCI using EEG technology. The 8 electroencephalogram electrodes are placed at the following fixed positions on the provided cap: Fz, C3, Cz, C4, Pz, PO7, Oz and PO8[see fig 2.3], in accordance with the 10/20 international system. Two extra electrodes marked L and R are to be attatched on the mastoid bones behind the user's ears and act as a "ground" for the rest of the electrodes due to their placement on an area with virtually no electrical activity. +The BCI that will be used in the implementation of this paper is the Unicorn Hybrid Black. This is a non-invasive BCI using EEG technology. The 8 electroencephalogram electrodes are placed at the following fixed positions on the provided cap: Fz, C3, Cz, C4, Pz, PO7, Oz and PO8[see fig 2.3], in accordance with the 10/20 international system. Two extra electrodes marked L and R are to be attached to the mastoid bones behind the user's ears and act as a "ground" for the rest of the electrodes due to their placement on an area with virtually no electrical activity. \begin{figure}[H] \centering @@ -51,13 +51,13 @@ \subsection{Unicorn Hybrid Black BCI} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Technologies Used} \subsection{Unicorn Suite} -The Unicorn BCI always comes alongside the Unicorn Suite, a software environment touched upon in the similar solutions section of this paper. In this implementation, the suite is used for its development tools and for the Unicorn Speller contained within. Other useful tools include the Unicorn recorder, the .NET framework which uses the C\# programming language and other tools that allow the creation of different software solutions. Another function of the Suite is to keep the licenses required to use the software, as most tools require licenses purchased directly from g.tec\cite{Unicorn_Shop}, including the Speller used in this implementation. +The Unicorn BCI always comes alongside the Unicorn Suite, a software environment touched upon in the similar solutions section of this paper. In this implementation, the suite is used for its development tools and the Unicorn Speller contained within. Other useful tools include the Unicorn recorder, the .NET framework which uses the C\# programming language and other tools that allow the creation of different software solutions. Another function of the Suite is to keep the licenses required to use the software, as most tools require licenses purchased directly from g.tec\cite{Unicorn_Shop}, including the Speller used in this implementation. \subsection{Unicorn Speller} -The Unicorn Speller is a spelling system that uses the P300 complex\cite{UnicornSuite_Manual}. The speller's interface consists of a QWERTY key layout that sits on the screen along a number row, an auto-complete row and a special functions row[see Fig 2.4]. The numbers and letters are used for spelling while the special keys are used for other functions such as text-to-speech, printing, etc. Each key is considered an item, and the layout is called a board. The user can choose the board he/she wants to use, thus choosing the layout of the items on the screen. The speller also allows for creation of user-made boards (using the \textit{.ibc} file extension), the use of which will also be employed in this work. +The Unicorn Speller is a spelling system that uses the P300 complex\cite{UnicornSuite_Manual}. The speller's interface consists of a QWERTY key layout that sits on the screen along a number row, an auto-complete row and a special functions row[see Fig 2.4]. The numbers and letters are used for spelling while the special keys are used for other functions such as text-to-speech, printing, etc. Each key is considered an item, and the layout is called a board. The user can choose the board he/she wants to use, thus choosing the layout of the items on the screen. The speller also allows for the creation of user-made boards (using the \textit{.ibc} file extension), the use of which will also be employed in this work. \vspace{\baselineskip}\newline -The actual mode of operation of the speller is through "flashing"\cite{UnicornSuite_Manual}, where the items on the board are flashing a different image for a brief moment (eg. the letter S is replaced with the face of Chuck Norris for a brief second before returning to its normal appearance). The images that flash on the letters are usually the faces of famous people. This is due to discoveries regarding P300 spellers, where researchers found out that superimposing familiar faces on letters helps accuracy and improves the performance of the ERP\cite{Li_2015}\cite{Kaufmann_2011}. In order to select an item, the user must focus on said item and count each time the item he/she wants to select flashes and ignore all other flashes\cite{UnicornSuite_Manual}. +The actual mode of operation of the speller is through "flashing"\cite{UnicornSuite_Manual}, where the items on the board are flashing a different image for a brief moment (eg. the letter S is replaced with the face of Chuck Norris for a brief second before returning to its normal appearance). The images that flash on the letters are usually the faces of famous people. This is due to discoveries regarding P300 spellers, where researchers found out that superimposing familiar faces on letters helps accuracy and improves the performance of the ERP\cite{Li_2015}\cite{Kaufmann_2011}. To select an item, the user must focus on said item and count each time the item he/she wants to select flashes and ignore all other flashes\cite{UnicornSuite_Manual}. \begin{figure}[H] \centering @@ -67,7 +67,7 @@ \subsection{Unicorn Speller} The speller flashing occurs in flash cycles, a group of flashes such as that each item on the board has flashed exactly once. There are different modes of flashing that the user can choose from as follows: row/column, single character and randomised patterns. To create the solution proposed by this paper, I will be using the randomised patterns mode, a randomised selection of items distributed across the whole board that flash at the same time, with patterns flashing consecutively\cite{UnicornSuite_Manual}. \vspace{\baselineskip}\newline -Furthermore, to use the speller, a calibration sequence needs to be completed. In order to calibrate, we must input a word or different letters that the user has to look at while the calibration sequence runs[see Fig 2.4]. During calibration, the speller learns the difference between the user's typical EEG signals and afterwards, it creates a calibration file, storing the user's calibration data to be reused. In this way, the speller adapts to the user, each user having different calibrations depending on different variables such as the user's environment. Therefore, it is best to calibrate in a quiet place, away from distractions and disturbances that might introduce rubbish data and noise in the calibration file. +Furthermore, to use the speller, a calibration sequence needs to be completed. To calibrate, we must input a word or different letters that the user has to look at while the calibration sequence runs[see Fig 2.4]. During calibration, the speller learns the difference between the user's typical EEG signals and afterwards, it creates a calibration file, storing the user's calibration data to be reused. In this way, the speller adapts to the user, each user having different calibrations depending on different variables such as the user's environment. Therefore, it is best to calibrate in a quiet place, away from distractions and disturbances that might introduce rubbish data and noise in the calibration file. \begin{figure}[H] \centering @@ -85,7 +85,7 @@ \subsection{Unity Game Engine} \subsection{Visual Studio 2022 IDE} Visual Studio 2022 is an Integrated Development Environment (IDE) used for editing, debugging, building code and publishing different applications. Visual Studio includes compilers, code completion tools, graphical designers and other features to enhance software development processes\cite{VisualStudio}. Visual Studio also provides plugins and different integration with external tools, such as the Unity Game Engine. In the making of this bachelor's work, the main Development Environment used is the 2022 version of this IDE, both as the default script editor for Unity and in other miscellaneous tasks as a code editor. \vspace{\baselineskip}\newline -Due to the comprehensive support for Microsoft Foundation Class (MFC) applications, the IDE was also used to create the platform's installer, which is an MFC type application. Visual Studio has extensive tools for designing the MFC user interface and the logic behind it and was crucial in developing, building, running and deploying the platform's installer. +Due to the comprehensive support for Microsoft Foundation Class (MFC) applications, the IDE was also used to create the platform's installer, which is an MFC-type application. Visual Studio has extensive tools for designing the MFC user interface and the logic behind it and was crucial in developing, building, running and deploying the platform's installer. \vspace{\baselineskip}\newline For trivial and smaller code editing tasks, the simpler Visual Studio Code was used as a quicker alternative to the vastness of its bigger and more complex counterpart. \vspace{\baselineskip}\newline diff --git a/Chapter 3 - Creating a BCI Application Platform.tex b/Chapter 3 - Creating a BCI Application Platform.tex index ea79efd..4787e09 100644 --- a/Chapter 3 - Creating a BCI Application Platform.tex +++ b/Chapter 3 - Creating a BCI Application Platform.tex @@ -3,7 +3,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Creating a BCI Application Platform}\label{cap:development} -In this bachelor's thesis, the main objective is creating a BCI App Platform, meaning the creation of a program that is able to open other applications while interfacing with the Unicorn Hybrid Black, a Brain-Computer Interface, to receive input from a disabled user via a P300 speller. The user can navigate through his favourite applications which are displayed on the platform's graphical user interface using the Unicorn Speller, g.tec's implementation of the P300 speller. Using the speller, he can then select an application to launch and use for as long as he desires, after which he can once again close it through the speller's board by looking at its elements. The results show a stable application that can be used to navigate through compatible apps and open them with ease. +In this bachelor's thesis, the main objective is creating a BCI App Platform, meaning the creation of a program that can open other applications while interfacing with the Unicorn Hybrid Black, a Brain-Computer Interface, to receive input from a disabled user via a P300 speller. The user can navigate through his favourite applications which are displayed on the platform's graphical user interface using the Unicorn Speller, g.tec's implementation of the P300 speller. Using the speller, he can then select an application to launch and use for as long as he desires, after which he can once again close it through the speller's board by looking at its elements. The results show a stable application that can be used to navigate through compatible apps and open them with ease. \section{Platform Architecture} The application to be implemented makes use of a BCI Speller, namely the Unicorn Speller which is part of the Unicorn Suite Hybrid Black. This speller can only be used with the Unicorn Hybrid Black Brain-Computer Interface. The speller is used as the primary and only input method for a disabled user to interact with the application. The BCI headset sends its output (the item the user selected from the board) through a UDP server to a specific IP address and port combo specified in the speller settings. The application implements a UDP listener that runs as a background process of the application, waiting for input from the user. When the aforementioned input arrives, the listener sends it to the application which then interprets it accordingly. @@ -89,7 +89,7 @@ \subsection{Speller Board} \end{figure} -The Platform speller consists of a full QWERTY-style keyboard and a navigation pad on the right-hand side of the keyboard[see Fig 3.3]. This may seem a bit excessive for a simple platform and that is because it is. The applications inside of the platform use the speller for input as well, all of them implementing their receivers. This would be a non-issue if the board file could be changed during run-time, but it cannot as the speller settings cannot be changed while the speller itself is running. Scripts could be created to automate this, but scripts can fail and in the event of such failure, an able-bodied person would have to step in, which is unsatisfactory. This creates an issue in the implementation where either all apps have to be designed to work with the same style of board (which would mean app integration takes longer, as each individual app's receiver code needs to be changed) or an umbrella board that covers all bases needs to be created. In this implementation, I have opted to create such a board that covers all needs. +The Platform speller consists of a full QWERTY-style keyboard and a navigation pad on the right-hand side of the keyboard[see Fig 3.3]. This may seem a bit excessive for a simple platform and that is because it is. The applications inside of the platform use the speller for input as well, all of them implementing their receivers. This would be a non-issue if the board file could be changed during run-time, but it cannot as the speller settings cannot be changed while the speller itself is running. Scripts could be created to automate this, but scripts can fail and in the event of such failure, an able-bodied person would have to step in, which is unsatisfactory. This creates an issue in the implementation where either all apps have to be designed to work with the same style of board (which would mean app integration takes longer, as each app's receiver code needs to be changed) or an umbrella board that covers all bases needs to be created. In this implementation, I have opted to create such a board that covers all needs. \subsection{Speller Receiver} diff --git a/Chapter 4 - Creating an App Installer.tex b/Chapter 4 - Creating an App Installer.tex index 6a02ebd..4c3fa2d 100644 --- a/Chapter 4 - Creating an App Installer.tex +++ b/Chapter 4 - Creating an App Installer.tex @@ -21,7 +21,7 @@ \section{Implementation Details} The installer is a dialog-based MFC app built using the Visual Studio IDE and its visual C++ tools. The dialog and all controller logic are written in C++, while external \textit{.bat} files are used via system calls to issue the download and file manipulation commands inside the file system. \subsection{MFC Application} -The MFC dialogue consists of two parts, namely the platform installer and the application installer. Separated in their own group boxes, the parts each have their own controllers. The platform installation has an Edit Control to display the current installation path of the BCI App platform (which defaults to the user's Program Files directory each time the application starts) and two buttons, one labelled browse which serves as a way for the user to browse for his/her preferred directory and an install button, which calls the \textit{.bat} file that installs the platform. The second part, the app installer, consists of multiple check-boxes, each corresponding to its own application, from which one may pick the items they want and an install button that also uses a system call for the installation batch files. +The MFC dialog consists of two parts, namely the platform installer and the application installer. Separated in their own group boxes, the parts each have their own controllers. The platform installation has an Edit Control to display the current installation path of the BCI App platform (which defaults to the user's Program Files directory each time the application starts) and two buttons, one labelled browse which serves as a way for the user to browse for his/her preferred directory and an install button, which calls the \textit{.bat} file that installs the platform. The second part, the app installer, consists of multiple check-boxes, each corresponding to its own application, from which one may pick the items they want and an install button that also uses a system call for the installation batch files. \subsection{Batch Files} \begin{lstlisting}[language={[Sharp]C}, caption={c4.bat, the script file used for installing the Connect4 Game}, label={Script}] @@ -48,9 +48,9 @@ \subsection{Batch Files} \end{lstlisting} -In order to download and install anything, a batch file is used to send a download request to GitHub via the curl command. All compatible apps and the platform respectively have their binary files on separate GitHub releases, which can be fetched with the aforementioned commands. Each download is stored in the user's temporary files directory, inside a .zip file. The file is then extracted to its respective output path, either the .bciapps folder for applications or the user's preferred directory for the platform, after which the temporary download file is deleted as to not consume space on the local user's disk[see listing 4.1]. In the case of an error, the program is simply not installed and the user can check the logs to see at which step of the process the installation failed. +In order to download and install anything, a batch file is used to send a download request to GitHub via the curl command. All compatible apps and the platform respectively have their binary files on separate GitHub releases, which can be fetched with the aforementioned commands. Each download is stored in the user's temporary files directory, inside a .zip file. The file is then extracted to its respective output path, either the .bciapps folder for applications or the user's preferred directory for the platform, after which the temporary download file is deleted so as to not consume space on the local user's disk[see listing 4.1]. In the case of an error, the program is simply not installed and the user can check the logs to see at which step of the process the installation failed. \vspace{\baselineskip}\newline -When it comes to installing the applications the user selected via the checkboxes in the MFC dialogue, a main installer.bat script is called alongside multiple arguments[see listing 4.2]. Each argument represents a code for a specific program to be installed. The installer.bat script loops through all arguments and checks whether they correspond to a compatible app inside the GitHub releases[see listing 4.3]. If it does, it executes the specific batch file for installing that application. +When it comes to installing the applications the user selected via the checkboxes in the MFC dialog, a main installer.bat script is called alongside multiple arguments[see listing 4.2]. Each argument represents a code for a specific program to be installed. The installer.bat script loops through all arguments and checks whether they correspond to a compatible app inside the GitHub releases[see listing 4.3]. If it does, it executes the specific batch file for installing that application. \begin{lstlisting}[language={[Sharp]C}, caption={Action Handler for the Install Apps button}, label={Script}] void CInstallerDlg::OnBnClickedAppInstall() @@ -79,7 +79,7 @@ \subsection{Batch Files} \end{lstlisting} \subsection{Updatability} -As with any installer, as new applications roll out, the installer will become outdated, at which point the user can simply head to the GitHub repository for the installer and grab the latest release, containing the new applications. Furthermore, the installer tool is easily modifiable when the time comes for an update. Whenever a new application rolls out, a new checkbox can be added inside the dialogue, a new batch script is added for curling the download URL and the modification is made inside of the Action Handler for the install button. While it may be more intuitive to run the batch files on their own or just manually download the app releases, this tool is a solution for the less technologically savvy people that want to use the platform quickly and don't want to bother with the technicalities of separate downloads or unknown scripts but instead would opt for a more user-friendly experience. +As with any installer, as new applications roll out, the installer will become outdated, at which point the user can simply head to the GitHub repository for the installer and grab the latest release, containing the new applications. Furthermore, the installer tool is easily modifiable when the time comes for an update. Whenever a new application rolls out, a new checkbox can be added inside the dialog, a new batch script is added for curling the download URL and the modification is made inside of the Action Handler for the install button. While it may be more intuitive to run the batch files on their own or just manually download the app releases, this tool is a solution for the less technologically savvy people that want to use the platform quickly and don't want to bother with the technicalities of separate downloads or unknown scripts but instead would opt for a more user-friendly experience. \begin{lstlisting}[language={[Sharp]C}, caption={Action Handler for the Install Apps button}, label={Script}] @echo off @@ -119,7 +119,7 @@ \section{Graphical Interface} \begin{figure}[H] \begin{minipage}[c]{0.45\linewidth} \includegraphics[width=\linewidth]{Graphics/Installer GUI.png} - \caption{Installer Dialogue Window} + \caption{Installer Dialog Window} \end{minipage} \hfill \begin{minipage}[c]{0.45\linewidth} @@ -127,5 +127,5 @@ \section{Graphical Interface} \caption{Installer Terminal Window} \end{minipage}% \end{figure} -The upper part of the installer is reserved for the platform installation, while the lower is used for the different applications' check boxes. Alongside the main dialogue, a terminal window opens each time a user presses an install button for logging purposes. +The upper part of the installer is reserved for the platform installation, while the lower is used for the different applications' checkboxes. Alongside the main dialog, a terminal window opens each time a user presses an install button for logging purposes. diff --git a/Chapter 6 - Conclusion.tex b/Chapter 6 - Conclusion.tex index 2920cca..64b4284 100644 --- a/Chapter 6 - Conclusion.tex +++ b/Chapter 6 - Conclusion.tex @@ -3,10 +3,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Conclusion}\label{cap:ending} -This bachelor tackles the creation of a BCI platform used for facilitating access to applications housed inside of the platform to disabled individuals without the need for an able-bodied helper. +This bachelor tackles creating a BCI platform for facilitating access to applications housed inside of the platform to disabled individuals without the need for an able-bodied helper. \vspace{\baselineskip}\newline -The development process focused on prioritising stability and leaving room for future development to provide as much freedom as possible to the end-user. Alongside the platform, an installer application was created to serve as a tool for able-bodied users and helpers to use in order to install compatible applications that interface with the platform. +The development process focused on prioritising stability and leaving room for future development to provide as much freedom as possible to the end user. Alongside the platform, an installer application was created to serve as a tool for able-bodied users and helpers to use in order to install compatible applications that interface with the platform. \vspace{\baselineskip}\newline -The software solution that resulted from this undertaking provides a way to minimise the constant need for helping hands when dealing with Brain-Computer Interfacing on impaired individuals. As such, an impaired user can put on a BCI cap and use applications like an unimpaired one would, with the ability to easily switch between applications, close them at will and open new ones. The platform supports any type of application designed to work with the Unicorn Speller as such that with future app developments, it could be used to help someone that has never been able to use a computer before to do just that. +The software solution that resulted from this undertaking provides a way to minimise the constant need for helping hands when dealing with Brain-Computer Interfacing in impaired individuals. As such, an impaired user can put on a BCI cap and use applications like an unimpaired one would, with the ability to easily switch between applications, close them at will and open new ones. The platform supports any application designed to work with the Unicorn Speller as such that with future app developments, it could be used to help someone that has never been able to use a computer before to do just that. \vspace{\baselineskip}\newline -The open-endedness of the application allows other developers to build upon its foundations and expand it, bridging the gap between disability and ability and bringing freedom to impaired individuals using the BCI technology \ No newline at end of file +The open-endedness of the application allows other developers to build upon its foundations and expand it, bridging the gap between disability and ability and bringing freedom to impaired individuals using BCI technology. \ No newline at end of file diff --git a/main.tex b/main.tex index 8a9b935..9c690c1 100644 --- a/main.tex +++ b/main.tex @@ -1,4 +1,4 @@ -\documentclass[12pt,a4paper,openany]{book} +\documentclass[12pt,a4paper,openany]{report} \newcommand\tab[1][1cm]{\hspace*{#1}} \usepackage{amsmath,amsthm,amssymb,graphicx,hyperref} \usepackage[left=1.2in,right=1.2in,top=1in,bottom=1in]{geometry}