Welcome to the documentation pages of the Drone your Food of openCX!
You can find here detailed about the (sub)product, hereby mentioned as module, from a high-level vision to low-level implementation decisions, a kind of Software Development Report (see template ), organized by discipline (as of RUP):
So far, contributions are exclusively made by the initial team, but we hope to open them to the community, in all areas and topics: requirements, technologies, development, experimentation, testing, etc.
Please contact us!
Thank you!
Made By:
Deliver food quickly and seamlessly to conference participants.
Conference participants waste a lot of time in lines and changing seats when getting food. Our company helps them feel more immersed in the conference by quickly and confortably delivering food and beverages just with a few taps on their phones. What makes our approach unique is the use of new drone technology to bypass any obstacle and make deliveries as fast as possible.
Our application aims to provide the users with the ability to select products, place orders and to have them delievered by a flying drone.
This application requires:
As a customer, I want to consult the products available for sale.
Feature: Consulting available products.
Scenario: Available products are present when the user taps the products list button
Given I am logged in
And I am in the "home" page
When I am tap the "products list" button
Then I expect the available products to be present
Scenario: Product categories are present when the user taps the category list button
Given I am logged in
And I am in the "home" page
When I tap the "category list" button
Then I expect the "available products" categories to be present
Scenario: Products of a certain category are present when I tap the button of that category
Given I am logged in
And I am on the "category list" page
When I tap a "category" button
Then I expect the available products from that category to be present
As a customer, I must log in into my account to place orders.
Feature: Log In
Scenario: The user inputs his email and password to log in
Given: I have a registered account in DroneYourFood
When: I enter my email.
And: I enter my password
Then: I should be redirected to the "home" page
Feature: Sign In
Scenario: The user inputs his email and password to sign in
Given I am not logged in
When I enter an email
And I enter an password
Then my account should be created
As a customer, I want to be able to order food/drinks from the available products.
Feature: Add products to cart.
Scenario: the product is added to the user's cart when it is tapped
Given I am logged in
And I am on the "products list" page
When I tap a "product" card
Then that product should be added to my cart
And the text "Added product to cart" should be present
As a customer, I want to have food delivered to me, so I don't have to get up from my seat.
>
Feature: Receive the order.
Scenario: the user receives the food after the order has been placed
Given the order has been placed
When the order is ready for delivery
Then the drone brings the food to the selected place
As a customer, I want to be able to check my profile.
Feature: Check profile.
Scenario: User can navigate to his profile page by tapping the profile button
Given I am logged in
When I press the profile button
Then my profile's page is loaded
As a customer, I want to have multiple payment methods available to me.
Feature: Select payment method.
Scenario: The user selects a payment method by tapping the desired method
Given I have specified my order details
When I tap a payment method
Then I can use that method to pay for my order
As a customer, I want to be able to choose the delivery spot for my orders.
Feature: Select delivery place.
Scenario: The user selects a place
Given I have placed an order
When I am on the checkout page
Then I select the order delivery spot
As a customer, I want to be able to change my order.
Feature: Change order.
Scenario: The user changes the order after placing one
Given I have placed an order
When I am on the checkout page
Then I go back to the cart page
As a customer, I want to be able to cancel my order.
Feature: Cancel order.
Scenario: The user cancels the order after placing one
Given I have placed an order.
When I am on the checkout page
Then I cancel my order
As a user, I want to be able to recover my password.
Feature: Recover password.
Scenario: My password is updated when I input a new password.
Given I have pressed the "Recover my password" button
When I input my new password
Then I my password is updated
As a user, I want to change my profile picture.
Feature: Change profile picture.
Scenario: The profile picture is updated when user uploads a different one.
Given I have pressed the "Change my profile picture" button
When I upload a new picture
Then my profile picture is updated
As a user, I want to be able to see my purchase history.
Feature: Purchase history.
Scenario: The purchase history is displayed when the user goes to the history page.
Given I have made purchases in the past
When I go to the purchases page
Then I can see my purchase history
As a user, I want to filter products by category.
Feature: Filter products by category.
Scenario: The available products from a certain category are shown to the user.
Given I am on the "Category List" page
When I press a category
Then I can see the available products of that category
As a user, I want to be able to sign out of my account.
Feature: Sign Out
Scenario: The user can logout when logged in.
Given I am logged in
When I press sign out button
Then I log out
Our app allows for the registration of users so that we can store their orders.
Each order contains products which the user can choose.
Orders are then managed by the server that mediates the communication with the delivery drones.
Our application is divided into the following packages:
Regarding the phyical architecure of our project, it is divided in the following parts:
Regarding the technologies we'll be using on the development of the application, we decided to use Flutter because it speed up the development process and provides an abstraction to android and iOS systems. It is also used in open-cx making the app easier to integrate with, if necessary. We decided to go with Firebase for storage and authentication application, because it is free, provides all the functionalities needed and Flutter integrates well with it. The drones will be controlled using a python server. We chose Python because of our familiarity with the language and due to the Tello sdk provides code examples in this language. Finally, we were provided a Tello drone by the university.
At the end of our first iteration, we have implemented the user story As a customer, I want to consult the products available for sale. This gave us some basic understanding of Flutter and serves as a very early example of what the application will be and what it will look like. In this iteration we have used a JSON file instead of a Firebase instance to store the product's data (this will be changed later). The prototype has the basis of the theme we intend to use. This theme will be improved further.
This component was created for pages that have their layout based on a main
Column
. Columns
can overflow the screen, which is a big problem for smaller
devices. This component wraps a Column
and gives it a scrollbar when it
would overflow the screen. This way, the user can scroll in order to see all
the information and the overflow is avoided.
The code works around the user's ShoppingCart
instance.
This class is a singleton,
which means it can be easily accessed from everywhere on the code, both to
get information (avoiding some requeries/parsing from the Firebase instance)
and inserting new information (the formatting and uploading is handled
internally).
Since this class holds most of the core information of the application, it is
possible to register yourself as an observer
(by passing a funtion to the notifyWhenLoaded
method), that will be run when
the ShoppingCart loading process is done. The project uses this in conjunction
with the setState
method of Flutter's stateful widgets in order to show
loading screens/placeholders while the information is not ready, e.g.: list of
products on the shopping cart (ShoppingListWidget
class, getShoppingItems
method).
There are places (e.g.: profile) where we have used/created an extra class, so we can inject mocks (using Mockito). This helps writting better unit tests quickly.
Unfortunately, the drones we had access to during the development of this project had no GPS/way-point support. This means the interfacing with Tello drones exists, but is not used in the app's code.
There is a DroneCommand
class that sends
commands to a drone. There is a wrapper to interface with this class in
the Tools
class. This class has a final
field that should contain the ip address/domain and port to communicate
with the server.
The server
is written in python. It responds
to POST requests containing commands (in plain text). The server class
contains an instance of the Tello
class. This class takes care of the lower
level drone interaction, logs every interaction and allows an admin user
to send commands directly to the drone thought the standard input (stdin).
The main missing feature of this server is the limitation of working with a
single drone. This can be easily improved by having a queue of Tello
class
instances, each interfacing with a single drone. We didn't take care of this
because, we wouldn't be able to test the feature.
The features we have decided to test were the ones neither dependent on the drone or Firebase since these are out of our reach. Data classes and getters should be ignored for testing, as well. This meant the test plan should consist of three parts:
Tested using flutter_gherkin package.
For each test we check if each widget is being displayed as intended and if it shows the intended information.
For the purpose of ESOF, we used a very simple approach, just to manage feature requests, bug fixes, and improvements, using GitHub issues and following the GitHub flow.
We are using Github Projects to manage our tasks. Use this link to check what we are up to.
We did not integrate our application with open-cx.