forked from MicrosoftDocs/winrt-api
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Scenario1.xaml.cpp
249 lines (214 loc) · 8.06 KB
/
Scenario1.xaml.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
//
//*********************************************************
//
// Scenario1.xaml.cpp
// Implementation of the Scenario1 class
//
#include "pch.h"
#include "Scenario1.xaml.h"
#include "MainPage.xaml.h"
using namespace SDKSample;
using namespace SDKSample::BarcodeScannerCPP;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Concurrency;
using namespace Windows::Devices::PointOfService;
using namespace Windows::Foundation;
using namespace Windows::Storage::Streams;
using namespace Windows::UI::Core;
using namespace Windows::UI::Xaml::Navigation;
Scenario1::Scenario1()
{
InitializeComponent();
rootPage = MainPage::Current;
}
//<SnippetCreateBarcodeScanner>
// Creates the barcode scanner.
task<void> Scenario1::CreateDefaultScannerObject()
{
return create_task(BarcodeScanner::GetDefaultAsync()).then([this] (BarcodeScanner^ _scanner)
{
this->scanner = _scanner;
if (this->scanner != nullptr)
{
// UpdateOutput("Barcode Scanner created.");
// UpdateOutput("Device Id is:" + this->scanner->DeviceId);
}
else
{
// UpdateOutput("Barcode scanner not found. Connect a barcode scanner.");
}
});
}
//</SnippetCreateBarcodeScanner>
/// <summary>
/// Update the status in the UI with the string passed.
/// </summary>
/// <param name="message"></param>
void Scenario1::UpdateOutput(Platform::String^ strMessage)
{
StatusBlock->Text += strMessage;
StatusBlock->Text += "\r";
}
//<SnippetClaimBarcodeScanner>
// Claims the barcode scanner for exclusive use
task<void> Scenario1::ClaimScanner()
{
return create_task(scanner->ClaimScannerAsync()).then([this] (ClaimedBarcodeScanner^ _claimedScanner)
{
this->claimedScanner = _claimedScanner;
if (claimedScanner != nullptr)
{
// UpdateOutput("Barcode scanner claimed successfully.");
}
else
{
// UpdateOutput("Failed to claim barcode scanner.");
}
});
}
//</SnippetClaimBarcodeScanner>
//<SnippetEnableBarcodeScanner>
// Enables the barcode scanner to receive data.
task<void> Scenario1::EnableScanner()
{
return create_task(claimedScanner->EnableAsync()).then([this](void)
{
// UpdateOutput("Barcode scanner enabled successfully.");
});
}
//</SnippetEnableBarcodeScanner>
// <summary>
/// Setup the barcode scanner to be ready to receive the data events from the scan.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//<SnippetSetupBarcodeScanner>
void Scenario1::ScenarioStartScanButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
// Create the barcode scanner.
create_task(CreateDefaultScannerObject()).then([this](void)
{
if (scanner != nullptr)
{
// Claim the scanner for exclusive use by your application.
create_task(ClaimScanner()).then([this](void)
{
if (claimedScanner)
{
// Add a release device requested event handler. If this event is not handled,
// another app can claim the barcode scanner.
releaseDeviceRequestedToken = claimedScanner->ReleaseDeviceRequested::add(ref new EventHandler<ClaimedBarcodeScanner^>(this, &Scenario1::OnReleaseDeviceRequested));
/// Add a data receive event handler.
dataReceivedToken = claimedScanner->DataReceived::add(ref new TypedEventHandler<ClaimedBarcodeScanner^, BarcodeScannerDataReceivedEventArgs^>(this, &Scenario1::OnDataReceived));
UpdateOutput("Attached the DataReceived Event handler.");
// Set the app to decode the raw data from the barcode scanner
claimedScanner->IsDecodeDataEnabled = true;
// Enable the scanner.
create_task(EnableScanner()).then([this](void)
{
UpdateOutput("Ready to Scan.");
// Reset the button state
ScenarioEndScanButton->IsEnabled = true;
ScenarioStartScanButton->IsEnabled = false;
});
}
});
}
});
}
//</SnippetSetupBarcodeScanner>
/// <summary>
/// Event handler for the Release Device Requested event fired when barcode scanner receives Claim request from another application
/// </summary>
/// <param name="sender"></param>
/// <param name="args"> Contains the ClaimedBarcodeScanner that is sending this request</param>
//<SnippetReleaseDeviceRequested>
void Scenario1::OnReleaseDeviceRequested(Platform::Object ^sender, Windows::Devices::PointOfService::ClaimedBarcodeScanner ^args)
{
Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler(
[this,args]()
{
args->RetainDevice();
UpdateOutput("Received event ReleaseDeviceRequested. Retaining the barcode scanner.");
}));
}
//</SnippetReleaseDeviceRequested>
/// <summary>
/// Event handler for the DataReceived event fired when a barcode is scanned by the barcode scanner
/// </summary>
/// <param name="sender"></param>
/// <param name="args"> Contains the BarcodeScannerReport which contains the data obtained in the scan</param>
//<SnippetDataReceived>
void Scenario1::OnDataReceived(Windows::Devices::PointOfService::ClaimedBarcodeScanner ^sender, Windows::Devices::PointOfService::BarcodeScannerDataReceivedEventArgs ^args)
{
// read the data from the buffer and convert to string.
Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler(
[this,args]()
{
DataReader^ scanDataLabelReader = DataReader::FromBuffer(args->Report->ScanDataLabel);
ScenarioOutputScanDataLabel->Text = scanDataLabelReader->ReadString(args->Report->ScanDataLabel->Length);
DataReader^ scanDataReader = DataReader::FromBuffer(args->Report->ScanData);
ScenarioOutputScanData->Text = scanDataReader->ReadString(args->Report->ScanData->Length);
ScenarioOutputScanDataType->Text = BarcodeSymbologies::GetName(args->Report->ScanDataType);
}));
}
//</SnippetDataReceived>
/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached. The Parameter
/// property is typically used to configure the page.</param>
void Scenario1::OnNavigatedTo(NavigationEventArgs^ e)
{
ResetTheScenarioState();
}
/// <summary>
/// Invoked when this page is no longer displayed.
/// </summary>
/// <param name="e"></param>
void Scenario1::OnNavigatedFrom(NavigationEventArgs^ e)
{
ResetTheScenarioState();
}
/// <summary>
/// Event handler for End Scan Button Click.
/// Releases the Barcode Scanner and resets the text in the UI
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Scenario1::ScenarioEndScanButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
ResetTheScenarioState();
}
/// <summary>
/// Reset the Scenario state
/// </summary>
void Scenario1::ResetTheScenarioState()
{
if (claimedScanner != nullptr)
{
// Detach the event handlers
claimedScanner->DataReceived::remove(dataReceivedToken);
claimedScanner->ReleaseDeviceRequested::remove(releaseDeviceRequestedToken);
// release the Barcode Scanner and set to null
delete claimedScanner;
claimedScanner = nullptr;
}
if (scanner != nullptr)
{
delete scanner;
scanner = nullptr;
}
// Reset the strings in the UI
UpdateOutput("Click the Start Scanning Button.");
ScenarioOutputScanData->Text = "No data";
ScenarioOutputScanDataLabel->Text = "No data";
ScenarioOutputScanDataType->Text = "No data";
// reset the button state
ScenarioEndScanButton->IsEnabled = false;
ScenarioStartScanButton->IsEnabled = true;
}